Bleak Faith: Forsaken Wiki
bleakfaith_en
https://bleakfaith.wiki.gg/
MediaWiki 1.43.3
first-letter
Media
Special
Talk
User
User talk
Meta
Meta talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Module
Module talk
Map
Map talk
Template:Error
10
335
437
2013-10-29T00:20:58Z
wikipedia>Mr. Stradivarius
0
Protected Template:Error: [[WP:High-risk templates|Highly visible template]]: 32,000 transclusions ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
wikitext
text/x-wiki
{{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}<noinclude>
{{documentation}}
</noinclude>
5da54c14258c1b1755a03bccb88dc5d9d0cefb56
Module:Namespace detect
828
329
425
2014-04-05T17:01:23Z
wikipedia>Mr. Stradivarius
0
use demopage instead of page as the main "page" parameter
Scribunto
text/plain
--[[
--------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a --
-- few improvements: all namespaces and all namespace aliases are supported, --
-- and namespace names are detected automatically for the local wiki. The --
-- module can also use the corresponding subject namespace value if it is --
-- used on a talk page. Parameter names can be configured for different wikis --
-- by altering the values in the "cfg" table in --
-- Module:Namespace detect/config. --
-- --
--------------------------------------------------------------------------------
--]]
local data = mw.loadData('Module:Namespace detect/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings
local yesno = require('Module:Yesno')
local mArguments -- Lazily initialise Module:Arguments
local mTableTools -- Lazily initilalise Module:TableTools
local ustringLower = mw.ustring.lower
local p = {}
local function fetchValue(t1, t2)
-- Fetches a value from the table t1 for the first key in array t2 where
-- a non-nil value of t1 exists.
for i, key in ipairs(t2) do
local value = t1[key]
if value ~= nil then
return value
end
end
return nil
end
local function equalsArrayValue(t, value)
-- Returns true if value equals a value in the array t. Otherwise
-- returns false.
for i, arrayValue in ipairs(t) do
if value == arrayValue then
return true
end
end
return false
end
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case of
-- errors, e.g. being over the expensive function count limit.
if page then
local success, pageObject = pcall(mw.title.new, page)
if success then
return pageObject
else
return nil
end
else
return mw.title.getCurrentTitle()
end
end
-- Provided for backward compatibility with other modules
function p.getParamMappings()
return mappings
end
local function getNamespace(args)
-- This function gets the namespace name from the page object.
local page = fetchValue(args, argKeys.demopage)
if page == '' then
page = nil
end
local demospace = fetchValue(args, argKeys.demospace)
if demospace == '' then
demospace = nil
end
local subjectns = fetchValue(args, argKeys.subjectns)
local ret
if demospace then
-- Handle "demospace = main" properly.
if equalsArrayValue(argKeys.main, ustringLower(demospace)) then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- Get the subject namespace if the option is set,
-- otherwise use "talk".
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = 'talk'
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
ret = ret:gsub('_', ' ')
return ustringLower(ret)
end
function p._main(args)
-- Check the parameters stored in the mappings table for any matches.
local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys
local params = mappings[namespace] or {}
local ret = fetchValue(args, params)
--[[
-- If there were no matches, return parameters for other namespaces.
-- This happens if there was no text specified for the namespace that
-- was detected or if the demospace parameter is not a valid
-- namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
--]]
if ret == nil then
ret = fetchValue(args, argKeys.other)
end
return ret
end
function p.main(frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {removeBlanks = false})
local ret = p._main(args)
return ret or ''
end
function p.table(frame)
--[[
-- Create a wikitable of all subject namespace parameters, for
-- documentation purposes. The talk parameter is optional, in case it
-- needs to be excluded in the documentation.
--]]
-- Load modules and initialise variables.
mTableTools = require('Module:TableTools')
local namespaces = mw.site.namespaces
local cfg = data.cfg
local useTalk = type(frame) == 'table'
and type(frame.args) == 'table'
and yesno(frame.args.talk) -- Whether to use the talk parameter.
-- Get the header names.
local function checkValue(value, default)
if type(value) == 'string' then
return value
else
return default
end
end
local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace')
local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases')
-- Put the namespaces in order.
local mappingsOrdered = {}
for nsname, params in pairs(mappings) do
if useTalk or nsname ~= 'talk' then
local nsid = namespaces[nsname].id
-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.
nsid = nsid + 1
mappingsOrdered[nsid] = params
end
end
mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)
-- Build the table.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. nsHeader
.. '\n! ' .. aliasesHeader
for i, params in ipairs(mappingsOrdered) do
for j, param in ipairs(params) do
if j == 1 then
ret = ret .. '\n|-'
.. '\n| <code>' .. param .. '</code>'
.. '\n| '
elseif j == 2 then
ret = ret .. '<code>' .. param .. '</code>'
else
ret = ret .. ', <code>' .. param .. '</code>'
end
end
end
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
a4757000273064f151f0f22dc0e139092e5ff443
Module:Error
828
334
435
2016-11-21T11:11:11Z
wikipedia>Materialscientist
0
Changed protection level for "[[Module:Error]]": [[WP:High-risk templates|Highly visible template]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
Scribunto
text/plain
-- This module implements {{error}}.
local p = {}
local function _error(args)
local tag = mw.ustring.lower(tostring(args.tag))
-- Work out what html tag we should use.
if not (tag == 'p' or tag == 'span' or tag == 'div') then
tag = 'strong'
end
-- Generate the html.
return tostring(mw.html.create(tag)
:addClass('error')
:wikitext(tostring(args.message or args[1] or error('no message specified', 2)))
)
end
function p.error(frame)
local args
if type(frame.args) == 'table' then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
args = frame.args
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
end
-- if the message parameter is present but blank, change it to nil so that Lua will
-- consider it false.
if args.message == "" then
args.message = nil
end
return _error(args)
end
return p
f77bd720c216b5626efe795d3b49462d50971f7d
Module:Namespace detect/config
828
330
427
2020-04-01T06:12:44Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0e4ff08d13c4b664d66b32c232deb129b77c1a56
Module:Namespace detect/data
828
331
429
2020-04-01T06:12:45Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local defaultKeys = {
'main',
'talk',
'other',
'subjectns',
'demospace',
'demopage'
}
local argKeys = {}
for i, defaultKey in ipairs(defaultKeys) do
argKeys[defaultKey] = {defaultKey}
end
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
d224f42a258bc308ef3ad8cc8686cd7a4f47d005
Module:About
828
339
445
2020-07-14T13:59:23Z
wikipedia>Nihiltres
0
Removed defaultOptions.namespace as redundant, per request on talk by Andrybak
Scribunto
text/plain
local mArguments --initialize lazily
local mHatnote = require('Module:Hatnote')
local mHatList = require('Module:Hatnote list')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
function p.about (frame)
-- A passthrough that gets args from the frame and all
mArguments = require('Module:Arguments')
args = mArguments.getArgs(frame)
return p._about(args)
end
function p._about (args, options)
-- Produces "about" hatnote.
-- Type checks and defaults
checkType('_about', 1, args, 'table', true)
args = args or {}
checkType('_about', 2, options, 'table', true)
options = options or {}
local defaultOptions = {
aboutForm = 'This %s is about %s. ',
PageType = require('Module:Pagetype').main(),
otherText = nil, --included for complete list
sectionString = 'section'
}
for k, v in pairs(defaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Set initial "about" string
local pageType = (args.section and options.sectionString) or options.PageType
local about = ''
if args[1] then
about = string.format(options.aboutForm, pageType, args[1])
end
--Allow passing through certain options
local fsOptions = {
otherText = options.otherText,
extratext = args.text
}
local hnOptions = {
selfref = args.selfref
}
-- Set for-see list
local forSee = mHatList._forSee(args, 2, fsOptions)
-- Concatenate and return
return mHatnote._hatnote(about .. forSee, hnOptions)
end
return p
1abb25315b25b63b97d98ecae17733cbea8fcc6a
Module:Convert/wikidata
828
723
1109
2021-05-06T05:08:27Z
wikipedia>Johnuniq
0
update from sandbox per [[Template talk:Convert#Module version 25]]
Scribunto
text/plain
-- Functions to access Wikidata for Module:Convert.
local Collection = {}
Collection.__index = Collection
do
function Collection:add(item)
if item ~= nil then
self.n = self.n + 1
self[self.n] = item
end
end
function Collection:join(sep)
return table.concat(self, sep)
end
function Collection:remove(pos)
if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then
self.n = self.n - 1
return table.remove(self, pos)
end
end
function Collection:sort(comp)
table.sort(self, comp)
end
function Collection.new()
return setmetatable({n = 0}, Collection)
end
end
local function strip_to_nil(text)
-- If text is a non-empty string, return its trimmed content,
-- otherwise return nothing (empty string or not a string).
if type(text) == 'string' then
return text:match('(%S.-)%s*$')
end
end
local function frequency_unit(value, unit_table)
-- For use when converting m to Hz.
-- Return true, s where s = name of unit's default output unit,
-- or return false, t where t is an error message table.
-- However, for simplicity a valid result is always returned.
local unit
if unit_table._symbol == 'm' then
-- c = speed of light in a vacuum = 299792458 m/s
-- frequency = c / wavelength
local w = value * (unit_table.scale or 1)
local f = 299792458 / w -- if w == 0, f = math.huge which works here
if f >= 1e12 then
unit = 'THz'
elseif f >= 1e9 then
unit = 'GHz'
elseif f >= 1e6 then
unit = 'MHz'
elseif f >= 1e3 then
unit = 'kHz'
else
unit = 'Hz'
end
end
return true, unit or 'Hz'
end
local function wavelength_unit(value, unit_table)
-- Like frequency_unit but for use when converting Hz to m.
local unit
if unit_table._symbol == 'Hz' then
-- Using 0.9993 rather than 1 avoids rounding which would give results
-- like converting 300 MHz to 100 cm instead of 1 m.
local w = 1 / (value * (unit_table.scale or 1)) -- Hz scale is inverted
if w >= 0.9993e6 then
unit = 'Mm'
elseif w >= 0.9993e3 then
unit = 'km'
elseif w >= 0.9993 then
unit = 'm'
elseif w >= 0.9993e-2 then
unit = 'cm'
elseif w >= 0.9993e-3 then
unit = 'mm'
else
unit = 'um'
end
end
return true, unit or 'm'
end
local specials = {
frequency = { frequency_unit },
wavelength = { wavelength_unit },
--------------------------------------------------------------------------------
-- Following is a removed experiment to show two values as a range
-- using '-' as the separator.
-- frequencyrange = { frequency_unit, '-' },
-- wavelengthrange = { wavelength_unit, '-' },
}
local function make_unit(units, parms, uid)
-- Return a unit code for convert or nil if unit unknown.
-- If necessary, add a dummy unit to parms so convert will use it
-- for the input without attempting a conversion since nothing
-- useful is available (for example, with unit volt).
local unit = units[uid]
if type(unit) ~= 'table' then
return nil
end
local ucode = unit.ucode
if ucode and not unit.si then
return ucode -- a unit known to convert
end
parms.opt_ignore_error = true
ucode = ucode or unit._ucode -- must be a non-empty string
local ukey, utable
if unit.si then
local base = units[unit.si]
ukey = base.symbol -- must be a non-empty string
local n1 = base.name1
local n2 = base.name2
if not n1 then
n1 = ukey
n2 = n2 or n1 -- do not append 's'
end
utable = {
_symbol = ukey,
_name1 = n1,
_name2 = n2,
link = unit.link or base.link,
utype = n1,
prefixes = 1,
}
else
ukey = ucode
utable = {
symbol = ucode, -- must be a non-empty string
name1 = unit.name1, -- if nil, uses symbol
name2 = unit.name2, -- if nil, uses name1..'s'
link = unit.link, -- if nil, uses name1
utype = unit.name1 or ucode,
}
end
utable.scale = 1
utable.default = ''
utable.defkey = ''
utable.linkey = ''
utable.bad_mcode = ''
parms.unittable = { [ukey] = utable }
return ucode
end
local function matches_qualifier(statement, qual)
-- Return:
-- false, nil : if statement does not match specification
-- true, nil : if matches, and statement has no qualifier
-- true, sq : if matches, where sq is the statement's qualifier
-- A match means that no qualifier was specified (qual == nil), or that
-- the statement has a qualifier matching the specification.
-- If a match occurs, the caller needs the statement's qualifier (if any)
-- so statements that duplicate the qualifier are not used, after the first.
-- Then, if convert is showing all values for a property such as the diameter
-- of a telescope's mirror (diameters of primary and secondary mirrors), it
-- will not show alternative values that could in principle be present for the
-- same item (telescope) and property (diameter) and qualifier (primary/secondary).
local target = (statement.qualifiers or {}).P518 -- P518 is "applies to part"
if type(target) == 'table' then
for _, q in ipairs(target) do
if type(q) == 'table' then
local value = (q.datavalue or {}).value
if value then
if qual == nil or qual == value.id then
return true, value.id
end
end
end
end
end
if qual == nil then
return true, nil -- only occurs if statement has no qualifier
end
return false, nil -- statement's qualifier is not relevant because statement will be skipped
end
local function get_statements(parms, pid)
-- Get specified item and return a list of tables with each statement for property pid.
-- Each table is of form {statqual=sq, stmt=statement} where sq = statement qualifier (nil if none).
-- Statements are in Wikidata's order except that those with preferred rank
-- are first, then normal rank. Any other rank is ignored.
local stored = {} -- qualifiers of statements that are first for the qualifier, and will be returned
local qid = strip_to_nil(parms.qid) -- nil for current page's item, or an item id (expensive)
local qual = strip_to_nil(parms.qual) -- nil or id of wanted P518 (applies to part) item in qualifiers
local result = Collection.new()
local entity = mw.wikibase.getEntity(qid)
if type(entity) == 'table' then
local statements = (entity.claims or {})[pid]
if type(statements) == 'table' then
for _, rank in ipairs({ 'preferred', 'normal' }) do
for _, statement in ipairs(statements) do
if type(statement) == 'table' and rank == statement.rank then
local is_match, statqual = matches_qualifier(statement, qual)
if is_match then
result:add({ statqual = statqual, stmt = statement })
end
end
end
end
end
end
return result
end
local function input_from_property(tdata, parms, pid)
-- Given that pid is a Wikidata property identifier like 'P123',
-- return a collection of {amount, ucode} pairs (two strings)
-- for each matching item/property, or return nothing.
--------------------------------------------------------------------------------
-- There appear to be few restrictions on how Wikidata is organized so it is
-- very likely that any decision a module makes about how to handle data
-- will be wrong for some cases at some time. This meets current requirements.
-- For each qualifier (or if no qualifier), if there are any preferred
-- statements, use them and ignore any normal statements.
-- For each qualifier, for the preferred statements if any, or for
-- the normal statements (but not both):
-- * Accept each statement if it has no qualifier (this will not occur
-- if qual=x is specified because other code already ensures that in that
-- case, only statements with a qualifier matching x are considered).
-- * Ignore any statements after the first if it has a qualifier.
-- The rationale is that for the diameter at [[South Pole Telescope]], want
-- convert to show the diameters for both the primary and secondary mirrors
-- if the convert does not specify which diameter is wanted.
-- However, if convert is given the wanted qualifier, only one value
-- (_the_ diameter) is wanted. For simplicity/consistency, that is also done
-- even if no qual=x is specified. Unclear what should happen.
-- For the wavelength at [[Nançay Radio Telescope]], want to show all three
-- values, and the values have no qualifiers.
--------------------------------------------------------------------------------
local result = Collection.new()
local done = {}
local skip_normal
for _, t in ipairs(get_statements(parms, pid)) do
local statement = t.stmt
if statement.mainsnak and statement.mainsnak.datatype == 'quantity' then
local value = (statement.mainsnak.datavalue or {}).value
if value then
local amount = value.amount
if amount then
amount = tostring(amount) -- in case amount is ever a number
if amount:sub(1, 1) == '+' then
amount = amount:sub(2)
end
local unit = value.unit
if type(unit) == 'string' then
unit = unit:match('Q%d+$') -- unit item id is at end of URL
local ucode = make_unit(tdata.wikidata_units, parms, unit)
if ucode then
local skip
if t.statqual then
if done[t.statqual] then
skip = true
else
done[t.statqual] = true
end
else
if statement.rank == 'preferred' then
skip_normal = true
elseif skip_normal then
skip = true
end
end
if not skip then
result:add({ amount, ucode })
end
end
end
end
end
end
end
return result
end
local function input_from_text(tdata, parms, text, insert2)
-- Given string should be of form "<value><space><unit>" or
-- "<value1><space>ft<space><value2><space>in" for a special case (feet and inches).
-- Return true if values/units were extracted and inserted, or return nothing.
text = text:gsub(' ', ' '):gsub('%s+', ' ')
local pos = text:find(' ', 1, true)
if pos then
-- Leave checking of value to convert which can handle fractions.
local value = text:sub(1, pos - 1)
local uid = text:sub(pos + 1)
if uid:sub(1, 3) == 'ft ' and uid:sub(-3) == ' in' then
-- Special case for enwiki to allow {{convert|input=5 ft 10+1/2 in}}
insert2(uid:sub(4, -4), 'in')
insert2(value, 'ft')
else
insert2(value, make_unit(tdata.wikidata_units, parms, uid) or uid)
end
return true
end
end
local function adjustparameters(tdata, parms, index)
-- For Module:Convert, adjust parms (a table of {{convert}} parameters).
-- Return true if successful or return false, t where t is an error message table.
-- This is intended mainly for use in infoboxes where the input might be
-- <value><space><unit> or
-- <wikidata-property-id>
-- If successful, insert values and units in parms, before given index.
local text = parms.input -- should be a trimmed, non-empty string
local pid = text:match('^P%d+$')
local sep = ','
local special = specials[parms[index]]
if special then
parms.out_unit = special[1]
sep = special[2] or sep
table.remove(parms, index)
end
local function quit()
return false, pid and { 'cvt_no_output' } or { 'cvt_bad_input', text }
end
local function insert2(first, second)
table.insert(parms, index, second)
table.insert(parms, index, first)
end
if pid then
parms.input_text = '' -- output an empty string if an error occurs
local result = input_from_property(tdata, parms, pid)
if result.n == 0 then
return quit()
end
local ucode
for i, t in ipairs(result) do
-- Convert requires each input unit to be identical.
if i == 1 then
ucode = t[2]
elseif ucode ~= t[2] then
return quit()
end
end
local item = ucode
if item == parms[index] then
-- Remove specified output unit if it is the same as the Wikidata unit.
-- For example, {{convert|input=P2044|km}} with property "12 km".
table.remove(parms, index)
end
for i = result.n, 1, -1 do
insert2(result[i][1], item)
item = sep
end
return true
else
if input_from_text(tdata, parms, text, insert2) then
return true
end
end
return quit()
end
--------------------------------------------------------------------------------
--- List units and check syntax of definitions ---------------------------------
--------------------------------------------------------------------------------
local specifications = {
-- seq = sequence in which fields are displayed
base = {
title = 'SI base units',
fields = {
symbol = { seq = 2, mandatory = true },
name1 = { seq = 3, mandatory = true },
name2 = { seq = 4 },
link = { seq = 5 },
},
noteseq = 6,
header = '{| class="wikitable"\n!si !!symbol !!name1 !!name2 !!link !!note',
item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s',
footer = '|}',
},
alias = {
title = 'Aliases for convert',
fields = {
ucode = { seq = 2, mandatory = true },
si = { seq = 3 },
},
noteseq = 4,
header = '{| class="wikitable"\n!alias !!ucode !!base !!note',
item = '|-\n|%s ||%s ||%s ||%s',
footer = '|}',
},
known = {
title = 'Units known to convert',
fields = {
ucode = { seq = 2, mandatory = true },
label = { seq = 3, mandatory = true },
},
noteseq = 4,
header = '{| class="wikitable"\n!qid !!ucode !!label !!note',
item = '|-\n|%s ||%s ||%s ||%s',
footer = '|}',
},
unknown = {
title = 'Units not known to convert',
fields = {
_ucode = { seq = 2, mandatory = true },
si = { seq = 3 },
name1 = { seq = 4 },
name2 = { seq = 5 },
link = { seq = 6 },
label = { seq = 7, mandatory = true },
},
noteseq = 8,
header = '{| class="wikitable"\n!qid !!_ucode !!base !!name1 !!name2 !!link !!label !!note',
item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s ||%s ||%s',
footer = '|}',
},
}
local function listunits(tdata, ulookup)
-- For Module:Convert, make wikitext to list the built-in Wikidata units.
-- Return true, wikitext if successful or return false, t where t is an
-- error message table. Currently, an error return never occurs.
-- The syntax of each unit definition is checked and a note is added if
-- a problem is detected.
local function safe_cells(t)
-- This is not currently needed, but in case definitions ever use wikitext
-- like '[[kilogram|kg]]', escape the text so it works in a table cell.
local result = {}
for i, v in ipairs(t) do
if v:find('|', 1, true) then
v = v:gsub('(%[%[[^%[%]]-)|(.-%]%])', '%1\0%2') -- replace pipe in piped link with a zero byte
v = v:gsub('|', '|') -- escape '|'
v = v:gsub('%z', '|') -- restore pipe in piped link
end
result[i] = v:gsub('{', '{') -- escape '{'
end
return unpack(result)
end
local wdunits = tdata.wikidata_units
local speckeys = { 'base', 'alias', 'unknown', 'known' }
for _, sid in ipairs(speckeys) do
specifications[sid].units = Collection.new()
end
local keys = Collection.new()
for k, v in pairs(wdunits) do
keys:add(k)
end
table.sort(keys)
local note_count = 0
for _, key in ipairs(keys) do
local unit = wdunits[key]
local ktext, sid
if key:match('^Q%d+$') then
ktext = '[[d:' .. key .. '|' .. key .. ']]'
if unit.ucode then
sid = 'known'
else
sid = 'unknown'
end
elseif unit.ucode then
ktext = key
sid = 'alias'
else
ktext = key
sid = 'base'
end
local result = { ktext }
local spec = specifications[sid]
local fields = spec.fields
local note = Collection.new()
for k, v in pairs(unit) do
if fields[k] then
local seq = fields[k].seq
if result[seq] then
note:add('duplicate ' .. k) -- cannot happen since keys are unique
else
result[seq] = v
end
else
note:add('invalid ' .. k)
end
end
for k, v in pairs(fields) do
local value = result[v.seq]
if value then
if k == 'si' and not wdunits[value] then
note:add('need si ' .. value)
end
if k == 'label' then
local wdl = mw.wikibase.getLabel(key)
if wdl ~= value then
note:add('label changed to ' .. tostring(wdl))
end
end
else
result[v.seq] = ''
if v.mandatory then
note:add('missing ' .. k)
end
end
end
local text
if note.n > 0 then
note_count = note_count + 1
text = '*' .. note:join('<br />')
end
result[spec.noteseq] = text or ''
spec.units:add(result)
end
local results = Collection.new()
if note_count > 0 then
local text = note_count .. (note_count == 1 and ' note' or ' notes')
results:add("'''Search for * to see " .. text .. "'''\n")
end
for _, sid in ipairs(speckeys) do
local spec = specifications[sid]
results:add("'''" .. spec.title .. "'''")
results:add(spec.header)
local fmt = spec.item
for _, unit in ipairs(spec.units) do
results:add(string.format(fmt, safe_cells(unit)))
end
results:add(spec.footer)
end
return true, results:join('\n')
end
return { _adjustparameters = adjustparameters, _listunits = listunits }
b93954acaa7b2c734c1c6f4c869ed6d1821a2d84
Module:Convert/wikidata/data
828
724
1111
2021-06-06T03:21:16Z
wikipedia>Johnuniq
0
update from sandbox per [[Template talk:Convert#Module version 26]]
Scribunto
text/plain
--[[ Cache of Wikidata information with units for Module:Convert.
The codes should rarely change, and using a cache means that changing a
unit at Wikidata will not cause lots of converts in articles to break.
For a unit known to convert, the unit here must have:
label = Wikidata label for unit (used only when listing units)
ucode = unit code for input to convert
(there are no optional fields because convert handles everything)
For a unit not known to convert, the unit here must have:
label = Wikidata label for unit (used only when listing units)
(no ucode field)
_ucode = unit code for input to convert, and the
symbol used to display the unit when abbr=on
(convert will use the specified fields to display the unit,
and will not attempt to do a conversion)
For a unit not known to convert, the unit here may have:
name1 = singular name used to display the unit when abbr=off
name2 = plural name used to display the unit when abbr=off
link = name of article that unit will be linked to when lk=on
si = key for the SI base unit, if any
The base unit for each SI unit here must have:
symbol = symbol used to display the base unit when abbr=on
name1 = singular name of base unit used to display the unit when abbr=off
(if name1 is not given, symbol will be used, but an SI unit should have a name)
The base unit for each SI unit here may have:
name2 = plural name of base unit used to display the unit when abbr=off
link = name of article that unit will be linked to when lk=on
(applies for all SI units using this base, where the
SI unit does not define its own link field)
If name1 is not specified, the symbol is used for the name.
If name2 is not specified, a plural name is formed by appending 's' to name1.
If link is not specified, name1 is used for the link.
SI units are assumed to be simple items like V (volt) where 'mV' would
cause convert to insert:
'm' before the base symbol 'V' to make 'mV', if abbr=on
'milli' before the base name 'volt' to make 'millivolt', if abbr=off
A unit like "square meter" would not work because it needs an SI prefix
inserted before "meter" rather than at the beginning of the name.
Items that should not be used with convert as no precise unit is implied:
Q11247037 ton generic (cannot use)
Q178413 gallon generic
Q130964 calorie dubious (ambiguous, should not use)
Q216658 bushel dubious
Q420266 fluid ounce dubious
]]
local wikidata_units = {
-- Following are SI base units.
A = {
symbol = 'A',
name1 = 'ampere',
},
F = {
symbol = 'F',
name1 = 'faraday',
},
H = {
symbol = 'H',
name1 = 'henry',
},
V = {
symbol = 'V',
name1 = 'volt',
},
-- Following are aliases to convert unit codes, used with "input=<value><space><unit>".
kilograms = {
ucode = 'kg',
},
-- Following are SI units not known to convert, used with "input=<value><space><unit>".
kV = {
ucode = 'kV',
si = 'V',
},
mV = {
ucode = 'mV',
si = 'V',
},
-- Following are Wikidata units.
Q131255 = {
label = 'farad',
_ucode = 'F',
si = 'F',
},
Q163354 = {
label = 'henry',
_ucode = 'H',
si = 'H',
},
Q1916026 = {
label = 'microvolt',
_ucode = 'uV',
si = 'V',
},
Q193933 = {
label = 'dioptre',
name1 = 'dioptre',
_ucode = 'dpt',
},
Q212120 = {
label = 'ampere hour',
name1 = 'ampere hour',
_ucode = 'A⋅h',
},
Q2448803 = {
label = 'millivolt',
_ucode = 'mV',
si = 'V',
},
Q2451296 = {
label = 'microfarad',
_ucode = 'uF',
si = 'F',
},
Q2490574 = {
label = 'milliampere',
_ucode = 'mA',
si = 'A',
},
Q25250 = {
label = 'volt',
_ucode = 'V',
si = 'V',
},
Q25272 = {
label = 'ampere',
_ucode = 'A',
si = 'A',
},
Q2553708 = {
label = 'megavolt',
_ucode = 'MV',
si = 'V',
},
Q2554092 = {
label = 'kilovolt',
_ucode = 'kV',
si = 'V',
},
Q2636421 = {
label = 'nanohenry',
_ucode = 'nH',
si = 'H',
},
Q2679083 = {
label = 'microhenry',
_ucode = 'uH',
si = 'H',
},
Q2682463 = {
label = 'nanofarad',
_ucode = 'nF',
si = 'F',
},
Q2756030 = {
label = 'picofarad',
_ucode = 'pF',
si = 'F',
},
Q2793566 = {
label = 'gigavolt',
_ucode = 'GV',
si = 'V',
},
Q2924137 = {
label = 'millihenry',
_ucode = 'mH',
si = 'H',
},
Q3117809 = {
label = 'microampere',
_ucode = 'uA',
si = 'A',
},
Q33680 = {
label = 'radian',
name1 = 'radian',
_ucode = 'rad',
},
Q4456994 = {
label = 'millifarad',
_ucode = 'mF',
si = 'F',
},
Q47083 = {
label = 'ohm',
name1 = 'ohm',
_ucode = 'Ω',
},
Q483261 = {
label = 'dalton',
name1 = 'dalton',
_ucode = 'u',
},
Q550341 = {
label = 'volt-ampere',
name1 = 'volt-ampere',
_ucode = 'VA',
},
Q100995 = {
label = 'pound',
ucode = 'lb',
},
Q1022113 = {
label = 'cubic centimetre',
ucode = 'cc',
},
Q102573 = {
label = 'becquerel',
ucode = 'Bq',
},
Q103246 = {
label = 'sievert',
ucode = 'Sv',
},
Q1050958 = {
label = 'inch of mercury',
ucode = 'inHg',
},
Q1051665 = {
label = 'metre per second squared',
ucode = 'm/s2',
},
Q1052397 = {
label = 'rad',
ucode = 'rad',
},
Q1054140 = {
label = 'megametre',
ucode = 'Mm',
},
Q1057069 = {
label = 'hectogram',
ucode = 'hg',
},
Q1063786 = {
label = 'square inch',
ucode = 'sqin',
},
Q1092296 = {
label = 'annum',
ucode = 'year',
},
Q11570 = {
label = 'kilogram',
ucode = 'kg',
},
Q11573 = {
label = 'metre',
ucode = 'm',
},
Q11574 = {
label = 'second',
ucode = 's',
},
Q11579 = {
label = 'kelvin',
ucode = 'K',
},
Q11582 = {
label = 'litre',
ucode = 'litre',
},
Q1165588 = {
label = 'rod',
ucode = 'rod',
},
Q1165799 = {
label = 'thou',
ucode = 'thou',
},
Q11776930 = {
label = 'megagram',
ucode = 'Mg',
},
Q11929860 = {
label = 'kiloparsec',
ucode = 'kpc',
},
Q1194225 = {
label = 'pound-force',
ucode = 'lbf',
},
Q12129 = {
label = 'parsec',
ucode = 'pc',
},
Q12438 = {
label = 'newton',
ucode = 'N',
},
Q1255620 = {
label = 'dram',
ucode = 'drachm',
},
Q12874593 = {
label = 'watt-hour',
ucode = 'W.h',
},
Q128822 = {
label = 'knot',
ucode = 'kn',
},
Q1374438 = {
label = 'kilosecond',
ucode = 'ks',
},
Q1377051 = {
label = 'gigasecond',
ucode = 'Gs',
},
Q14754979 = {
label = 'zettagram',
ucode = 'Zg',
},
Q14786969 = {
label = 'megajoule',
ucode = 'MJ',
},
Q14787261 = {
label = 'megawatt hour',
ucode = 'MW.h',
},
Q1550511 = {
label = 'square yard',
ucode = 'sqyd',
},
Q160857 = {
label = 'metric horsepower',
ucode = 'hp',
},
Q1628990 = {
label = 'horsepower-hour',
ucode = 'hph',
},
Q163343 = {
label = 'tesla',
ucode = 'T',
},
Q1645498 = {
label = 'microgram',
ucode = 'ug',
},
Q17087835 = {
label = 'cuerda',
ucode = 'cda',
},
Q174728 = {
label = 'centimetre',
ucode = 'cm',
},
Q174789 = {
label = 'millimetre',
ucode = 'mm',
},
Q175821 = {
label = 'micrometre',
ucode = 'um',
},
Q1770733 = {
label = 'teragram',
ucode = 'Tg',
},
Q1772386 = {
label = 'decigram',
ucode = 'dg',
},
Q177493 = {
label = 'gauss',
ucode = 'G',
},
Q1777507 = {
label = 'femtosecond',
ucode = 'fs',
},
Q177974 = {
label = 'standard atmosphere',
ucode = 'atm',
},
Q178674 = {
label = 'nanometre',
ucode = 'nm',
},
Q180154 = {
label = 'kilometre per hour',
ucode = 'km/h',
},
Q180892 = {
label = 'solar mass',
ucode = 'solar mass',
},
Q1811 = {
label = 'astronomical unit',
ucode = 'au',
},
Q1815100 = {
label = 'centilitre',
ucode = 'cl',
},
Q182098 = {
label = 'kilowatt hour',
ucode = 'kW.h',
},
Q1823150 = {
label = 'microwatt',
ucode = 'uW',
},
Q182429 = {
label = 'metre per second',
ucode = 'm/s',
},
Q1826195 = {
label = 'decilitre',
ucode = 'dl',
},
Q185078 = {
label = 'are',
ucode = 'a',
},
Q185153 = {
label = 'erg',
ucode = 'erg',
},
Q185648 = {
label = 'torr',
ucode = 'Torr',
},
Q190095 = {
label = 'gray',
ucode = 'Gy',
},
Q191118 = {
label = 'tonne',
ucode = 'tonne',
},
Q1913097 = {
label = 'femtogram',
ucode = 'fg',
},
Q192274 = {
label = 'picometre',
ucode = 'pm',
},
Q1972579 = {
label = 'poundal',
ucode = 'pdl',
},
Q200323 = {
label = 'decimetre',
ucode = 'dm',
},
Q201933 = {
label = 'dyne',
ucode = 'dyn',
},
Q2029519 = {
label = 'hectolitre',
ucode = 'hl',
},
Q2051195 = {
label = 'gigawatt hour',
ucode = 'GW.h',
},
Q207488 = {
label = 'Rankine scale',
ucode = 'R',
},
Q208788 = {
label = 'femtometre',
ucode = 'fm',
},
Q2101 = {
label = 'elementary charge',
ucode = 'e',
},
Q21014455 = {
label = 'metre per minute',
ucode = 'm/min',
},
Q21062777 = {
label = 'megapascal',
ucode = 'MPa',
},
Q21064807 = {
label = 'kilopascal',
ucode = 'kPa',
},
Q211256 = {
label = 'mile per hour',
ucode = 'mph',
},
Q21178489 = {
label = 'barrels per day',
ucode = 'oilbbl/d',
},
Q2143992 = {
label = 'kilohertz',
ucode = 'kHz',
},
Q21467992 = {
label = 'cubic foot per second',
ucode = 'cuft/s',
},
Q215571 = {
label = 'newton metre',
ucode = 'Nm',
},
Q216795 = {
label = 'dunam',
ucode = 'dunam',
},
Q216880 = {
label = 'kilogram-force',
ucode = 'kgf',
},
Q18413919 = {
label = 'centimetre per second',
ucode = 'cm/s',
},
Q218593 = {
label = 'inch',
ucode = 'in',
},
Q2282891 = {
label = 'microlitre',
ucode = 'ul',
},
Q2282906 = {
label = 'nanogram',
ucode = 'ng',
},
Q229354 = {
label = 'curie',
ucode = 'Ci',
},
Q232291 = {
label = 'square mile',
ucode = 'sqmi',
},
Q2332346 = {
label = 'millilitre',
ucode = 'ml',
},
Q23387 = {
label = 'week',
ucode = 'week',
},
Q23823681 = {
label = 'terawatt',
ucode = 'TW',
},
Q23925410 = {
label = 'gallon (UK)',
ucode = 'impgal',
},
Q23925413 = {
label = 'gallon (US)',
ucode = 'USgal',
},
Q2438073 = {
label = 'attogram',
ucode = 'ag',
},
Q2474258 = {
label = 'millisievert',
ucode = 'mSv',
},
Q2483628 = {
label = 'attosecond',
ucode = 'as',
},
Q2489298 = {
label = 'square centimetre',
ucode = 'cm2',
},
Q2518569 = {
label = 'nanosievert',
ucode = 'nSv',
},
Q25235 = {
label = 'hour',
ucode = 'h',
},
Q25236 = {
label = 'watt',
ucode = 'W',
},
Q25267 = {
label = 'degree Celsius',
ucode = 'C',
},
Q25269 = {
label = 'joule',
ucode = 'J',
},
Q253276 = {
label = 'mile',
ucode = 'mi',
},
Q25343 = {
label = 'square metre',
ucode = 'm2',
},
Q25406 = {
label = 'coulomb',
ucode = 'coulomb',
},
Q25517 = {
label = 'cubic metre',
ucode = 'm3',
},
Q260126 = {
label = 'Roentgen equivalent man',
ucode = 'rem',
},
Q2612219 = {
label = 'petagram',
ucode = 'Pg',
},
Q2619500 = {
label = 'foe',
ucode = 'foe',
},
Q2637946 = {
label = 'decalitre',
ucode = 'dal',
},
Q2655272 = {
label = 'exagram',
ucode = 'Eg',
},
Q2691798 = {
label = 'centigram',
ucode = 'cg',
},
Q2739114 = {
label = 'microsievert',
ucode = 'uSv',
},
Q2799294 = {
label = 'gigagram',
ucode = 'Gg',
},
Q3013059 = {
label = 'kiloannum',
ucode = 'millennium',
},
Q305896 = {
label = 'dots per inch',
ucode = 'dpi',
},
Q3207456 = {
label = 'milliwatt',
ucode = 'mW',
},
Q3221356 = {
label = 'yoctometre',
ucode = 'ym',
},
Q3239557 = {
label = 'picogram',
ucode = 'pg',
},
Q3241121 = {
label = 'milligram',
ucode = 'mg',
},
Q3267417 = {
label = 'terametre',
ucode = 'Tm',
},
Q3270676 = {
label = 'zeptometre',
ucode = 'zm',
},
Q3276763 = {
label = 'gigahertz',
ucode = 'GHz',
},
Q3277907 = {
label = 'exametre',
ucode = 'Em',
},
Q3277915 = {
label = 'zettametre',
ucode = 'Zm',
},
Q3277919 = {
label = 'petametre',
ucode = 'Pm',
},
Q3312063 = {
label = 'femtolitre',
ucode = 'fl',
},
Q3320608 = {
label = 'kilowatt',
ucode = 'kW',
},
Q3332822 = {
label = 'megaton of TNT',
ucode = 'Mt(TNT)',
},
Q35852 = {
label = 'hectare',
ucode = 'ha',
},
Q3675550 = {
label = 'cubic millimetre',
ucode = 'mm3',
},
Q3710 = {
label = 'foot',
ucode = 'ft',
},
Q3773454 = {
label = 'megaparsec',
ucode = 'Mpc',
},
Q3902688 = {
label = 'picolitre',
ucode = 'pl',
},
Q3902709 = {
label = 'picosecond',
ucode = 'ps',
},
Q39369 = {
label = 'hertz',
ucode = 'Hz',
},
Q3972226 = {
label = 'kilolitre',
ucode = 'kl',
},
Q4068266 = {
label = "apothecaries' drachm",
ucode = 'drachm',
},
Q41803 = {
label = 'gram',
ucode = 'g',
},
Q4220561 = {
label = 'kilometre per second',
ucode = 'km/s',
},
Q42289 = {
label = 'degree Fahrenheit',
ucode = 'F',
},
Q4243638 = {
label = 'cubic kilometre',
ucode = 'km3',
},
Q44395 = {
label = 'pascal',
ucode = 'Pa',
},
Q48013 = {
label = 'ounce',
ucode = 'oz',
},
Q482798 = {
label = 'yard',
ucode = 'yd',
},
Q4989854 = {
label = 'kilojoule',
ucode = 'kJ',
},
Q4992853 = {
label = 'kiloton of TNT',
ucode = 'kt(TNT)',
},
Q5139563 = {
label = 'hectopascal',
ucode = 'hPa',
},
Q5151 = {
label = 'month',
ucode = 'month',
},
Q531 = {
label = 'light-year',
ucode = 'ly',
},
Q5465723 = {
label = 'foot-poundal',
ucode = 'ftpdl',
},
Q573 = {
label = 'day',
ucode = 'd',
},
Q577 = {
label = 'year',
ucode = 'year',
},
Q5879479 = {
label = 'gigawatt',
ucode = 'GW',
},
Q6003257 = {
label = 'attometre',
ucode = 'am',
},
Q613726 = {
label = 'yottagram',
ucode = 'Yg',
},
Q6170164 = {
label = 'yoctogram',
ucode = 'yg',
},
Q667419 = {
label = 'long ton',
ucode = 'LT',
},
Q673166 = {
label = 'gravity of Earth',
ucode = 'g0',
},
Q693944 = {
label = 'grain',
ucode = 'gr',
},
Q6982035 = {
label = 'megawatt',
ucode = 'MW',
},
Q712226 = {
label = 'square kilometre',
ucode = 'km2',
},
Q723733 = {
label = 'millisecond',
ucode = 'ms',
},
Q732454 = {
label = 'megaannum',
ucode = 'Myr',
},
Q732707 = {
label = 'megahertz',
ucode = 'MHz',
},
Q752079 = {
label = 'gross register ton',
ucode = 'grt',
},
Q752197 = {
label = 'kilojoule per mole',
ucode = 'kJ/mol',
},
Q7727 = {
label = 'minute',
ucode = 'min',
},
Q794261 = {
label = 'cubic metre per second',
ucode = 'm3/s',
},
Q809678 = {
label = 'barye',
ucode = 'Ba',
},
Q81292 = {
label = 'acre',
ucode = 'acre',
},
Q81454 = {
label = 'ångström',
ucode = 'angstrom',
},
Q828224 = {
label = 'kilometre',
ucode = 'km',
},
Q83327 = {
label = 'electronvolt',
ucode = 'eV',
},
Q838801 = {
label = 'nanosecond',
ucode = 'ns',
},
Q842015 = {
label = 'microsecond',
ucode = 'us',
},
Q844211 = {
label = 'kilogram per cubic metre',
ucode = 'kg/m3',
},
Q844338 = {
label = 'hectometre',
ucode = 'hm',
},
Q844976 = {
label = 'oersted',
ucode = 'Oe',
},
Q848856 = {
label = 'decametre',
ucode = 'dam',
},
Q854546 = {
label = 'gigametre',
ucode = 'Gm',
},
Q857027 = {
label = 'square foot',
ucode = 'sqft',
},
Q9048643 = {
label = 'nanolitre',
ucode = 'nl',
},
Q93318 = {
label = 'nautical mile',
ucode = 'nmi',
},
}
return { wikidata_units = wikidata_units }
780312bf04e64ca1dd5fb2b59dc26b420a30ab56
Template:About
10
311
447
2021-09-16T00:56:50Z
wikipedia>Wbm1058
0
should implement in [[Module:About]]. Piped {{!}} links causing false positives.
wikitext
text/x-wiki
{{#invoke:about|about}}<noinclude>
{{Documentation}}
</noinclude>
34b07e47d9b8220bf56dd9882945ad464b21a731
Module:Unsubst
828
730
1123
2021-10-08T18:22:16Z
wikipedia>Trappist the monk
0
sync from sandbox; see [[Module_talk:Unsubst#template_invocation_name_override|talk]];
Scribunto
text/plain
local checkType = require('libraryUtil').checkType
local p = {}
local BODY_PARAM = '$B'
local specialParams = {
['$params'] = 'parameter list',
['$aliases'] = 'parameter aliases',
['$flags'] = 'flags',
['$B'] = 'template content',
['$template-name'] = 'template invocation name override',
}
function p.main(frame, body)
-- If we are substing, this function returns a template invocation, and if
-- not, it returns the template body. The template body can be specified in
-- the body parameter, or in the template parameter defined in the
-- BODY_PARAM variable. This function can be called from Lua or from
-- #invoke.
-- Return the template body if we aren't substing.
if not mw.isSubsting() then
if body ~= nil then
return body
elseif frame.args[BODY_PARAM] ~= nil then
return frame.args[BODY_PARAM]
else
error(string.format(
"no template content specified (use parameter '%s' from #invoke)",
BODY_PARAM
), 2)
end
end
-- Sanity check for the frame object.
if type(frame) ~= 'table'
or type(frame.getParent) ~= 'function'
or not frame:getParent()
then
error(
"argument #1 to 'main' must be a frame object with a parent " ..
"frame available",
2
)
end
-- Find the invocation name.
local mTemplateInvocation = require('Module:Template invocation')
local name
if frame.args['$template-name'] and '' ~= frame.args['$template-name'] then
name = frame.args['$template-name'] -- override whatever the template name is with this name
else
name = mTemplateInvocation.name(frame:getParent():getTitle())
end
-- Combine passed args with passed defaults
local args = {}
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then
for k, v in pairs( frame:getParent().args ) do
args[k] = v
end
for k, v in pairs( frame.args ) do
if not specialParams[k] then
if v == '__DATE__' then
v = mw.getContentLanguage():formatDate( 'F Y' )
end
args[k] = v
end
end
else
for k, v in pairs( frame.args ) do
if not specialParams[k] then
if v == '__DATE__' then
v = mw.getContentLanguage():formatDate( 'F Y' )
end
args[k] = v
end
end
for k, v in pairs( frame:getParent().args ) do
args[k] = v
end
end
-- Trim parameters, if not specified otherwise
if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then
for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end
end
-- Pull information from parameter aliases
local aliases = {}
if frame.args['$aliases'] then
local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' )
for k, v in ipairs( list ) do
local tmp = mw.text.split( v, '%s*>%s*' )
aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2])
end
end
for k, v in pairs( aliases ) do
if args[k] and ( not args[v] or args[v] == '' ) then
args[v] = args[k]
end
args[k] = nil
end
-- Remove empty parameters, if specified
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then
local tmp = 0
for k, v in ipairs( args ) do
if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then
tmp = k
else
break
end
end
for k, v in pairs( args ) do
if v == '' then
if not (type(k) == 'number' and k < tmp) then args[k] = nil end
end
end
end
-- Order parameters
if frame.args['$params'] then
local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {}
for k, v in ipairs(params) do
v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v
if args[v] then tmp[v], args[v] = args[v], nil end
end
for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end
args = tmp
end
return mTemplateInvocation.invocation(name, args)
end
p[''] = p.main -- For backwards compatibility
return p
7f01ffc8aa2ac4a4772f14c12e0b77e384ecabb6
Module:Format link
828
336
439
2022-10-04T13:37:11Z
wikipedia>Pppery
0
Avoid Lua erroring when we run out of expensive parser function calls
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Format link
--
-- Makes a wikilink from the given link and display values. Links are escaped
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#". Used in
-- the {{format link}} template.
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local mError -- lazily initialise [[Module:Error]]
local yesno -- lazily initialise [[Module:Yesno]]
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
local function maybeItalicize(s, shouldItalicize)
-- Italicize s if s is a string and the shouldItalicize parameter is true.
if s and shouldItalicize then
return '<i>' .. s .. '</i>'
else
return s
end
end
local function parseLink(link)
-- Parse a link and return a table with the link's components.
-- These components are:
-- - link: the link, stripped of any initial colon (always present)
-- - page: the page name (always present)
-- - section: the page name (may be nil)
-- - display: the display text, if manually entered after a pipe (may be nil)
link = removeInitialColon(link)
-- Find whether a faux display value has been added with the {{!}} magic
-- word.
local prePipe, display = link:match('^(.-)|(.*)$')
link = prePipe or link
-- Find the page, if it exists.
-- For links like [[#Bar]], the page will be nil.
local preHash, postHash = link:match('^(.-)#(.*)$')
local page
if not preHash then
-- We have a link like [[Foo]].
page = link
elseif preHash ~= '' then
-- We have a link like [[Foo#Bar]].
page = preHash
end
-- Find the section, if it exists.
local section
if postHash and postHash ~= '' then
section = postHash
end
return {
link = link,
page = page,
section = section,
display = display,
}
end
local function formatDisplay(parsed, options)
-- Formats a display string based on a parsed link table (matching the
-- output of parseLink) and an options table (matching the input options for
-- _formatLink).
local page = maybeItalicize(parsed.page, options.italicizePage)
local section = maybeItalicize(parsed.section, options.italicizeSection)
if (not section) then
return page
elseif (not page) then
return mw.ustring.format('§ %s', section)
else
return mw.ustring.format('%s § %s', page, section)
end
end
local function missingArgError(target)
mError = require('Module:Error')
return mError.error{message =
'Error: no link or target specified! ([[' .. target .. '#Errors|help]])'
}
end
--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------
function p.formatLink(frame)
-- The formatLink export function, for use in templates.
yesno = require('Module:Yesno')
local args = getArgs(frame)
local link = args[1] or args.link
local target = args[3] or args.target
if not (link or target) then
return missingArgError('Template:Format link')
end
return p._formatLink{
link = link,
display = args[2] or args.display,
target = target,
italicizePage = yesno(args.italicizepage),
italicizeSection = yesno(args.italicizesection),
categorizeMissing = args.categorizemissing
}
end
function p._formatLink(options)
-- The formatLink export function, for use in modules.
checkType('_formatLink', 1, options, 'table')
local function check(key, expectedType) --for brevity
checkTypeForNamedArg(
'_formatLink', key, options[key], expectedType or 'string', true
)
end
check('link')
check('display')
check('target')
check('italicizePage', 'boolean')
check('italicizeSection', 'boolean')
check('categorizeMissing')
-- Normalize link and target and check that at least one is present
if options.link == '' then options.link = nil end
if options.target == '' then options.target = nil end
if not (options.link or options.target) then
return missingArgError('Module:Format link')
end
local parsed = parseLink(options.link)
local display = options.display or parsed.display
local catMissing = options.categorizeMissing
local category = ''
-- Find the display text
if not display then display = formatDisplay(parsed, options) end
-- Handle the target option if present
if options.target then
local parsedTarget = parseLink(options.target)
parsed.link = parsedTarget.link
parsed.page = parsedTarget.page
end
-- Test if page exists if a diagnostic category is specified
if catMissing and (mw.ustring.len(catMissing) > 0) then
local title = nil
if parsed.page then title = mw.title.new(parsed.page) end
if title and (not title.isExternal) then
local success, exists = pcall(function() return title.exists end)
if success and not exists then
category = mw.ustring.format('[[Category:%s]]', catMissing)
end
end
end
-- Format the result as a link
if parsed.link == display then
return mw.ustring.format('[[:%s]]%s', parsed.link, category)
else
return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category)
end
end
--------------------------------------------------------------------------------
-- Derived convenience functions
--------------------------------------------------------------------------------
function p.formatPages(options, pages)
-- Formats an array of pages using formatLink and the given options table,
-- and returns it as an array. Nil values are not allowed.
local ret = {}
for i, page in ipairs(pages) do
ret[i] = p._formatLink{
link = page,
categorizeMissing = options.categorizeMissing,
italicizePage = options.italicizePage,
italicizeSection = options.italicizeSection
}
end
return ret
end
return p
1253bdd2683ee4badc33856bfd5499b09a7dca1f
Template:Hlist/styles.css
10
827
1283
2022-12-26T18:00:17Z
wikipedia>Izno
0
actually remove that block, someone can dig for authorship
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
8c9dd9c9c00f30eead17fe10f51d183333e81f33
Module:ConvertNumeric
828
726
1115
2023-02-09T01:04:17Z
wikipedia>Johnuniq
0
please don't use tricky syntax: stick to boring stuff that works
Scribunto
text/plain
-- Module for converting between different representations of numbers. See talk page for user documentation.
-- For unit tests see: [[Module:ConvertNumeric/testcases]]
-- When editing, preview with: [[Module_talk:ConvertNumeric/testcases]]
-- First, edit [[Module:ConvertNumeric/sandbox]], then preview with [[Module_talk:ConvertNumeric/sandbox/testcases]]
require('strict')
local ones_position = {
[0] = 'zero',
[1] = 'one',
[2] = 'two',
[3] = 'three',
[4] = 'four',
[5] = 'five',
[6] = 'six',
[7] = 'seven',
[8] = 'eight',
[9] = 'nine',
[10] = 'ten',
[11] = 'eleven',
[12] = 'twelve',
[13] = 'thirteen',
[14] = 'fourteen',
[15] = 'fifteen',
[16] = 'sixteen',
[17] = 'seventeen',
[18] = 'eighteen',
[19] = 'nineteen'
}
local ones_position_ord = {
[0] = 'zeroth',
[1] = 'first',
[2] = 'second',
[3] = 'third',
[4] = 'fourth',
[5] = 'fifth',
[6] = 'sixth',
[7] = 'seventh',
[8] = 'eighth',
[9] = 'ninth',
[10] = 'tenth',
[11] = 'eleventh',
[12] = 'twelfth',
[13] = 'thirteenth',
[14] = 'fourteenth',
[15] = 'fifteenth',
[16] = 'sixteenth',
[17] = 'seventeenth',
[18] = 'eighteenth',
[19] = 'nineteenth'
}
local ones_position_plural = {
[0] = 'zeros',
[1] = 'ones',
[2] = 'twos',
[3] = 'threes',
[4] = 'fours',
[5] = 'fives',
[6] = 'sixes',
[7] = 'sevens',
[8] = 'eights',
[9] = 'nines',
[10] = 'tens',
[11] = 'elevens',
[12] = 'twelves',
[13] = 'thirteens',
[14] = 'fourteens',
[15] = 'fifteens',
[16] = 'sixteens',
[17] = 'seventeens',
[18] = 'eighteens',
[19] = 'nineteens'
}
local tens_position = {
[2] = 'twenty',
[3] = 'thirty',
[4] = 'forty',
[5] = 'fifty',
[6] = 'sixty',
[7] = 'seventy',
[8] = 'eighty',
[9] = 'ninety'
}
local tens_position_ord = {
[2] = 'twentieth',
[3] = 'thirtieth',
[4] = 'fortieth',
[5] = 'fiftieth',
[6] = 'sixtieth',
[7] = 'seventieth',
[8] = 'eightieth',
[9] = 'ninetieth'
}
local tens_position_plural = {
[2] = 'twenties',
[3] = 'thirties',
[4] = 'forties',
[5] = 'fifties',
[6] = 'sixties',
[7] = 'seventies',
[8] = 'eighties',
[9] = 'nineties'
}
local groups = {
[1] = 'thousand',
[2] = 'million',
[3] = 'billion',
[4] = 'trillion',
[5] = 'quadrillion',
[6] = 'quintillion',
[7] = 'sextillion',
[8] = 'septillion',
[9] = 'octillion',
[10] = 'nonillion',
[11] = 'decillion',
[12] = 'undecillion',
[13] = 'duodecillion',
[14] = 'tredecillion',
[15] = 'quattuordecillion',
[16] = 'quindecillion',
[17] = 'sexdecillion',
[18] = 'septendecillion',
[19] = 'octodecillion',
[20] = 'novemdecillion',
[21] = 'vigintillion',
[22] = 'unvigintillion',
[23] = 'duovigintillion',
[24] = 'tresvigintillion',
[25] = 'quattuorvigintillion',
[26] = 'quinquavigintillion',
[27] = 'sesvigintillion',
[28] = 'septemvigintillion',
[29] = 'octovigintillion',
[30] = 'novemvigintillion',
[31] = 'trigintillion',
[32] = 'untrigintillion',
[33] = 'duotrigintillion',
[34] = 'trestrigintillion',
[35] = 'quattuortrigintillion',
[36] = 'quinquatrigintillion',
[37] = 'sestrigintillion',
[38] = 'septentrigintillion',
[39] = 'octotrigintillion',
[40] = 'noventrigintillion',
[41] = 'quadragintillion',
[51] = 'quinquagintillion',
[61] = 'sexagintillion',
[71] = 'septuagintillion',
[81] = 'octogintillion',
[91] = 'nonagintillion',
[101] = 'centillion',
[102] = 'uncentillion',
[103] = 'duocentillion',
[104] = 'trescentillion',
[111] = 'decicentillion',
[112] = 'undecicentillion',
[121] = 'viginticentillion',
[122] = 'unviginticentillion',
[131] = 'trigintacentillion',
[141] = 'quadragintacentillion',
[151] = 'quinquagintacentillion',
[161] = 'sexagintacentillion',
[171] = 'septuagintacentillion',
[181] = 'octogintacentillion',
[191] = 'nonagintacentillion',
[201] = 'ducentillion',
[301] = 'trecentillion',
[401] = 'quadringentillion',
[501] = 'quingentillion',
[601] = 'sescentillion',
[701] = 'septingentillion',
[801] = 'octingentillion',
[901] = 'nongentillion',
[1001] = 'millinillion',
}
local roman_numerals = {
I = 1,
V = 5,
X = 10,
L = 50,
C = 100,
D = 500,
M = 1000
}
local engord_tens_end = {
['twentieth'] = 20,
['thirtieth'] = 30,
['fortieth'] = 40,
['fiftieth'] = 50,
['sixtieth'] = 60,
['seventieth'] = 70,
['eightieth'] = 80,
['ninetieth'] = 90,
}
local eng_tens_cont = {
['twenty'] = 20,
['thirty'] = 30,
['forty'] = 40,
['fifty'] = 50,
['sixty'] = 60,
['seventy'] = 70,
['eighty'] = 80,
['ninety'] = 90,
}
-- Converts a given valid roman numeral (and some invalid roman numerals) to a number. Returns { -1, errorstring } on error.
local function roman_to_numeral(roman)
if type(roman) ~= "string" then return -1, "roman numeral not a string" end
local rev = roman:reverse()
local raising = true
local last = 0
local result = 0
for i = 1, #rev do
local c = rev:sub(i, i)
local next = roman_numerals[c]
if next == nil then return -1, "roman numeral contains illegal character " .. c end
if next > last then
result = result + next
raising = true
elseif next < last then
result = result - next
raising = false
elseif raising then
result = result + next
else
result = result - next
end
last = next
end
return result
end
-- Converts a given integer between 0 and 100 to English text (e.g. 47 -> forty-seven).
local function numeral_to_english_less_100(num, ordinal, plural, zero)
local terminal_ones, terminal_tens
if ordinal then
terminal_ones = ones_position_ord
terminal_tens = tens_position_ord
elseif plural then
terminal_ones = ones_position_plural
terminal_tens = tens_position_plural
else
terminal_ones = ones_position
terminal_tens = tens_position
end
if num == 0 and zero ~= nil then
return zero
elseif num < 20 then
return terminal_ones[num]
elseif num % 10 == 0 then
return terminal_tens[num / 10]
else
return tens_position[math.floor(num / 10)] .. '-' .. terminal_ones[num % 10]
end
end
local function standard_suffix(ordinal, plural)
if ordinal then return 'th' end
if plural then return 's' end
return ''
end
-- Converts a given integer (in string form) between 0 and 1000 to English text (e.g. 47 -> forty-seven).
local function numeral_to_english_less_1000(num, use_and, ordinal, plural, zero)
num = tonumber(num)
if num < 100 then
return numeral_to_english_less_100(num, ordinal, plural, zero)
elseif num % 100 == 0 then
return ones_position[num/100] .. ' hundred' .. standard_suffix(ordinal, plural)
else
return ones_position[math.floor(num/100)] .. ' hundred ' .. (use_and and 'and ' or '') .. numeral_to_english_less_100(num % 100, ordinal, plural, zero)
end
end
-- Converts an ordinal in English text from 'zeroth' to 'ninety-ninth' inclusive to a number [0–99], else -1.
local function english_to_ordinal(english)
local eng = string.lower(english or '')
local engord_lt20 = {} -- ones_position_ord{} keys & values swapped
for k, v in pairs( ones_position_ord ) do
engord_lt20[v] = k
end
if engord_lt20[eng] then
return engord_lt20[eng] -- e.g. first -> 1
elseif engord_tens_end[eng] then
return engord_tens_end[eng] -- e.g. ninetieth -> 90
else
local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$')
if tens and ones then
local tens_cont = eng_tens_cont[tens]
local ones_end = engord_lt20[ones]
if tens_cont and ones_end then
return tens_cont + ones_end -- e.g. ninety-ninth -> 99
end
end
end
return -1 -- Failed
end
-- Converts a number in English text from 'zero' to 'ninety-nine' inclusive to a number [0–99], else -1.
local function english_to_numeral(english)
local eng = string.lower(english or '')
local eng_lt20 = { ['single'] = 1 } -- ones_position{} keys & values swapped
for k, v in pairs( ones_position ) do
eng_lt20[v] = k
end
if eng_lt20[eng] then
return eng_lt20[eng] -- e.g. one -> 1
elseif eng_tens_cont[eng] then
return eng_tens_cont[eng] -- e.g. ninety -> 90
else
local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$')
if tens and ones then
local tens_cont = eng_tens_cont[tens]
local ones_end = eng_lt20[ones]
if tens_cont and ones_end then
return tens_cont + ones_end -- e.g. ninety-nine -> 99
end
end
end
return -1 -- Failed
end
-- Converts a number expressed as a string in scientific notation to a string in standard decimal notation
-- e.g. 1.23E5 -> 123000, 1.23E-5 = .0000123. Conversion is exact, no rounding is performed.
local function scientific_notation_to_decimal(num)
local exponent, subs = num:gsub("^%-?%d*%.?%d*%-?[Ee]([+%-]?%d+)$", "%1")
if subs == 0 then return num end -- Input not in scientific notation, just return unmodified
exponent = tonumber(exponent)
local negative = num:find("^%-")
local _, decimal_pos = num:find("%.")
-- Mantissa will consist of all decimal digits with no decimal point
local mantissa = num:gsub("^%-?(%d*)%.?(%d*)%-?[Ee][+%-]?%d+$", "%1%2")
if negative and decimal_pos then decimal_pos = decimal_pos - 1 end
if not decimal_pos then decimal_pos = #mantissa + 1 end
-- Remove leading zeros unless decimal point is in first position
while decimal_pos > 1 and mantissa:sub(1,1) == '0' do
mantissa = mantissa:sub(2)
decimal_pos = decimal_pos - 1
end
-- Shift decimal point right for exponent > 0
while exponent > 0 do
decimal_pos = decimal_pos + 1
exponent = exponent - 1
if decimal_pos > #mantissa + 1 then mantissa = mantissa .. '0' end
-- Remove leading zeros unless decimal point is in first position
while decimal_pos > 1 and mantissa:sub(1,1) == '0' do
mantissa = mantissa:sub(2)
decimal_pos = decimal_pos - 1
end
end
-- Shift decimal point left for exponent < 0
while exponent < 0 do
if decimal_pos == 1 then
mantissa = '0' .. mantissa
else
decimal_pos = decimal_pos - 1
end
exponent = exponent + 1
end
-- Insert decimal point in correct position and return
return (negative and '-' or '') .. mantissa:sub(1, decimal_pos - 1) .. '.' .. mantissa:sub(decimal_pos)
end
-- Rounds a number to the nearest integer (NOT USED)
local function round_num(x)
if x%1 >= 0.5 then
return math.ceil(x)
else
return math.floor(x)
end
end
-- Rounds a number to the nearest two-word number (round = up, down, or "on" for round to nearest).
-- Numbers with two digits before the decimal will be rounded to an integer as specified by round.
-- Larger numbers will be rounded to a number with only one nonzero digit in front and all other digits zero.
-- Negative sign is preserved and does not count towards word limit.
local function round_for_english(num, round)
-- If an integer with at most two digits, just return
if num:find("^%-?%d?%d%.?$") then return num end
local negative = num:find("^%-")
if negative then
-- We're rounding magnitude so flip it
if round == 'up' then round = 'down' elseif round == 'down' then round = 'up' end
end
-- If at most two digits before decimal, round to integer and return
local _, _, small_int, trailing_digits, round_digit = num:find("^%-?(%d?%d?)%.((%d)%d*)$")
if small_int then
if small_int == '' then small_int = '0' end
if (round == 'up' and trailing_digits:find('[1-9]')) or (round == 'on' and tonumber(round_digit) >= 5) then
small_int = tostring(tonumber(small_int) + 1)
end
return (negative and '-' or '') .. small_int
end
-- When rounding up, any number with > 1 nonzero digit will round up (e.g. 1000000.001 rounds up to 2000000)
local nonzero_digits = 0
for digit in num:gfind("[1-9]") do
nonzero_digits = nonzero_digits + 1
end
num = num:gsub("%.%d*$", "") -- Remove decimal part
-- Second digit used to determine which way to round lead digit
local _, _, lead_digit, round_digit, round_digit_2, rest = num:find("^%-?(%d)(%d)(%d)(%d*)$")
if tonumber(lead_digit .. round_digit) < 20 and (1 + #rest) % 3 == 0 then
-- In English numbers < 20 are one word so put 2 digits in lead and round based on 3rd
lead_digit = lead_digit .. round_digit
round_digit = round_digit_2
else
rest = round_digit_2 .. rest
end
if (round == 'up' and nonzero_digits > 1) or (round == 'on' and tonumber(round_digit) >= 5) then
lead_digit = tostring(tonumber(lead_digit) + 1)
end
-- All digits but lead digit will turn to zero
rest = rest:gsub("%d", "0")
return (negative and '-' or '') .. lead_digit .. '0' .. rest
end
local denominators = {
[2] = { 'half', plural = 'halves' },
[3] = { 'third' },
[4] = { 'quarter', us = 'fourth' },
[5] = { 'fifth' },
[6] = { 'sixth' },
[8] = { 'eighth' },
[9] = { 'ninth' },
[10] = { 'tenth' },
[16] = { 'sixteenth' },
}
-- Return status, fraction where:
-- status is a string:
-- "finished" if there is a fraction with no whole number;
-- "ok" if fraction is empty or valid;
-- "unsupported" if bad fraction;
-- fraction is a string giving (numerator / denominator) as English text, or is "".
-- Only unsigned fractions with a very limited range of values are supported,
-- except that if whole is empty, the numerator can use "-" to indicate negative.
-- whole (string or nil): nil or "" if no number before the fraction
-- numerator (string or nil): numerator, if any (default = 1 if a denominator is given)
-- denominator (string or nil): denominator, if any
-- sp_us (boolean): true if sp=us
-- negative_word (string): word to use for negative sign, if whole is empty
-- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half"
local function fraction_to_english(whole, numerator, denominator, sp_us, negative_word, use_one)
if numerator or denominator then
local finished = (whole == nil or whole == '')
local sign = ''
if numerator then
if finished and numerator:sub(1, 1) == '-' then
numerator = numerator:sub(2)
sign = negative_word .. ' '
end
else
numerator = '1'
end
if not numerator:match('^%d+$') or not denominator or not denominator:match('^%d+$') then
return 'unsupported', ''
end
numerator = tonumber(numerator)
denominator = tonumber(denominator)
local dendata = denominators[denominator]
if not (dendata and 1 <= numerator and numerator <= 99) then
return 'unsupported', ''
end
local numstr, denstr
local sep = '-'
if numerator == 1 then
denstr = sp_us and dendata.us or dendata[1]
if finished or use_one then
numstr = 'one'
elseif denstr:match('^[aeiou]') then
numstr = 'an'
sep = ' '
else
numstr = 'a'
sep = ' '
end
else
numstr = numeral_to_english_less_100(numerator)
denstr = dendata.plural
if not denstr then
denstr = (sp_us and dendata.us or dendata[1]) .. 's'
end
end
if finished then
return 'finished', sign .. numstr .. sep .. denstr
end
return 'ok', ' and ' .. numstr .. sep .. denstr
end
return 'ok', ''
end
-- Takes a decimal number and converts it to English text.
-- Return nil if a fraction cannot be converted (only some numbers are supported for fractions).
-- num (string or nil): the number to convert.
-- Can be an arbitrarily large decimal, such as "-123456789123456789.345", and
-- can use scientific notation (e.g. "1.23E5").
-- May fail for very large numbers not listed in "groups" such as "1E4000".
-- num is nil if there is no whole number before a fraction.
-- numerator (string or nil): numerator of fraction (nil if no fraction)
-- denominator (string or nil): denominator of fraction (nil if no fraction)
-- capitalize (boolean): whether to capitalize the result (e.g. 'One' instead of 'one')
-- use_and (boolean): whether to use the word 'and' between tens/ones place and higher places
-- hyphenate (boolean): whether to hyphenate all words in the result, useful as an adjective
-- ordinal (boolean): whether to produce an ordinal (e.g. 'first' instead of 'one')
-- plural (boolean): whether to pluralize the resulting number
-- links: nil: do not add any links; 'on': link "billion" and larger to Orders of magnitude article;
-- any other text: list of numbers to link (e.g. "billion,quadrillion")
-- negative_word: word to use for negative sign (typically 'negative' or 'minus'; nil to use default)
-- round: nil or '': no rounding; 'on': round to nearest two-word number; 'up'/'down': round up/down to two-word number
-- zero: word to use for value '0' (nil to use default)
-- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half"
local function _numeral_to_english(num, numerator, denominator, capitalize, use_and, hyphenate, ordinal, plural, links, negative_word, round, zero, use_one)
if not negative_word then
if use_and then
-- TODO Should 'minus' be used when do not have sp=us?
-- If so, need to update testcases, and need to fix "minus zero".
-- negative_word = 'minus'
negative_word = 'negative'
else
negative_word = 'negative'
end
end
local status, fraction_text = fraction_to_english(num, numerator, denominator, not use_and, negative_word, use_one)
if status == 'unsupported' then
return nil
end
if status == 'finished' then
-- Input is a fraction with no whole number.
-- Hack to avoid executing stuff that depends on num being a number.
local s = fraction_text
if hyphenate then s = s:gsub("%s", "-") end
if capitalize then s = s:gsub("^%l", string.upper) end
return s
end
num = scientific_notation_to_decimal(num)
if round and round ~= '' then
if round ~= 'on' and round ~= 'up' and round ~= 'down' then
error("Invalid rounding mode")
end
num = round_for_english(num, round)
end
-- Separate into negative sign, num (digits before decimal), decimal_places (digits after decimal)
local MINUS = '−' -- Unicode U+2212 MINUS SIGN (may be in values from [[Module:Convert]])
if num:sub(1, #MINUS) == MINUS then
num = '-' .. num:sub(#MINUS + 1) -- replace MINUS with '-'
elseif num:sub(1, 1) == '+' then
num = num:sub(2) -- ignore any '+'
end
local negative = num:find("^%-")
local decimal_places, subs = num:gsub("^%-?%d*%.(%d+)$", "%1")
if subs == 0 then decimal_places = nil end
num, subs = num:gsub("^%-?(%d*)%.?%d*$", "%1")
if num == '' and decimal_places then num = '0' end
if subs == 0 or num == '' then error("Invalid decimal numeral") end
-- For each group of 3 digits except the last one, print with appropriate group name (e.g. million)
local s = ''
while #num > 3 do
if s ~= '' then s = s .. ' ' end
local group_num = math.floor((#num - 1) / 3)
local group = groups[group_num]
local group_digits = #num - group_num*3
s = s .. numeral_to_english_less_1000(num:sub(1, group_digits), false, false, false, zero) .. ' '
if links and (((links == 'on' and group_num >= 3) or links:find(group)) and group_num <= 13) then
s = s .. '[[Orders_of_magnitude_(numbers)#10' .. group_num*3 .. '|' .. group .. ']]'
else
s = s .. group
end
num = num:sub(1 + group_digits)
num = num:gsub("^0*", "") -- Trim leading zeros
end
-- Handle final three digits of integer part
if s ~= '' and num ~= '' then
if #num <= 2 and use_and then
s = s .. ' and '
else
s = s .. ' '
end
end
if s == '' or num ~= '' then
s = s .. numeral_to_english_less_1000(num, use_and, ordinal, plural, zero)
elseif ordinal or plural then
-- Round numbers like "one million" take standard suffixes for ordinal/plural
s = s .. standard_suffix(ordinal, plural)
end
-- For decimal places (if any) output "point" followed by spelling out digit by digit
if decimal_places then
s = s .. ' point'
for i = 1, #decimal_places do
s = s .. ' ' .. ones_position[tonumber(decimal_places:sub(i,i))]
end
end
s = s:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace
if ordinal and plural then s = s .. 's' end -- s suffix works for all ordinals
if negative and s ~= zero then s = negative_word .. ' ' .. s end
s = s:gsub("negative zero", "zero")
s = s .. fraction_text
if hyphenate then s = s:gsub("%s", "-") end
if capitalize then s = s:gsub("^%l", string.upper) end
return s
end
local function _numeral_to_english2(args)
local num = tostring(args.num)
num = num:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace
num = num:gsub(",", "") -- Remove commas
num = num:gsub("^<span[^<>]*></span>", "") -- Generated by Template:age
if num ~= '' then -- a fraction may have an empty whole number
if not num:find("^%-?%d*%.?%d*%-?[Ee]?[+%-]?%d*$") then
-- Input not in a valid format, try to eval it as an expr to see
-- if that produces a number (e.g. "3 + 5" will become "8").
local noerr, result = pcall(mw.ext.ParserFunctions.expr, num)
if noerr then
num = result
end
end
end
-- Call helper function passing args
return _numeral_to_english(
num,
args['numerator'],
args['denominator'],
args['capitalize'],
args['use_and'],
args['hyphenate'],
args['ordinal'],
args['plural'],
args['links'],
args['negative_word'],
args['round'],
args['zero'],
args['use_one']
) or ''
end
local p = { -- Functions that can be called from another module
roman_to_numeral = roman_to_numeral,
spell_number = _numeral_to_english,
spell_number2 = _numeral_to_english2,
english_to_ordinal = english_to_ordinal,
english_to_numeral = english_to_numeral,
}
function p._roman_to_numeral(frame) -- Callable via {{#invoke:ConvertNumeric|_roman_to_numeral|VI}}
return roman_to_numeral(frame.args[1])
end
function p._english_to_ordinal(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_ordinal|First}}
return english_to_ordinal(frame.args[1])
end
function p._english_to_numeral(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_numeral|One}}
return english_to_numeral(frame.args[1])
end
function p.numeral_to_english(frame)
local args = frame.args
-- Tail call to helper function passing args from frame
return _numeral_to_english2{
['num'] = args[1],
['numerator'] = args['numerator'],
['denominator'] = args['denominator'],
['capitalize'] = args['case'] == 'U' or args['case'] == 'u',
['use_and'] = args['sp'] ~= 'us',
['hyphenate'] = args['adj'] == 'on',
['ordinal'] = args['ord'] == 'on',
['plural'] = args['pl'] == 'on',
['links'] = args['lk'],
['negative_word'] = args['negative'],
['round'] = args['round'],
['zero'] = args['zero'],
['use_one'] = args['one'] == 'one' -- experiment: using '|one=one' makes fraction 2+1/2 give "two and one-half" instead of "two and a half"
}
end
---- recursive function for p.decToHex
local function decToHexDigit(dec)
local dig = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}
local div = math.floor(dec/16)
local mod = dec-(16*div)
if div >= 1 then return decToHexDigit(div)..dig[mod+1] else return dig[mod+1] end
end -- I think this is supposed to be done with a tail call but first I want something that works at all
---- finds all the decimal numbers in the input text and hexes each of them
function p.decToHex(frame)
local args=frame.args
local parent=frame.getParent(frame)
local pargs={}
if parent then pargs=parent.args end
local text=args[1] or pargs[1] or ""
local minlength=args.minlength or pargs.minlength or 1
minlength=tonumber(minlength)
local prowl=mw.ustring.gmatch(text,"(.-)(%d+)")
local output=""
repeat
local chaff,dec=prowl()
if not(dec) then break end
local hex=decToHexDigit(dec)
while (mw.ustring.len(hex)<minlength) do hex="0"..hex end
output=output..chaff..hex
until false
local chaff=mw.ustring.match(text,"(%D+)$") or ""
return output..chaff
end
return p
dbb876f8710ee1407b421a28b3e9bc5a6ea36cda
Module:Exponential search
828
327
421
2023-02-10T20:10:53Z
wikipedia>Uzume
0
strict
Scribunto
text/plain
-- This module provides a generic exponential search algorithm.
require[[strict]]
local checkType = require('libraryUtil').checkType
local floor = math.floor
local function midPoint(lower, upper)
return floor(lower + (upper - lower) / 2)
end
local function search(testFunc, i, lower, upper)
if testFunc(i) then
if i + 1 == upper then
return i
end
lower = i
if upper then
i = midPoint(lower, upper)
else
i = i * 2
end
return search(testFunc, i, lower, upper)
else
upper = i
i = midPoint(lower, upper)
return search(testFunc, i, lower, upper)
end
end
return function (testFunc, init)
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 2, init, 'number', true)
if init and (init < 1 or init ~= floor(init) or init == math.huge) then
error(string.format(
"invalid init value '%s' detected in argument #2 to " ..
"'Exponential search' (init value must be a positive integer)",
tostring(init)
), 2)
end
init = init or 2
if not testFunc(1) then
return nil
end
return search(testFunc, init, 1, nil)
end
a9037be0c44536be79b2d7a26155bfb907368ae7
Template:Val
10
717
1097
2023-04-02T01:46:23Z
wikipedia>Dinoguy1000
0
correct safesubst usage
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#invoke:val|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
de315e9728588de49567fc363ccc28b987b6e298
Template:Fraction/styles.css
10
728
1119
2023-05-15T17:30:42Z
wikipedia>Izno
0
clip-path now supported
sanitized-css
text/css
/* {{pp|small=y}} */
.frac {
white-space: nowrap;
}
.frac .num,
.frac .den {
font-size: 80%;
line-height: 0; /* we want this inline */
vertical-align: super;
}
.frac .den {
vertical-align: sub;
}
/* [[Template:Screen reader-only]] is canonical implementation onwiki */
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
/* white-space: nowrap; /* already have nowrap above */
}
b28507c69a3866957f0cad2cbdb76d24154ba271
Module:Hatnote list
828
337
441
2023-11-13T21:00:31Z
wikipedia>Nihiltres
0
Updated from sandbox: added support for punctuation collapse when text is italicized. The update's content includes changes by users Johnuniq, Dexxor, and Nihiltres.
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote list --
-- --
-- This module produces and formats lists for use in hatnotes. In particular, --
-- it implements the for-see list, i.e. lists of "For X, see Y" statements, --
-- as used in {{about}}, {{redirect}}, and their variants. Also introduced --
-- are andList & orList helpers for formatting lists with those conjunctions. --
--------------------------------------------------------------------------------
local mArguments --initialize lazily
local mFormatLink = require('Module:Format link')
local mHatnote = require('Module:Hatnote')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
--------------------------------------------------------------------------------
-- List stringification helper functions
--
-- These functions are used for stringifying lists, usually page lists inside
-- the "Y" portion of "For X, see Y" for-see items.
--------------------------------------------------------------------------------
--default options table used across the list stringification functions
local stringifyListDefaultOptions = {
conjunction = "and",
separator = ",",
altSeparator = ";",
space = " ",
formatted = false
}
--Searches display text only
local function searchDisp(haystack, needle)
return string.find(
string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle
)
end
-- Stringifies a list generically; probably shouldn't be used directly
local function stringifyList(list, options)
-- Type-checks, defaults, and a shortcut
checkType("stringifyList", 1, list, "table")
if #list == 0 then return nil end
checkType("stringifyList", 2, options, "table", true)
options = options or {}
for k, v in pairs(stringifyListDefaultOptions) do
if options[k] == nil then options[k] = v end
end
local s = options.space
-- Format the list if requested
if options.formatted then
list = mFormatLink.formatPages(
{categorizeMissing = mHatnote.missingTargetCat}, list
)
end
-- Set the separator; if any item contains it, use the alternate separator
local separator = options.separator
for k, v in pairs(list) do
if searchDisp(v, separator) then
separator = options.altSeparator
break
end
end
-- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§"
local conjunction = s .. options.conjunction .. s
if #list == 2 and searchDisp(list[1], "§") or #list > 2 then
conjunction = separator .. conjunction
end
-- Return the formatted string
return mw.text.listToText(list, separator .. s, conjunction)
end
--DRY function
function p.conjList (conj, list, fmt)
return stringifyList(list, {conjunction = conj, formatted = fmt})
end
-- Stringifies lists with "and" or "or"
function p.andList (...) return p.conjList("and", ...) end
function p.orList (...) return p.conjList("or", ...) end
--------------------------------------------------------------------------------
-- For see
--
-- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the
-- {{about}} and {{redirect}} templates and their variants.
--------------------------------------------------------------------------------
--default options table used across the forSee family of functions
local forSeeDefaultOptions = {
andKeyword = 'and',
title = mw.title.getCurrentTitle().text,
otherText = 'other uses',
forSeeForm = 'For %s, see %s.',
}
--Collapses duplicate punctuation at end of string, ignoring italics and links
local function punctuationCollapse (text)
return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text
end
-- Structures arguments into a table for stringification, & options
function p.forSeeArgsToTable (args, from, options)
-- Type-checks and defaults
checkType("forSeeArgsToTable", 1, args, 'table')
checkType("forSeeArgsToTable", 2, from, 'number', true)
from = from or 1
checkType("forSeeArgsToTable", 3, options, 'table', true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- maxArg's gotten manually because getArgs() and table.maxn aren't friends
local maxArg = 0
for k, v in pairs(args) do
if type(k) == 'number' and k > maxArg then maxArg = k end
end
-- Structure the data out from the parameter list:
-- * forTable is the wrapper table, with forRow rows
-- * Rows are tables of a "use" string & a "pages" table of pagename strings
-- * Blanks are left empty for defaulting elsewhere, but can terminate list
local forTable = {}
local i = from
local terminated = false
-- If there is extra text, and no arguments are given, give nil value
-- to not produce default of "For other uses, see foo (disambiguation)"
if options.extratext and i > maxArg then return nil end
-- Loop to generate rows
repeat
-- New empty row
local forRow = {}
-- On blank use, assume list's ended & break at end of this loop
forRow.use = args[i]
if not args[i] then terminated = true end
-- New empty list of pages
forRow.pages = {}
-- Insert first pages item if present
table.insert(forRow.pages, args[i + 1])
-- If the param after next is "and", do inner loop to collect params
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
while args[i + 2] == options.andKeyword do
if args[i + 3] then
table.insert(forRow.pages, args[i + 3])
end
-- Increment to next "and"
i = i + 2
end
-- Increment to next use
i = i + 2
-- Append the row
table.insert(forTable, forRow)
until terminated or i > maxArg
return forTable
end
-- Stringifies a table as formatted by forSeeArgsToTable
function p.forSeeTableToString (forSeeTable, options)
-- Type-checks and defaults
checkType("forSeeTableToString", 1, forSeeTable, "table", true)
checkType("forSeeTableToString", 2, options, "table", true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Stringify each for-see item into a list
local strList = {}
if forSeeTable then
for k, v in pairs(forSeeTable) do
local useStr = v.use or options.otherText
local pagesStr =
p.andList(v.pages, true) or
mFormatLink._formatLink{
categorizeMissing = mHatnote.missingTargetCat,
link = mHatnote.disambiguate(options.title)
}
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
forSeeStr = punctuationCollapse(forSeeStr)
table.insert(strList, forSeeStr)
end
end
if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end
-- Return the concatenated list
return table.concat(strList, ' ')
end
-- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps
-- but not blank/whitespace values. Ignores named args and args < "from".
function p._forSee (args, from, options)
local forSeeTable = p.forSeeArgsToTable(args, from, options)
return p.forSeeTableToString(forSeeTable, options)
end
-- As _forSee, but uses the frame.
function p.forSee (frame, from, options)
mArguments = require('Module:Arguments')
return p._forSee(mArguments.getArgs(frame), from, options)
end
return p
1c8e6212115f76ecc3db8d05137011cd18207988
Template:Fraction
10
727
1117
2024-01-16T00:53:18Z
wikipedia>Jonesey95
0
readability per TPER
wikitext
text/x-wiki
<templatestyles src="Fraction/styles.css" /><!--
--><span class="frac"><!--
-->{{#if:{{{3|}}}<!-- if 3
-->|{{{1}}}<span class="sr-only">+</span><span class="num">{{{2}}}</span>⁄<span class="den">{{{3}}}</span><!-- then 1 2/3
-->|{{#if:{{{2|}}}<!-- elseif 2
-->|<span class="num">{{{1}}}</span>⁄<span class="den">{{{2}}}</span><!-- then 1/2
-->|{{#if:{{{1|}}}<!-- elseif 1
-->|<span class="num">1</span>⁄<span class="den">{{{1}}}</span><!-- then 1/1
-->|⁄<!-- else 0, a slash
-->}}<!-- endif 1
-->}}<!-- endif 2
-->}}<!-- endif 3
--></span><noinclude>
{{documentation}}
</noinclude>
92a487359898e00b80676732b41757019446ae53
Template:Hlist
10
826
1281
2024-02-17T05:01:35Z
wikipedia>Pppery
0
Changed protection settings for "[[Template:Hlist]]": Always cascade protected via main page, for consistency ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
9e3824c2e3c0e0dbef2f37556ac0b994987fecf9
Template:Sfrac/styles.css
10
732
1127
2024-03-18T19:02:06Z
wikipedia>Izno
0
ws, add clip-path
sanitized-css
text/css
/* {{pp|small=y}} */
.sfrac {
white-space: nowrap;
}
.sfrac.tion,
.sfrac .tion {
display: inline-block;
vertical-align: -0.5em;
font-size: 85%;
text-align: center;
}
.sfrac .num {
display: block;
line-height: 1em;
margin: 0.0em 0.1em;
border-bottom: 1px solid;
}
.sfrac .den {
display: block;
line-height: 1em;
margin: 0.1em 0.1em;
}
/* [[Template:Screen reader-only]] is canonical implementation onwiki */
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0); /* removed from CSS */
clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
/* white-space: nowrap; /* already have nowrap above */
}
197429395812c1ab351775e9ab127ae0ef74564e
Module:Pagetype/config
828
333
433
2024-05-16T12:23:09Z
wikipedia>MSGJ
0
+cfg for non-existent pages
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Pagetype configuration data --
-- This page holds localisation and configuration data for Module:Pagetype. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
-- This table holds the default page types for each namespace. Keys to this
-- table should be integers that can be used as keys to mw.site.namespaces.
cfg.pagetypes = {
[0] = 'article', -- Main namespace
[2] = 'user page',
[4] = 'project page',
[6] = 'file',
[8] = 'interface page', -- MediaWiki namespace
[10] = 'template',
[12] = 'help page',
[14] = 'category',
[100] = 'portal',
[118] = 'draft',
[710] = 'Timed Text page',
[828] = 'module',
[2300] = 'gadget',
[2302] = 'gadget definition',
[-1] = 'special page',
[-2] = 'file', -- Media namespace
}
-- This table holds the namespaces to be looked up from cfg.pagetypes by
-- default.
cfg.defaultNamespaces = {
[0] = true, -- main
[6] = true, -- file
[10] = true, -- template
[14] = true, -- category
[828] = true, -- module
}
-- This table holds the namespaces to be looked up from cfg.pagetypes if
-- cfg.defaultnsExtended is set.
cfg.extendedNamespaces = {
[0] = true, -- main
[2] = true, -- user
[4] = true, -- project
[6] = true, -- file
[8] = true, -- mediawiki
[10] = true, -- template
[12] = true, -- help
[14] = true, -- category
[100] = true, -- portal
[118] = true, -- draft
[828] = true, -- module
}
-- This table holds custom aliases for each namespace.
cfg.customNamespaceAliases = {
[0] = {'main'},
}
-- The parameter name to set which default namespace values to be looked up from
-- cfg.pagetypes.
cfg.defaultns = 'defaultns'
-- The value of cfg.defaultns to set all namespaces, including talk.
cfg.defaultnsAll = 'all'
-- The value of cfg.defaultns to set the namespaces listed in
-- cfg.extendedNamespaces
cfg.defaultnsExtended = 'extended'
-- The value of cfg.defaultns to set no default namespaces.
cfg.defaultnsNone = 'none'
-- The parameter name to use for talk pages.
cfg.talk = 'talk'
-- The default value for talk pages.
cfg.talkDefault = 'talk page'
-- The parameter name to use for disambiguation pages page.
cfg.dab = 'dab'
-- The parameter name to use for non-existent pages.
cfg.ne = 'nonexistent'
cfg.neDefault = 'page'
cfg.softRedirect = 'soft_redirect'
cfg.softRedirectDefault = 'redirect'
cfg.sia = 'sia'
cfg.siaDefault = 'article'
cfg.rfd = 'redirect'
cfg.rfdDefault = 'redirect'
-- This table holds the different possible aliases for disambiguation-class
-- pages. These should be lower-case.
cfg.dabAliases = {
['disambiguation'] = true,
['disambig'] = true,
['disamb'] = true,
['dab'] = true,
}
-- The default value for disambiguation pages.
cfg.dabDefault = 'page'
-- The parameter name to use for N/A-class page.
cfg.na = 'na'
-- This table holds the different possible aliases for N/A-class pages. These
-- should be lower-case.
cfg.naAliases = {
['na'] = true,
['n/a'] = true,
}
-- The default value for N/A-class pages.
cfg.naDefault = 'page'
-- The parameter name to use for redirects.
cfg.redirect = 'redirect'
-- The default value to use for redirects.
cfg.redirectDefault = 'redirect'
-- The parameter name for undefined namespaces.
cfg.other = 'other'
-- The value used if the module detects an undefined namespace.
cfg.otherDefault = 'page'
-- The usual suffix denoting a plural.
cfg.plural = 's'
-- This table holds plurals not formed by a simple suffix.
cfg.irregularPlurals = {
["category"] = "categories"
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line
33b76bd60283986954f6a6203f163f6b304b95ee
Module:List
828
828
1285
2024-05-19T16:45:46Z
wikipedia>Pppery
0
Per edit request
Scribunto
text/plain
local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')
local p = {}
local listTypes = {
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true
}
function p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes and TemplateStyles
data.classes = {}
data.templatestyles = ''
if listType == 'horizontal' or listType == 'horizontal_ordered' then
table.insert(data.classes, 'hlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Hlist/styles.css' }
}
elseif listType == 'unbulleted' then
table.insert(data.classes, 'plainlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Plainlist/styles.css' }
}
end
table.insert(data.classes, args.class)
-- Main div style
data.style = args.style
-- Indent for horizontal lists
if listType == 'horizontal' or listType == 'horizontal_ordered' then
local indent = tonumber(args.indent)
indent = indent and indent * 1.6 or 0
if indent > 0 then
data.marginLeft = indent .. 'em'
end
end
-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listStyleType = args.list_style_type or args['list-style-type']
data.type = args['type']
-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
if data.type
and not data.listStyleType
and not tostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType = data.type
data.type = nil
end
end
-- List tag type
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listTag = 'ol'
else
data.listTag = 'ul'
end
-- Start number for ordered lists
data.start = args.start
if listType == 'horizontal_ordered' then
-- Apply fix to get start numbers working with horizontal ordered lists.
local startNum = tonumber(data.start)
if startNum then
data.counterReset = 'listitem ' .. tostring(startNum - 1)
end
end
-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle = args.list_style
-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle = args.item_style or args.li_style
data.items = {}
for _, num in ipairs(mTableTools.numKeys(args)) do
local item = {}
item.content = args[num]
item.style = args['item' .. tostring(num) .. '_style']
or args['item_style' .. tostring(num)]
item.value = args['item' .. tostring(num) .. '_value']
or args['item_value' .. tostring(num)]
table.insert(data.items, item)
end
return data
end
function p.renderList(data)
-- Renders the list HTML.
-- Return the blank string if there are no list items.
if type(data.items) ~= 'table' or #data.items < 1 then
return ''
end
-- Render the main div tag.
local root = mw.html.create('div')
for _, class in ipairs(data.classes or {}) do
root:addClass(class)
end
root:css{['margin-left'] = data.marginLeft}
if data.style then
root:cssText(data.style)
end
-- Render the list tag.
local list = root:tag(data.listTag or 'ul')
list
:attr{start = data.start, type = data.type}
:css{
['counter-reset'] = data.counterReset,
['list-style-type'] = data.listStyleType
}
if data.listStyle then
list:cssText(data.listStyle)
end
-- Render the list items
for _, t in ipairs(data.items or {}) do
local item = list:tag('li')
if data.itemStyle then
item:cssText(data.itemStyle)
end
if t.style then
item:cssText(t.style)
end
item
:attr{value = t.value}
:wikitext(t.content)
end
return data.templatestyles .. tostring(root)
end
function p.renderTrackingCategories(args)
local isDeprecated = false -- Tracks deprecated parameters.
for k, v in pairs(args) do
k = tostring(k)
if k:find('^item_style%d+$') or k:find('^item_value%d+$') then
isDeprecated = true
break
end
end
local ret = ''
if isDeprecated then
ret = ret .. '[[Category:List templates with deprecated parameters]]'
end
return ret
end
function p.makeList(listType, args)
if not listType or not listTypes[listType] then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
), 2)
end
checkType('makeList', 2, args, 'table')
local data = p.makeListData(listType, args)
local list = p.renderList(data)
local trackingCategories = p.renderTrackingCategories(args)
return list .. trackingCategories
end
for listType in pairs(listTypes) do
p[listType] = function (frame)
local mArguments = require('Module:Arguments')
local origArgs = mArguments.getArgs(frame, {
frameOnly = ((frame and frame.args and frame.args.frameonly or '') ~= ''),
valueFunc = function (key, value)
if not value or not mw.ustring.find(value, '%S') then return nil end
if mw.ustring.find(value, '^%s*[%*#;:]') then
return value
else
return value:match('^%s*(.-)%s*$')
end
return nil
end
})
-- Copy all the arguments to a new table, for faster indexing.
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.makeList(listType, args)
end
end
return p
44af96bdee7ebfa2ecf19acd4461d7a35c75856a
Module:Pagetype
828
332
431
2024-05-21T17:35:20Z
wikipedia>MSGJ
0
fix for files and interface messages which do exist but are not stored locally
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- This meta-module which automatically detects namespaces, and allows --
-- for a great deal of customisation. It can easily be ported to other --
-- wikis by changing the values in the [[Module:Pagetype/config]]. --
-- --
--------------------------------------------------------------------------------
-- Load config.
local cfg = mw.loadData('Module:Pagetype/config')
-- Load required modules.
local yesno = require('Module:Yesno')
local p = {}
-- Look up a namespace argument in the args table.
local function lookUpNamespaceArg(args, key)
local arg = args[key]
-- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave
-- other values the same.
return yesno(arg, arg)
end
-- Append multiple values to an array
local function appendMultiple(target, source)
for _, value in ipairs(source) do
table.insert(target, value)
end
end
-- Get argument keys for a title's namespace
local function getNamespaceArgKeys(title)
local nsInfo = mw.site.namespaces[title.namespace]
local customAliases = cfg.customNamespaceAliases[title.namespace] or {}
local keys = {}
if nsInfo.name ~= '' then
table.insert(keys, nsInfo.name)
end
if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then
table.insert(keys, nsInfo.canonicalName)
end
appendMultiple(keys, nsInfo.aliases)
appendMultiple(keys, customAliases)
return keys
end
-- Get the argument for a title's namespace, if it was specified in the args table.
local function getNamespaceArg(title, args)
if title.isTalkPage then
return lookUpNamespaceArg(args, cfg.talk)
end
for _, key in ipairs(getNamespaceArgKeys(title)) do
local arg = lookUpNamespaceArg(args, mw.ustring.lower(key))
if arg ~= nil then
return arg
end
end
return nil
end
-- Look up a page type specific to the title's namespace
local function getExplicitPageType(title)
if title.isTalkPage then
return cfg.talkDefault
else
return cfg.pagetypes[title.namespace]
end
end
-- Get a default page type that is not specific to the title's namespace
local function getDefaultPageType(args)
local other = lookUpNamespaceArg(args, cfg.other)
if type(other) == 'string' then
return other
else
return cfg.otherDefault
end
end
local function detectRedirects(title, args)
local redirect = lookUpNamespaceArg(args, cfg.redirect)
if redirect == false then
-- Don't detect redirects if they have been specifically disallowed.
return nil
end
-- Allow custom values for redirects.
if not title.isRedirect then
return nil
elseif type(redirect) == 'string' then
return redirect
else
return cfg.redirectDefault
end
end
local function capitalize(pageType)
local first = mw.ustring.sub(pageType, 1, 1)
local rest = mw.ustring.sub(pageType, 2)
return mw.ustring.upper(first) .. rest
end
local function pluralize(pageType)
if cfg.irregularPlurals[pageType] then
return cfg.irregularPlurals[pageType]
else
return pageType .. cfg.plural -- often 's'
end
end
local function parseContent(title, args, optionsList)
if title.namespace==828 and title.subpageText~='doc' -- don't detect modules
or not title.exists -- can't check unless page exists
then
return nil
end
local content = title:getContent()
if content == nil then
return nil
end
local templates -- lazily evaluated
for _, options in next, optionsList do
local list, parameter, default, articleOnly = unpack(options, 1, 4)
if not articleOnly or title.namespace==0 then -- only check for templates if we should...
local out = lookUpNamespaceArg(args, parameter)
if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them
if not templates then
templates = {} -- do our delayed evaluation now that we are required to
content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect
for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do
templates[#templates+1] = capitalize(template)
end
end
local wantedTemplates = mw.loadData('Module:Pagetype/' .. list)
local templateFound = false
for _, template in next, templates do
if wantedTemplates[template] then
templateFound = true
break
end
end
if templateFound then
if type(out)=='string' then
return out
elseif out ~= false and default then
return default
end
end
end
end
end
end
-- Find pages which do not exist
local function nonExistent(title, args)
local arg = lookUpNamespaceArg(args, cfg.ne)
if arg == false then
return nil
end
local exists = false
if title.exists then -- not an article if it does not exist
exists = true
elseif title.namespace==8 and mw.message.new(title.text):exists() then
exists = true
elseif title.namespace==6 and title.fileExists then
exists = true
end
if not exists then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
end
end
-- Get page types for mainspaces pages with an explicit class specified
local function getMainNamespaceClassPageType(title, args)
local class = args[1]
if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match
class = mw.ustring.lower(class)
end
local arg = lookUpNamespaceArg(args, cfg.na)
if arg == false then -- don't check for this class if it is specifically disallowed
return nil
end
if cfg.naAliases[class] then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
else
return nil
end
end
-- Get page type specified by an explicit namespace argument.
local function getNamespaceArgPageType(title, args)
local namespaceArg = getNamespaceArg(title, args)
if namespaceArg == true then
-- Namespace has been explicitly enabled, so return the default for
-- this namespace
return getExplicitPageType(title)
elseif namespaceArg == false then
-- Namespace has been explicitly disabled
return getDefaultPageType(args)
elseif namespaceArg then
-- This namespaces uses custom text
return namespaceArg
else
return nil
end
end
-- Get page type not specified or detected by other means
local function getOtherPageType(title, args)
-- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes.
local isInDefaultActiveNamespace = false
local defaultNamespacesKey = args[cfg.defaultns]
if defaultNamespacesKey == cfg.defaultnsAll then
isInDefaultActiveNamespace = true
else
local defaultNamespaces
if defaultNamespacesKey == cfg.defaultnsExtended then
defaultNamespaces = cfg.extendedNamespaces
elseif defaultNamespacesKey == cfg.defaultnsNone then
defaultNamespaces = {}
else
defaultNamespaces = cfg.defaultNamespaces
end
isInDefaultActiveNamespace = defaultNamespaces[title.namespace]
end
if isInDefaultActiveNamespace then
return getExplicitPageType(title)
else
return getDefaultPageType(args)
end
end
function p._main(args)
local title
if args.page then
title = mw.title.new(args.page)
else
title = mw.title.getCurrentTitle()
end
if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then
title = title.subjectPageTitle
end
local pageType = detectRedirects(title, args)
or nonExistent(title, args)
or parseContent(title, args, {
{'softredirect', cfg.softRedirect, cfg.softRedirectDefault},
{'setindex', cfg.sia, cfg.siaDefault, true},
{'disambiguation', cfg.dab, cfg.dabDefault, true},
{'rfd', cfg.rfd, cfg.rfdDefault},
})
or (title.namespace == 0 and getMainNamespaceClassPageType(title, args))
or getNamespaceArgPageType(title, args)
or getOtherPageType(title, args)
if yesno(args.plural, false) then
pageType = pluralize(pageType)
end
if yesno(args.caps, false) then
pageType = capitalize(pageType)
end
return pageType
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
return p._main(args)
end
return p
cb47b460d74d5df739ee7e300eeae512798bc475
Module:TableTools
828
328
423
2024-08-18T04:19:07Z
wikipedia>Pppery
0
Update from sandbox per request
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and v ~= v
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
checkType('removeDuplicates', 1, arr, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(arr) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local isNan = p.isNan
local map = {}
for i, v in ipairs(arr) do
if not isNan(v) then
map[v] = i
end
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
checkType("listToSet", 1, arr, "table")
local isNan = p.isNan
local set = {}
for _, v in ipairs(arr) do
if not isNan(v) then
set[v] = true
end
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
if type(orig) ~= "table" then
return orig
end
-- already_seen stores copies of tables indexed by the original table.
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
copy = {}
already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
setmetatable(copy, _deepCopy(mt, true, already_seen))
end
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen or {})
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if searchElement is a member of the array, and false otherwise.
-- Equivalent to JavaScript array.includes(searchElement) or
-- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed
------------------------------------------------------------------------------------
function p.inArray(array, searchElement, fromIndex)
checkType("inArray", 1, array, "table")
-- if searchElement is nil, error?
fromIndex = tonumber(fromIndex)
if fromIndex then
if (fromIndex < 0) then
fromIndex = #array + fromIndex + 1
end
if fromIndex < 1 then fromIndex = 1 end
for _, v in ipairs({unpack(array, fromIndex)}) do
if v == searchElement then
return true
end
end
else
for _, v in pairs(array) do
if v == searchElement then
return true
end
end
end
return false
end
------------------------------------------------------------------------------------
-- merge
--
-- Given the arrays, returns an array containing the elements of each input array
-- in sequence.
------------------------------------------------------------------------------------
function p.merge(...)
local arrays = {...}
local ret = {}
for i, arr in ipairs(arrays) do
checkType('merge', i, arr, 'table')
for _, v in ipairs(arr) do
ret[#ret + 1] = v
end
end
return ret
end
------------------------------------------------------------------------------------
-- extend
--
-- Extends the first array in place by appending all elements from the second
-- array.
------------------------------------------------------------------------------------
function p.extend(arr1, arr2)
checkType('extend', 1, arr1, 'table')
checkType('extend', 2, arr2, 'table')
for _, v in ipairs(arr2) do
arr1[#arr1 + 1] = v
end
end
return p
27b6a4e23d902c05ad6e005059248318bffc2a4e
Module:Template invocation
828
731
1125
2024-09-05T20:21:20Z
wikipedia>Pppery
0
Update name call to fix a few edge cases per request
Scribunto
text/plain
-- This module provides functions for making MediaWiki template invocations.
local checkType = require('libraryUtil').checkType
local p = {}
------------------------------------------------------------------------
-- Name: p.name
-- Purpose: Find a template invocation name from a page name or a
-- mw.title object.
-- Description: This function detects whether a string or a mw.title
-- object has been passed in, and uses that to find a
-- template name as it is used in template invocations.
-- Parameters: title - full page name or mw.title object for the
-- template (string or mw.title object)
-- Returns: String
------------------------------------------------------------------------
function p.name(title)
if type(title) == 'string' then
title = mw.title.new(title)
if not title or #title.prefixedText == 0 or #title.interwiki > 0 then
error("invalid title in parameter #1 of function 'name'", 2)
end
elseif type(title) ~= 'table' or type(title.getContent) ~= 'function' then
error("parameter #1 of function 'name' must be a string or a mw.title object", 2)
end
if title.namespace == 10 then
local text = title.text
local check = mw.title.new(text, 10)
-- Exclude the prefix, unless we have something like "Template:Category:Foo", which can't be abbreviated to "Category:Foo".
return check and mw.title.equals(title, check) and text or title.prefixedText
elseif title.namespace == 0 then
return ':' .. title.prefixedText
else
return title.prefixedText
end
end
------------------------------------------------------------------------
-- Name: p.invocation
-- Purpose: Construct a MediaWiki template invocation.
-- Description: This function makes a template invocation from the
-- name and the arguments given. Note that it isn't
-- perfect: we have no way of knowing what whitespace was
-- in the original invocation, the named parameters will be
-- alphabetically sorted, and any parameters with duplicate keys
-- will be removed.
-- Parameters: name - the template name, formatted as it will appear
-- in the invocation. (string)
-- args - a table of template arguments. (table)
-- format - formatting options. (string, optional)
-- Set to "nowiki" to escape, curly braces, pipes and
-- equals signs with their HTML entities. The default
-- is unescaped.
-- Returns: String
------------------------------------------------------------------------
function p.invocation(name, args, format)
checkType('invocation', 1, name, 'string')
checkType('invocation', 2, args, 'table')
checkType('invocation', 3, format, 'string', true)
-- Validate the args table and make a copy to work from. We need to
-- make a copy of the table rather than just using the original, as
-- some of the values may be erased when building the invocation.
local invArgs = {}
for k, v in pairs(args) do
local typek = type(k)
local typev = type(v)
if typek ~= 'string' and typek ~= 'number'
or typev ~= 'string' and typev ~= 'number'
then
error("invalid arguments table in parameter #2 of " ..
"'invocation' (keys and values must be strings or numbers)", 2)
end
invArgs[k] = v
end
-- Get the separators to use.
local seps = {
openb = '{{',
closeb = '}}',
pipe = '|',
equals = '='
}
if format == 'nowiki' then
for k, v in pairs(seps) do
seps[k] = mw.text.nowiki(v)
end
end
-- Build the invocation body with numbered args first, then named.
local ret = {}
ret[#ret + 1] = seps.openb
ret[#ret + 1] = name
for k, v in ipairs(invArgs) do
if type(v) == 'string' and v:find('=', 1, true) then
-- Likely something like 1=foo=bar which needs to be displayed as a named arg.
else
ret[#ret + 1] = seps.pipe
ret[#ret + 1] = v
invArgs[k] = nil -- Erase the key so that we don't add the value twice
end
end
local keys = {} -- sort parameter list; better than arbitrary order
for k, _ in pairs(invArgs) do
keys[#keys + 1] = k
end
table.sort(keys,
function (a, b)
-- Sort with keys of type number first, then string.
if type(a) == type(b) then
return a < b
elseif type(a) == 'number' then
return true
end
end
)
local maybeSpace = '' -- First named parameter should not be separated by a space
for _, v in ipairs(keys) do -- Add named args based on sorted parameter list
ret[#ret + 1] = maybeSpace .. seps.pipe
ret[#ret + 1] = tostring(v)
ret[#ret + 1] = seps.equals
ret[#ret + 1] = invArgs[v]
maybeSpace = ' '
end
ret[#ret + 1] = seps.closeb
return table.concat(ret)
end
return p
1670c64056477574789c5c21349ec2234f60dd9c
Module:Convert/data
828
721
1105
2024-10-26T23:10:16Z
wikipedia>Johnuniq
0
update from sandbox per [[Template talk:Convert#Module version 30]]
Scribunto
text/plain
-- Conversion data used by [[Module:Convert]] which uses mw.loadData() for
-- read-only access to this module so that it is loaded only once per page.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
--
-- These data tables follow:
-- all_units all properties for a unit, including default output
-- default_exceptions exceptions for default output ('kg' and 'g' have different defaults)
-- link_exceptions exceptions for links ('kg' and 'g' have different links)
--
-- These tables are generated by a script which reads the wikitext of a page that
-- documents the required properties of each unit; see [[:en:Module:Convert/doc]].
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local all_units = {
["Gy"] = {
_name1 = "gray",
_symbol = "Gy",
utype = "absorbed radiation dose",
scale = 1,
prefixes = 1,
default = "rad",
link = "Gray (unit)",
},
["rad"] = {
_name1 = "rad",
_symbol = "rad",
utype = "absorbed radiation dose",
scale = 0.01,
prefixes = 1,
default = "Gy",
link = "Rad (unit)",
},
["cm/s2"] = {
name1 = "centimetre per second squared",
name1_us = "centimeter per second squared",
name2 = "centimetres per second squared",
name2_us = "centimeters per second squared",
symbol = "cm/s<sup>2</sup>",
utype = "acceleration",
scale = 0.01,
default = "ft/s2",
link = "Gal (unit)",
},
["ft/s2"] = {
name1 = "foot per second squared",
name2 = "feet per second squared",
symbol = "ft/s<sup>2</sup>",
utype = "acceleration",
scale = 0.3048,
default = "m/s2",
},
["g0"] = {
name1 = "standard gravity",
name2 = "standard gravities",
symbol = "''g''<sub>0</sub>",
utype = "acceleration",
scale = 9.80665,
default = "m/s2",
},
["g-force"] = {
name2 = "''g''",
symbol = "''g''",
utype = "acceleration",
scale = 9.80665,
default = "m/s2",
link = "g-force",
},
["km/hs"] = {
name1 = "kilometre per hour per second",
name1_us = "kilometer per hour per second",
name2 = "kilometres per hour per second",
name2_us = "kilometers per hour per second",
symbol = "km/(h⋅s)",
utype = "acceleration",
scale = 0.27777777777777779,
default = "mph/s",
link = "Acceleration",
},
["km/s2"] = {
name1 = "kilometre per second squared",
name1_us = "kilometer per second squared",
name2 = "kilometres per second squared",
name2_us = "kilometers per second squared",
symbol = "km/s<sup>2</sup>",
utype = "acceleration",
scale = 1000,
default = "mph/s",
link = "Acceleration",
},
["m/s2"] = {
name1 = "metre per second squared",
name1_us = "meter per second squared",
name2 = "metres per second squared",
name2_us = "meters per second squared",
symbol = "m/s<sup>2</sup>",
utype = "acceleration",
scale = 1,
default = "ft/s2",
},
["mph/s"] = {
name1 = "mile per hour per second",
name2 = "miles per hour per second",
symbol = "mph/s",
utype = "acceleration",
scale = 0.44704,
default = "km/hs",
link = "Acceleration",
},
["km/h/s"] = {
target = "km/hs",
},
["standard gravity"] = {
target = "g0",
},
["1000sqft"] = {
name1 = "thousand square feet",
name2 = "thousand square feet",
symbol = "1000 sq ft",
utype = "area",
scale = 92.90304,
default = "m2",
link = "Square foot",
},
["a"] = {
_name1 = "are",
_symbol = "a",
utype = "area",
scale = 100,
prefixes = 1,
default = "sqft",
link = "Hectare#Are",
},
["acre"] = {
symbol = "acre",
usename = 1,
utype = "area",
scale = 4046.8564224,
default = "ha",
subdivs = { ["rood"] = { 4, default = "ha" }, ["sqperch"] = { 160, default = "ha" } },
},
["acre-sing"] = {
target = "acre",
},
["arpent"] = {
symbol = "arpent",
usename = 1,
utype = "area",
scale = 3418.89,
default = "ha",
},
["cda"] = {
name1 = "cuerda",
symbol = "cda",
utype = "area",
scale = 3930.395625,
default = "ha acre",
},
["daa"] = {
name1 = "decare",
symbol = "daa",
utype = "area",
scale = 1000,
default = "km2 sqmi",
},
["dunam"] = {
symbol = "dunam",
usename = 1,
utype = "area",
scale = 1000,
default = "km2 sqmi",
},
["dunum"] = {
symbol = "dunum",
usename = 1,
utype = "area",
scale = 1000,
default = "km2 sqmi",
link = "Dunam",
},
["ha"] = {
name1 = "hectare",
symbol = "ha",
utype = "area",
scale = 10000,
default = "acre",
},
["hectare"] = {
name1 = "hectare",
symbol = "ha",
usename = 1,
utype = "area",
scale = 10000,
default = "acre",
},
["Irish acre"] = {
name1 = "Irish acre",
symbol = "Irish acres",
utype = "area",
scale = 6555.2385024,
default = "ha",
link = "Acre (Irish)",
},
["m2"] = {
_name1 = "square metre",
_name1_us= "square meter",
_symbol = "m<sup>2</sup>",
prefix_position= 8,
utype = "area",
scale = 1,
prefixes = 2,
default = "sqft",
link = "Square metre",
},
["pondemaat"] = {
name1 = "pondemaat",
name2 = "pondemaat",
symbol = "pond",
utype = "area",
scale = 3674.363358816,
default = "m2",
link = ":nl:pondemaat",
},
["pyeong"] = {
name2 = "pyeong",
symbol = "pyeong",
usename = 1,
utype = "area",
scale = 3.3057851239669422,
default = "m2",
},
["rai"] = {
name2 = "rai",
symbol = "rai",
utype = "area",
scale = 1600,
default = "m2",
link = "Rai (unit)",
},
["rood"] = {
symbol = "rood",
usename = 1,
utype = "area",
scale = 1011.7141056,
default = "sqft m2",
subdivs = { ["sqperch"] = { 40, default = "m2" } },
link = "Rood (unit)",
},
["sqfoot"] = {
name1 = "square foot",
name2 = "square foot",
symbol = "sq ft",
utype = "area",
scale = 0.09290304,
default = "m2",
},
["sqft"] = {
name1 = "square foot",
name2 = "square feet",
symbol = "sq ft",
utype = "area",
scale = 0.09290304,
default = "m2",
},
["sqin"] = {
name1 = "square inch",
name2 = "square inches",
symbol = "sq in",
utype = "area",
scale = 0.00064516,
default = "cm2",
},
["sqmi"] = {
name1 = "square mile",
symbol = "sq mi",
utype = "area",
scale = 2589988.110336,
default = "km2",
},
["sqnmi"] = {
name1 = "square nautical mile",
symbol = "sq nmi",
utype = "area",
scale = 3429904,
default = "km2 sqmi",
link = "Nautical mile",
},
["sqperch"] = {
name2 = "perches",
symbol = "perch",
usename = 1,
utype = "area",
scale = 25.29285264,
default = "m2",
link = "Rod (unit)#Area and volume",
},
["sqverst"] = {
symbol = "square verst",
usename = 1,
utype = "area",
scale = 1138062.24,
default = "km2 sqmi",
link = "Verst",
},
["sqyd"] = {
name1 = "square yard",
symbol = "sq yd",
utype = "area",
scale = 0.83612736,
default = "m2",
},
["tsubo"] = {
name2 = "tsubo",
symbol = "tsubo",
usename = 1,
utype = "area",
scale = 3.3057851239669422,
default = "m2",
link = "Japanese units of measurement#Area",
},
["acres"] = {
target = "acre",
},
["are"] = {
target = "a",
},
["decare"] = {
target = "daa",
},
["foot2"] = {
target = "sqfoot",
},
["ft2"] = {
target = "sqft",
},
["in2"] = {
target = "sqin",
symbol = "in<sup>2</sup>",
},
["km²"] = {
target = "km2",
},
["mi2"] = {
target = "sqmi",
},
["million acre"] = {
target = "e6acre",
},
["million acres"] = {
target = "e6acre",
},
["million hectares"] = {
target = "e6ha",
},
["m²"] = {
target = "m2",
},
["nmi2"] = {
target = "sqnmi",
},
["pond"] = {
target = "pondemaat",
},
["sq arp"] = {
target = "arpent",
},
["sqkm"] = {
target = "km2",
},
["sqm"] = {
target = "m2",
},
["square verst"] = {
target = "sqverst",
},
["verst2"] = {
target = "sqverst",
},
["yd2"] = {
target = "sqyd",
},
["m2/ha"] = {
name1 = "square metre per hectare",
name1_us = "square meter per hectare",
name2 = "square metres per hectare",
name2_us = "square meters per hectare",
symbol = "m<sup>2</sup>/ha",
utype = "area per unit area",
scale = 0.0001,
default = "sqft/acre",
link = "Basal area",
},
["sqft/acre"] = {
name1 = "square foot per acre",
name2 = "square feet per acre",
symbol = "sq ft/acre",
utype = "area per unit area",
scale = 2.295684113865932e-5,
default = "m2/ha",
link = "Basal area",
},
["cent"] = {
name1 = "cent",
symbol = "¢",
utype = "cent",
scale = 1,
default = "cent",
link = "Cent (currency)",
},
["¢"] = {
target = "cent",
},
["A.h"] = {
name1 = "ampere hour",
symbol = "A⋅h",
utype = "charge",
scale = 3600,
default = "coulomb",
},
["coulomb"] = {
_name1 = "coulomb",
_symbol = "C",
utype = "charge",
scale = 1,
prefixes = 1,
default = "e",
link = "Coulomb",
},
["e"] = {
name1 = "elementary charge",
symbol = "''e''",
utype = "charge",
scale = 1.602176487e-19,
default = "coulomb",
},
["g-mol"] = {
name1 = "gram-mole",
symbol = "g‑mol",
utype = "chemical amount",
scale = 1,
default = "lbmol",
link = "Mole (unit)",
},
["gmol"] = {
name1 = "gram-mole",
symbol = "gmol",
utype = "chemical amount",
scale = 1,
default = "lbmol",
link = "Mole (unit)",
},
["kmol"] = {
name1 = "kilomole",
symbol = "kmol",
utype = "chemical amount",
scale = 1000,
default = "lbmol",
link = "Mole (unit)",
},
["lb-mol"] = {
name1 = "pound-mole",
symbol = "lb‑mol",
utype = "chemical amount",
scale = 453.59237,
default = "mol",
},
["lbmol"] = {
name1 = "pound-mole",
symbol = "lbmol",
utype = "chemical amount",
scale = 453.59237,
default = "mol",
},
["mol"] = {
name1 = "mole",
symbol = "mol",
utype = "chemical amount",
scale = 1,
default = "lbmol",
link = "Mole (unit)",
},
["kgCO2/L"] = {
name1 = "kilogram per litre",
name1_us = "kilogram per liter",
name2 = "kilograms per litre",
name2_us = "kilograms per liter",
symbol = "kg(CO<sub>2</sub>)/L",
utype = "co2 per unit volume",
scale = 1000,
default = "lbCO2/USgal",
link = "Exhaust gas",
},
["lbCO2/USgal"] = {
name1 = "pound per US gallon",
name2 = "pounds per US gallon",
symbol = "lbCO2/US gal",
utype = "co2 per unit volume",
scale = 119.82642731689663,
default = "kgCO2/L",
link = "Exhaust gas",
},
["oz/lb"] = {
per = { "oz", "lb" },
utype = "concentration",
default = "mg/kg",
},
["mg/kg"] = {
per = { "mg", "kg" },
utype = "concentration",
default = "oz/lb",
},
["g/dm3"] = {
name1 = "gram per cubic decimetre",
name1_us = "gram per cubic decimeter",
name2 = "grams per cubic decimetre",
name2_us = "grams per cubic decimeter",
symbol = "g/dm<sup>3</sup>",
utype = "density",
scale = 1,
default = "kg/m3",
link = "Density",
},
["g/L"] = {
name1 = "gram per litre",
name1_us = "gram per liter",
name2 = "grams per litre",
name2_us = "grams per liter",
symbol = "g/L",
utype = "density",
scale = 1,
default = "lb/cuin",
link = "Density",
},
["g/mL"] = {
name1 = "gram per millilitre",
name1_us = "gram per milliliter",
name2 = "grams per millilitre",
name2_us = "grams per milliliter",
symbol = "g/mL",
utype = "density",
scale = 1000,
default = "lb/cuin",
link = "Density",
},
["g/ml"] = {
name1 = "gram per millilitre",
name1_us = "gram per milliliter",
name2 = "grams per millilitre",
name2_us = "grams per milliliter",
symbol = "g/ml",
utype = "density",
scale = 1000,
default = "lb/cuin",
link = "Density",
},
["kg/dm3"] = {
name1 = "kilogram per cubic decimetre",
name1_us = "kilogram per cubic decimeter",
name2 = "kilograms per cubic decimetre",
name2_us = "kilograms per cubic decimeter",
symbol = "kg/dm<sup>3</sup>",
utype = "density",
scale = 1000,
default = "lb/cuft",
link = "Density",
},
["kg/L"] = {
name1 = "kilogram per litre",
name1_us = "kilogram per liter",
name2 = "kilograms per litre",
name2_us = "kilograms per liter",
symbol = "kg/L",
utype = "density",
scale = 1000,
default = "lb/USgal",
link = "Density",
},
["kg/l"] = {
name1 = "kilogram per litre",
name1_us = "kilogram per liter",
name2 = "kilograms per litre",
name2_us = "kilograms per liter",
symbol = "kg/l",
utype = "density",
scale = 1000,
default = "lb/USgal",
link = "Density",
},
["kg/m3"] = {
name1 = "kilogram per cubic metre",
name1_us = "kilogram per cubic meter",
name2 = "kilograms per cubic metre",
name2_us = "kilograms per cubic meter",
symbol = "kg/m<sup>3</sup>",
utype = "density",
scale = 1,
default = "lb/cuyd",
link = "Density",
},
["lb/cuft"] = {
name1 = "pound per cubic foot",
name2 = "pounds per cubic foot",
symbol = "lb/cu ft",
utype = "density",
scale = 16.018463373960142,
default = "g/cm3",
link = "Density",
},
["lb/cuin"] = {
name1 = "pound per cubic inch",
name2 = "pounds per cubic inch",
symbol = "lb/cu in",
utype = "density",
scale = 27679.904710203122,
default = "g/cm3",
link = "Density",
},
["lb/cuyd"] = {
name1 = "pound per cubic yard",
name2 = "pounds per cubic yard",
symbol = "lb/cu yd",
utype = "density",
scale = 0.5932764212577829,
default = "kg/m3",
link = "Density",
},
["lb/impgal"] = {
name1 = "pound per imperial gallon",
name2 = "pounds per imperial gallon",
symbol = "lb/imp gal",
utype = "density",
scale = 99.776372663101697,
default = "kg/L",
link = "Density",
},
["lb/in3"] = {
name1 = "pound per cubic inch",
name2 = "pounds per cubic inch",
symbol = "lb/cu in",
utype = "density",
scale = 27679.904710203122,
default = "g/cm3",
link = "Density",
},
["lb/U.S.gal"] = {
name1 = "pound per U.S. gallon",
name2 = "pounds per U.S. gallon",
symbol = "lb/U.S. gal",
utype = "density",
scale = 119.82642731689663,
default = "kg/L",
link = "Density",
},
["lb/USbu"] = {
name1 = "pound per US bushel",
name2 = "pounds per US bushel",
symbol = "lb/US bu",
utype = "density",
scale = 12.871859780974471,
default = "kg/m3",
link = "Bushel",
},
["lb/USgal"] = {
name1 = "pound per US gallon",
name2 = "pounds per US gallon",
symbol = "lb/US gal",
utype = "density",
scale = 119.82642731689663,
default = "kg/L",
link = "Density",
},
["lbm/cuin"] = {
name1 = "pound mass per cubic inch",
name2 = "pounds mass per cubic inch",
symbol = "lbm/cu in",
utype = "density",
scale = 27679.904710203122,
default = "g/cm3",
link = "Density",
},
["mg/L"] = {
name1 = "milligram per litre",
name1_us = "milligram per liter",
name2 = "milligrams per litre",
name2_us = "milligrams per liter",
symbol = "mg/L",
utype = "density",
scale = 0.001,
default = "lb/cuin",
link = "Density",
},
["oz/cuin"] = {
name1 = "ounce per cubic inch",
name2 = "ounces per cubic inch",
symbol = "oz/cu in",
utype = "density",
scale = 1729.9940443876951,
default = "g/cm3",
link = "Density",
},
["g/cm3"] = {
per = { "g", "cm3" },
utype = "density",
default = "lb/cuin",
},
["g/m3"] = {
per = { "g", "m3" },
utype = "density",
default = "lb/cuyd",
link = "Density",
},
["Mg/m3"] = {
per = { "Mg", "m3" },
utype = "density",
default = "lb/cuft",
},
["mg/l"] = {
per = { "mg", "ll" },
utype = "density",
default = "oz/cuin",
},
["μg/dL"] = {
per = { "μg", "dL" },
utype = "density",
default = "lb/cuin",
},
["μg/l"] = {
per = { "μg", "ll" },
utype = "density",
default = "oz/cuin",
},
["lb/ft3"] = {
target = "lb/cuft",
},
["lb/yd3"] = {
target = "lb/cuyd",
},
["lbm/in3"] = {
target = "lbm/cuin",
},
["mcg/dL"] = {
target = "μg/dL",
},
["oz/in3"] = {
target = "oz/cuin",
},
["ug/dL"] = {
target = "μg/dL",
},
["ug/l"] = {
target = "μg/l",
},
["B.O.T.U."] = {
name1 = "Board of Trade Unit",
symbol = "B.O.T.U.",
utype = "energy",
scale = 3600000,
default = "MJ",
link = "Kilowatt-hour",
},
["bboe"] = {
name1 = "barrel of oil equivalent",
name2 = "barrels of oil equivalent",
symbol = "bboe",
utype = "energy",
scale = 6117863200,
default = "GJ",
},
["BOE"] = {
name1 = "barrel of oil equivalent",
name2 = "barrels of oil equivalent",
symbol = "BOE",
utype = "energy",
scale = 6117863200,
default = "GJ",
},
["BTU"] = {
name1 = "British thermal unit",
symbol = "BTU",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
},
["Btu"] = {
name1 = "British thermal unit",
symbol = "Btu",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
},
["BTU-39F"] = {
name1 = "British thermal unit (39°F)",
name2 = "British thermal units (39°F)",
symbol = "BTU<sub>39°F</sub>",
utype = "energy",
scale = 1059.67,
default = "kJ",
link = "British thermal unit",
},
["Btu-39F"] = {
name1 = "British thermal unit (39°F)",
name2 = "British thermal units (39°F)",
symbol = "Btu<sub>39°F</sub>",
utype = "energy",
scale = 1059.67,
default = "kJ",
link = "British thermal unit",
},
["BTU-59F"] = {
name1 = "British thermal unit (59°F)",
name2 = "British thermal units (59°F)",
symbol = "BTU<sub>59°F</sub>",
utype = "energy",
scale = 1054.804,
default = "kJ",
link = "British thermal unit",
},
["Btu-59F"] = {
name1 = "British thermal unit (59°F)",
name2 = "British thermal units (59°F)",
symbol = "Btu<sub>59°F</sub>",
utype = "energy",
scale = 1054.804,
default = "kJ",
link = "British thermal unit",
},
["BTU-60F"] = {
name1 = "British thermal unit (60°F)",
name2 = "British thermal units (60°F)",
symbol = "BTU<sub>60°F</sub>",
utype = "energy",
scale = 1054.68,
default = "kJ",
link = "British thermal unit",
},
["Btu-60F"] = {
name1 = "British thermal unit (60°F)",
name2 = "British thermal units (60°F)",
symbol = "Btu<sub>60°F</sub>",
utype = "energy",
scale = 1054.68,
default = "kJ",
link = "British thermal unit",
},
["BTU-63F"] = {
name1 = "British thermal unit (63°F)",
name2 = "British thermal units (63°F)",
symbol = "BTU<sub>63°F</sub>",
utype = "energy",
scale = 1054.6,
default = "kJ",
link = "British thermal unit",
},
["Btu-63F"] = {
name1 = "British thermal unit (63°F)",
name2 = "British thermal units (63°F)",
symbol = "Btu<sub>63°F</sub>",
utype = "energy",
scale = 1054.6,
default = "kJ",
link = "British thermal unit",
},
["BTU-ISO"] = {
name1 = "British thermal unit (ISO)",
name2 = "British thermal units (ISO)",
symbol = "BTU<sub>ISO</sub>",
utype = "energy",
scale = 1055.056,
default = "kJ",
link = "British thermal unit",
},
["Btu-ISO"] = {
target = "BTU-ISO",
},
["BTU-IT"] = {
name1 = "British thermal unit (IT)",
name2 = "British thermal units (IT)",
symbol = "BTU<sub>IT</sub>",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
link = "British thermal unit",
},
["Btu-IT"] = {
name1 = "British thermal unit (IT)",
name2 = "British thermal units (IT)",
symbol = "Btu<sub>IT</sub>",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
link = "British thermal unit",
},
["BTU-mean"] = {
name1 = "British thermal unit (mean)",
name2 = "British thermal units (mean)",
symbol = "BTU<sub>mean</sub>",
utype = "energy",
scale = 1055.87,
default = "kJ",
link = "British thermal unit",
},
["Btu-mean"] = {
name1 = "British thermal unit (mean)",
name2 = "British thermal units (mean)",
symbol = "Btu<sub>mean</sub>",
utype = "energy",
scale = 1055.87,
default = "kJ",
link = "British thermal unit",
},
["BTU-th"] = {
name1 = "British thermal unit (thermochemical)",
name2 = "British thermal units (thermochemical)",
symbol = "BTU<sub>th</sub>",
utype = "energy",
scale = 1054.35026444,
default = "kJ",
link = "British thermal unit",
},
["Btu-th"] = {
name1 = "British thermal unit (thermochemical)",
name2 = "British thermal units (thermochemical)",
symbol = "Btu<sub>th</sub>",
utype = "energy",
scale = 1054.35026444,
default = "kJ",
link = "British thermal unit",
},
["Cal"] = {
name1 = "calorie",
symbol = "Cal",
utype = "energy",
scale = 4184,
default = "kJ",
},
["cal"] = {
name1 = "calorie",
symbol = "cal",
utype = "energy",
scale = 4.184,
default = "J",
},
["Cal-15"] = {
name1 = "Calorie (15°C)",
name2 = "Calories (15°C)",
symbol = "Cal<sub>15</sub>",
utype = "energy",
scale = 4185.8,
default = "kJ",
link = "Calorie",
},
["cal-15"] = {
name1 = "calorie (15°C)",
name2 = "calories (15°C)",
symbol = "cal<sub>15</sub>",
utype = "energy",
scale = 4.1858,
default = "J",
link = "Calorie",
},
["Cal-IT"] = {
name1 = "Calorie (International Steam Table)",
name2 = "Calories (International Steam Table)",
symbol = "Cal<sub>IT</sub>",
utype = "energy",
scale = 4186.8,
default = "kJ",
link = "Calorie",
},
["cal-IT"] = {
name1 = "calorie (International Steam Table)",
name2 = "calories (International Steam Table)",
symbol = "cal<sub>IT</sub>",
utype = "energy",
scale = 4.1868,
default = "J",
link = "Calorie",
},
["Cal-th"] = {
name1 = "Calorie (thermochemical)",
name2 = "Calories (thermochemical)",
symbol = "Cal<sub>th</sub>",
utype = "energy",
scale = 4184,
default = "kJ",
link = "Calorie",
},
["cal-th"] = {
name1 = "calorie (thermochemical)",
name2 = "calories (thermochemical)",
symbol = "cal<sub>th</sub>",
utype = "energy",
scale = 4.184,
default = "J",
link = "Calorie",
},
["CHU-IT"] = {
name1 = "Celsius heat unit (International Table)",
name2 = "Celsius heat units (International Table)",
symbol = "CHU<sub>IT</sub>",
utype = "energy",
scale = 1899.100534716,
default = "kJ",
link = "Conversion of units#Energy",
},
["cufootnaturalgas"] = {
name1 = "cubic foot of natural gas",
name2 = "cubic foot of natural gas",
symbol = "cuftnaturalgas",
usename = 1,
utype = "energy",
scale = 1055055.85262,
default = "MJ",
link = "Conversion of units#Energy",
},
["cuftnaturalgas"] = {
name1 = "cubic foot of natural gas",
name2 = "cubic feet of natural gas",
symbol = "cuftnaturalgas",
usename = 1,
utype = "energy",
scale = 1055055.85262,
default = "MJ",
link = "Conversion of units#Energy",
},
["Eh"] = {
name1 = "Hartree",
symbol = "''E''<sub>h</sub>",
utype = "energy",
scale = 4.35974417e-18,
default = "eV",
},
["erg"] = {
symbol = "erg",
utype = "energy",
scale = 0.0000001,
default = "μJ",
},
["eV"] = {
name1 = "electronvolt",
symbol = "eV",
utype = "energy",
scale = 1.602176487e-19,
default = "aJ",
},
["feV"] = {
name1 = "femtoelectronvolt",
symbol = "feV",
utype = "energy",
scale = 1.602176487e-34,
default = "yJ",
link = "Electronvolt",
},
["foe"] = {
symbol = "foe",
utype = "energy",
scale = 1e44,
default = "YJ",
link = "Foe (unit)",
},
["ftlb"] = {
name1 = "foot-pound",
symbol = "ft⋅lb",
utype = "energy",
alttype = "torque",
scale = 1.3558179483314004,
default = "J",
link = "Foot-pound (energy)",
},
["ftlb-f"] = {
name1 = "foot-pound force",
name2 = "foot-pounds force",
symbol = "ft⋅lb<sub>f</sub>",
utype = "energy",
alttype = "torque",
scale = 1.3558179483314004,
default = "J",
link = "Foot-pound (energy)",
},
["ftlbf"] = {
name1 = "foot-pound force",
name2 = "foot-pounds force",
symbol = "ft⋅lbf",
utype = "energy",
alttype = "torque",
scale = 1.3558179483314004,
default = "J",
link = "Foot-pound (energy)",
},
["ftpdl"] = {
name1 = "foot-poundal",
symbol = "ft⋅pdl",
utype = "energy",
scale = 0.0421401100938048,
default = "J",
},
["GeV"] = {
name1 = "gigaelectronvolt",
symbol = "GeV",
utype = "energy",
scale = 1.602176487e-10,
default = "nJ",
link = "Electronvolt",
},
["gTNT"] = {
name2 = "grams of TNT",
symbol = "gram of TNT",
usename = 1,
utype = "energy",
scale = 4184,
default = "kJ",
link = "TNT equivalent",
},
["Gtoe"] = {
name1 = "gigatonne of oil equivalent",
name2 = "gigatonnes of oil equivalent",
symbol = "Gtoe",
utype = "energy",
scale = 4.1868e19,
default = "EJ",
link = "Tonne of oil equivalent",
},
["GtonTNT"] = {
name2 = "gigatons of TNT",
symbol = "gigaton of TNT",
usename = 1,
utype = "energy",
scale = 4.184e18,
default = "EJ",
link = "TNT equivalent",
},
["GtTNT"] = {
name2 = "gigatonnes of TNT",
symbol = "gigatonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e18,
default = "EJ",
link = "TNT equivalent",
},
["GW.h"] = {
name1 = "gigawatt-hour",
symbol = "GW⋅h",
utype = "energy",
scale = 3.6e12,
default = "TJ",
link = "Kilowatt-hour",
},
["GWh"] = {
name1 = "gigawatt-hour",
symbol = "GWh",
utype = "energy",
scale = 3.6e12,
default = "TJ",
link = "Kilowatt-hour",
},
["hph"] = {
name1 = "horsepower-hour",
symbol = "hp⋅h",
utype = "energy",
scale = 2684519.537696172792,
default = "kWh",
link = "Horsepower",
},
["inlb"] = {
name1 = "inch-pound",
symbol = "in⋅lb",
utype = "energy",
alttype = "torque",
scale = 0.1129848290276167,
default = "mJ",
link = "Foot-pound (energy)",
},
["inlb-f"] = {
name1 = "inch-pound force",
name2 = "inch-pounds force",
symbol = "in⋅lb<sub>f</sub>",
utype = "energy",
alttype = "torque",
scale = 0.1129848290276167,
default = "mJ",
link = "Foot-pound (energy)",
},
["inlbf"] = {
name1 = "inch-pound force",
name2 = "inch-pounds force",
symbol = "in⋅lbf",
utype = "energy",
alttype = "torque",
scale = 0.1129848290276167,
default = "mJ",
link = "Foot-pound (energy)",
},
["inoz-f"] = {
name1 = "inch-ounce force",
name2 = "inch-ounces force",
symbol = "in⋅oz<sub>f</sub>",
utype = "energy",
alttype = "torque",
scale = 0.00706155181422604375,
default = "mJ",
link = "Foot-pound (energy)",
},
["inozf"] = {
name1 = "inch-ounce force",
name2 = "inch-ounces force",
symbol = "in⋅ozf",
utype = "energy",
alttype = "torque",
scale = 0.00706155181422604375,
default = "mJ",
link = "Foot-pound (energy)",
},
["J"] = {
_name1 = "joule",
_symbol = "J",
utype = "energy",
scale = 1,
prefixes = 1,
default = "cal",
link = "Joule",
},
["kBOE"] = {
name1 = "kilo barrel of oil equivalent",
name2 = "kilo barrels of oil equivalent",
symbol = "kBOE",
utype = "energy",
scale = 6.1178632e12,
default = "TJ",
link = "Barrel of oil equivalent",
},
["kcal"] = {
name1 = "kilocalorie",
symbol = "kcal",
utype = "energy",
scale = 4184,
default = "kJ",
link = "Calorie",
},
["kcal-15"] = {
name1 = "kilocalorie (15°C)",
name2 = "kilocalories (15°C)",
symbol = "kcal<sub>15</sub>",
utype = "energy",
scale = 4185.8,
default = "kJ",
link = "Calorie",
},
["kcal-IT"] = {
name1 = "kilocalorie (International Steam Table)",
name2 = "kilocalories (International Steam Table)",
symbol = "kcal<sub>IT</sub>",
utype = "energy",
scale = 4186.8,
default = "kJ",
link = "Calorie",
},
["kcal-th"] = {
name1 = "kilocalorie (thermochemical)",
name2 = "kilocalories (thermochemical)",
symbol = "kcal<sub>th</sub>",
utype = "energy",
scale = 4184,
default = "kJ",
link = "Calorie",
},
["kerg"] = {
name1 = "kiloerg",
symbol = "kerg",
utype = "energy",
scale = 0.0001,
default = "mJ",
link = "Erg",
},
["keV"] = {
name1 = "kiloelectronvolt",
symbol = "keV",
utype = "energy",
scale = 1.602176487e-16,
default = "fJ",
link = "Electronvolt",
},
["kgTNT"] = {
name2 = "kilograms of TNT",
symbol = "kilogram of TNT",
usename = 1,
utype = "energy",
scale = 4184000,
default = "MJ",
link = "TNT equivalent",
},
["kt(TNT)"] = {
name1 = "kilotonne",
name1_us = "kiloton",
symbol = "kt",
utype = "energy",
scale = 4.184e12,
default = "TJ",
link = "TNT equivalent",
},
["ktoe"] = {
name1 = "kilotonne of oil equivalent",
name2 = "kilotonnes of oil equivalent",
symbol = "ktoe",
utype = "energy",
scale = 4.1868e13,
default = "TJ",
link = "Tonne of oil equivalent",
},
["ktonTNT"] = {
name1 = "kiloton of TNT",
name2 = "kilotons of TNT",
symbol = "kt",
utype = "energy",
scale = 4.184e12,
default = "TJ",
link = "TNT equivalent",
},
["ktTNT"] = {
name2 = "kilotonnes of TNT",
symbol = "kilotonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e12,
default = "TJ",
link = "TNT equivalent",
},
["kW.h"] = {
name1 = "kilowatt-hour",
symbol = "kW⋅h",
utype = "energy",
scale = 3600000,
default = "MJ",
},
["kWh"] = {
name1 = "kilowatt-hour",
symbol = "kWh",
utype = "energy",
scale = 3600000,
default = "MJ",
},
["Mcal"] = {
name1 = "megacalorie",
symbol = "Mcal",
utype = "energy",
scale = 4184000,
default = "MJ",
link = "Calorie",
},
["mcal"] = {
name1 = "millicalorie",
symbol = "mcal",
utype = "energy",
scale = 0.004184,
default = "mJ",
link = "Calorie",
},
["Mcal-15"] = {
name1 = "megacalorie (15°C)",
name2 = "megacalories (15°C)",
symbol = "Mcal<sub>15</sub>",
utype = "energy",
scale = 4185800,
default = "MJ",
link = "Calorie",
},
["mcal-15"] = {
name1 = "millicalorie (15°C)",
name2 = "millicalories (15°C)",
symbol = "mcal<sub>15</sub>",
utype = "energy",
scale = 0.0041858,
default = "mJ",
link = "Calorie",
},
["Mcal-IT"] = {
name1 = "megacalorie (International Steam Table)",
name2 = "megacalories (International Steam Table)",
symbol = "Mcal<sub>IT</sub>",
utype = "energy",
scale = 4186800,
default = "MJ",
link = "Calorie",
},
["mcal-IT"] = {
name1 = "millicalorie (International Steam Table)",
name2 = "millicalories (International Steam Table)",
symbol = "mcal<sub>IT</sub>",
utype = "energy",
scale = 0.0041868,
default = "mJ",
link = "Calorie",
},
["Mcal-th"] = {
name1 = "megacalorie (thermochemical)",
name2 = "megacalories (thermochemical)",
symbol = "Mcal<sub>th</sub>",
utype = "energy",
scale = 4184000,
default = "MJ",
link = "Calorie",
},
["mcal-th"] = {
name1 = "millicalorie (thermochemical)",
name2 = "millicalories (thermochemical)",
symbol = "mcal<sub>th</sub>",
utype = "energy",
scale = 0.004184,
default = "mJ",
link = "Calorie",
},
["Merg"] = {
name1 = "megaerg",
symbol = "Merg",
utype = "energy",
scale = 0.1,
default = "J",
link = "Erg",
},
["merg"] = {
name1 = "millierg",
symbol = "merg",
utype = "energy",
scale = 0.0000000001,
default = "μJ",
link = "Erg",
},
["MeV"] = {
name1 = "megaelectronvolt",
symbol = "MeV",
utype = "energy",
scale = 1.602176487e-13,
default = "pJ",
link = "Electronvolt",
},
["meV"] = {
name1 = "millielectronvolt",
symbol = "meV",
utype = "energy",
scale = 1.602176487e-22,
default = "zJ",
link = "Electronvolt",
},
["MMBtu"] = {
name1 = "million British thermal units",
name2 = "million British thermal units",
symbol = "MMBtu",
utype = "energy",
scale = 1055055852.62,
default = "GJ",
link = "British thermal unit",
},
["Mt(TNT)"] = {
name1 = "megatonne",
name1_us = "megaton",
symbol = "Mt",
utype = "energy",
scale = 4.184e15,
default = "PJ",
link = "TNT equivalent",
},
["Mtoe"] = {
name1 = "megatonne of oil equivalent",
name2 = "megatonnes of oil equivalent",
symbol = "Mtoe",
utype = "energy",
scale = 4.1868e16,
default = "PJ",
link = "Tonne of oil equivalent",
},
["MtonTNT"] = {
name1 = "megaton of TNT",
name2 = "megatons of TNT",
symbol = "Mt",
utype = "energy",
scale = 4.184e15,
default = "PJ",
link = "TNT equivalent",
},
["mtonTNT"] = {
name2 = "millitons of TNT",
symbol = "milliton of TNT",
usename = 1,
utype = "energy",
scale = 4184000,
default = "MJ",
link = "TNT equivalent",
},
["MtTNT"] = {
name2 = "megatonnes of TNT",
symbol = "megatonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e15,
default = "PJ",
link = "TNT equivalent",
},
["mtTNT"] = {
name2 = "millitonnes of TNT",
symbol = "millitonne of TNT",
usename = 1,
utype = "energy",
scale = 4184000,
default = "MJ",
link = "TNT equivalent",
},
["MW.h"] = {
name1 = "megawatt-hour",
symbol = "MW⋅h",
utype = "energy",
scale = 3600000000,
default = "GJ",
link = "Kilowatt-hour",
},
["mW.h"] = {
name1 = "milliwatt-hour",
symbol = "mW⋅h",
utype = "energy",
scale = 3.6,
default = "J",
link = "Kilowatt-hour",
},
["MWh"] = {
name1 = "megawatt-hour",
symbol = "MWh",
utype = "energy",
scale = 3600000000,
default = "GJ",
link = "Kilowatt-hour",
},
["mWh"] = {
name1 = "milliwatt-hour",
symbol = "mWh",
utype = "energy",
scale = 3.6,
default = "J",
link = "Kilowatt-hour",
},
["neV"] = {
name1 = "nanoelectronvolt",
symbol = "neV",
utype = "energy",
scale = 1.602176487e-28,
default = "yJ",
link = "Electronvolt",
},
["PeV"] = {
name1 = "petaelectronvolt",
symbol = "PeV",
utype = "energy",
scale = 0.0001602176487,
default = "mJ",
link = "Electronvolt",
},
["peV"] = {
name1 = "picoelectronvolt",
symbol = "peV",
utype = "energy",
scale = 1.602176487e-31,
default = "yJ",
link = "Electronvolt",
},
["PSh"] = {
name1 = "Pferdestärkenstunde",
symbol = "PSh",
utype = "energy",
scale = 2647795.5,
default = "kWh",
},
["quad"] = {
name1 = "quadrillion British thermal units",
name2 = "quadrillion British thermal units",
symbol = "quad",
utype = "energy",
scale = 1.054804e18,
default = "EJ",
link = "Quad (unit)",
},
["Ry"] = {
name1 = "rydberg",
symbol = "Ry",
utype = "energy",
scale = 2.1798741e-18,
default = "eV",
link = "Rydberg constant",
},
["scf"] = {
name1 = "standard cubic foot",
name2 = "standard cubic feet",
symbol = "scf",
utype = "energy",
scale = 2869.2044809344,
default = "kJ",
},
["scfoot"] = {
name1 = "standard cubic foot",
name2 = "standard cubic foot",
symbol = "scf",
utype = "energy",
scale = 2869.2044809344,
default = "kJ",
},
["t(TNT)"] = {
name1 = "tonne",
name1_us = "ton",
symbol = "t",
utype = "energy",
scale = 4184000000,
default = "GJ",
link = "TNT equivalent",
},
["TeV"] = {
name1 = "teraelectronvolt",
symbol = "TeV",
utype = "energy",
scale = 1.602176487e-7,
default = "μJ",
link = "Electronvolt",
},
["th"] = {
name1 = "thermie",
symbol = "th",
utype = "energy",
scale = 4186800,
default = "MJ",
link = "Conversion of units#Energy",
},
["thm-EC"] = {
name1 = "therm (EC)",
name2 = "therms (EC)",
symbol = "thm (EC)",
utype = "energy",
scale = 105506000,
default = "MJ",
link = "Therm",
},
["thm-UK"] = {
name1 = "therm (UK)",
name2 = "therms (UK)",
symbol = "thm (UK)",
utype = "energy",
scale = 105505585.257348,
default = "MJ",
link = "Therm",
},
["thm-US"] = {
name1 = "therm (US)",
name1_us = "therm (U.S.)",
name2 = "therms (US)",
name2_us = "therms (U.S.)",
symbol = "thm (US)",
sym_us = "thm (U.S.)",
utype = "energy",
scale = 105480400,
default = "MJ",
link = "Therm",
},
["toe"] = {
name1 = "tonne of oil equivalent",
name2 = "tonnes of oil equivalent",
symbol = "toe",
utype = "energy",
scale = 41868000000,
default = "GJ",
},
["tonTNT"] = {
name2 = "tons of TNT",
symbol = "ton of TNT",
usename = 1,
utype = "energy",
scale = 4184000000,
default = "GJ",
link = "TNT equivalent",
},
["tTNT"] = {
name2 = "tonnes of TNT",
symbol = "tonne of TNT",
usename = 1,
utype = "energy",
scale = 4184000000,
default = "GJ",
link = "TNT equivalent",
},
["TtonTNT"] = {
name2 = "teratons of TNT",
symbol = "teraton of TNT",
usename = 1,
utype = "energy",
scale = 4.184e21,
default = "ZJ",
link = "TNT equivalent",
},
["TtTNT"] = {
name2 = "teratonnes of TNT",
symbol = "teratonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e21,
default = "ZJ",
link = "TNT equivalent",
},
["TW.h"] = {
name1 = "terawatt-hour",
symbol = "TW⋅h",
utype = "energy",
scale = 3.6e15,
default = "PJ",
link = "Kilowatt-hour",
},
["TWh"] = {
name1 = "terawatt-hour",
symbol = "TWh",
utype = "energy",
scale = 3.6e15,
default = "PJ",
link = "Kilowatt-hour",
},
["W.h"] = {
name1 = "watt-hour",
symbol = "W⋅h",
utype = "energy",
scale = 3600,
default = "kJ",
link = "Kilowatt-hour",
},
["Wh"] = {
name1 = "watt-hour",
symbol = "Wh",
utype = "energy",
scale = 3600,
default = "kJ",
link = "Kilowatt-hour",
},
["μerg"] = {
name1 = "microerg",
symbol = "μerg",
utype = "energy",
scale = 1e-13,
default = "nJ",
link = "Erg",
},
["μeV"] = {
name1 = "microelectronvolt",
symbol = "μeV",
utype = "energy",
scale = 1.602176487e-25,
default = "yJ",
link = "Electronvolt",
},
["μW.h"] = {
name1 = "microwatt-hour",
symbol = "μW⋅h",
utype = "energy",
scale = 0.0036,
default = "mJ",
link = "Kilowatt-hour",
},
["μWh"] = {
name1 = "microwatt-hour",
symbol = "μWh",
utype = "energy",
scale = 0.0036,
default = "mJ",
link = "Kilowatt-hour",
},
["-kW.h"] = {
target = "kW.h",
link = "Kilowatt hour",
},
["btu"] = {
target = "BTU",
},
["Calorie"] = {
target = "Cal",
},
["ft.lbf"] = {
target = "ftlbf",
},
["ft·lbf"] = {
target = "ftlbf",
},
["g-cal-15"] = {
target = "cal-15",
},
["g-cal-IT"] = {
target = "cal-IT",
},
["g-cal-th"] = {
target = "cal-th",
},
["g-kcal-15"] = {
target = "kcal-15",
},
["g-kcal-IT"] = {
target = "kcal-IT",
},
["g-kcal-th"] = {
target = "kcal-th",
},
["g-Mcal-15"] = {
target = "Mcal-15",
},
["g-mcal-15"] = {
target = "mcal-15",
},
["g-Mcal-IT"] = {
target = "Mcal-IT",
},
["g-mcal-IT"] = {
target = "mcal-IT",
},
["g-Mcal-th"] = {
target = "Mcal-th",
},
["g-mcal-th"] = {
target = "mcal-th",
},
["GW-h"] = {
target = "GW.h",
},
["GW·h"] = {
target = "GW.h",
},
["Hartree"] = {
target = "Eh",
},
["hp.h"] = {
target = "hph",
},
["in.lb-f"] = {
target = "inlb-f",
},
["in.lbf"] = {
target = "inlbf",
},
["in.oz-f"] = {
target = "inoz-f",
},
["in.ozf"] = {
target = "inozf",
},
["kbboe"] = {
target = "kBOE",
symbol = "kbboe",
},
["kg-cal-15"] = {
target = "Cal-15",
},
["kg-cal-IT"] = {
target = "Cal-IT",
},
["kg-cal-th"] = {
target = "Cal-th",
},
["kW-h"] = {
target = "kW.h",
},
["kW·h"] = {
target = "kW.h",
},
["MW-h"] = {
target = "MW.h",
},
["mW-h"] = {
target = "mW.h",
},
["MW·h"] = {
target = "MW.h",
},
["TW-h"] = {
target = "TW.h",
},
["uerg"] = {
target = "μerg",
},
["ueV"] = {
target = "μeV",
},
["uW-h"] = {
target = "μW.h",
},
["uW.h"] = {
target = "μW.h",
},
["uWh"] = {
target = "μWh",
},
["W-h"] = {
target = "W.h",
},
["eVpar"] = {
_name1 = "electronvolt",
_symbol = "eV",
utype = "energy per chemical amount",
scale = 96485.329522144166,
prefixes = 1,
default = "kcal/mol",
link = "Electronvolt",
},
["kcal/mol"] = {
per = { "kcal", "mol" },
utype = "energy per chemical amount",
default = "kJ/mol",
link = "Kilocalorie per mole",
},
["kJ/mol"] = {
per = { "kJ", "mol" },
utype = "energy per chemical amount",
default = "kcal/mol",
link = "Joule per mole",
},
["kWh/100 km"] = {
name1 = "kilowatt-hour per 100 kilometres",
name1_us = "kilowatt-hour per 100 kilometers",
name2 = "kilowatt-hours per 100 kilometres",
name2_us = "kilowatt-hours per 100 kilometers",
symbol = "kW⋅h/100 km",
utype = "energy per unit length",
scale = 36,
default = "MJ/km kWh/mi",
link = "Kilowatt-hour",
},
["kWh/100 mi"] = {
name1 = "kilowatt-hour per 100 miles",
name2 = "kilowatt-hours per 100 miles",
symbol = "kW⋅h/100 mi",
utype = "energy per unit length",
scale = 22.3694,
default = "mpge",
link = "Miles per gallon gasoline equivalent",
},
["MJ/100 km"] = {
name1 = "megajoule per 100 kilometres",
name1_us = "megajoule per 100 kilometers",
name2 = "megajoules per 100 kilometres",
name2_us = "megajoules per 100 kilometers",
symbol = "MJ/100 km",
utype = "energy per unit length",
scale = 10,
default = "BTU/mi",
link = "British thermal unit",
},
["mpge"] = {
name1 = "mile per gallon gasoline equivalent",
name2 = "miles per gallon gasoline equivalent",
symbol = "mpg‑e",
utype = "energy per unit length",
scale = 1.3263314048360777e-5,
invert = -1,
iscomplex= true,
default = "kWh/100 mi",
link = "Miles per gallon gasoline equivalent",
},
["BTU/mi"] = {
per = { "BTU", "mi" },
utype = "energy per unit length",
default = "v > 1525 ! M ! k ! J/km",
},
["kJ/km"] = {
per = { "kJ", "km" },
utype = "energy per unit length",
default = "BTU/mi",
},
["kWh/km"] = {
per = { "-kW.h", "km" },
utype = "energy per unit length",
default = "MJ/km kWh/mi",
},
["kWh/mi"] = {
per = { "-kW.h", "mi" },
utype = "energy per unit length",
default = "kWh/km MJ/km",
},
["MJ/km"] = {
per = { "MJ", "km" },
utype = "energy per unit length",
default = "BTU/mi",
},
["mpg-e"] = {
target = "mpge",
},
["BTU/lb"] = {
name1 = "British thermal unit per pound",
name2 = "British thermal units per pound",
symbol = "BTU/lb",
utype = "energy per unit mass",
scale = 2326,
default = "kJ/kg",
link = "British thermal unit",
},
["cal/g"] = {
name1 = "calorie per gram",
name2 = "calories per gram",
symbol = "cal/g",
utype = "energy per unit mass",
scale = 4184,
default = "J/g",
},
["GJ/kg"] = {
name1 = "gigajoule per kilogram",
name2 = "gigajoules per kilogram",
symbol = "GJ/kg",
utype = "energy per unit mass",
scale = 1e9,
default = "ktTNT/t",
link = "Specific energy",
},
["J/g"] = {
name1 = "joule per gram",
name2 = "joules per gram",
symbol = "J/g",
utype = "energy per unit mass",
scale = 1000,
default = "kcal/g",
link = "Specific energy",
},
["kcal/g"] = {
name1 = "kilocalorie per gram",
name2 = "kilocalories per gram",
symbol = "kcal/g",
utype = "energy per unit mass",
scale = 4184000,
default = "kJ/g",
},
["kJ/g"] = {
name1 = "kilojoule per gram",
name2 = "kilojoules per gram",
symbol = "kJ/g",
utype = "energy per unit mass",
scale = 1000000,
default = "kcal/g",
link = "Specific energy",
},
["kJ/kg"] = {
name1 = "kilojoule per kilogram",
name2 = "kilojoules per kilogram",
symbol = "kJ/kg",
utype = "energy per unit mass",
scale = 1000,
default = "BTU/lb",
link = "Specific energy",
},
["ktonTNT/MT"] = {
name2 = "kilotons of TNT per metric ton",
symbol = "kiloton of TNT per metric ton",
usename = 1,
utype = "energy per unit mass",
scale = 4184000000,
default = "GJ/kg",
link = "TNT equivalent",
},
["ktTNT/t"] = {
name2 = "kilotonnes of TNT per tonne",
symbol = "kilotonne of TNT per tonne",
usename = 1,
utype = "energy per unit mass",
scale = 4184000000,
default = "GJ/kg",
link = "TNT equivalent",
},
["MtonTNT/MT"] = {
name2 = "megatons of TNT per metric ton",
symbol = "megaton of TNT per metric ton",
usename = 1,
utype = "energy per unit mass",
scale = 4.184e12,
default = "TJ/kg",
link = "TNT equivalent",
},
["MtTNT/MT"] = {
name2 = "megatonnes of TNT per tonne",
symbol = "megatonne of TNT per tonne",
usename = 1,
utype = "energy per unit mass",
scale = 4.184e12,
default = "TJ/kg",
link = "TNT equivalent",
},
["TJ/kg"] = {
name1 = "terajoule per kilogram",
name2 = "terajoules per kilogram",
symbol = "TJ/kg",
utype = "energy per unit mass",
scale = 1e12,
default = "MtTNT/MT",
link = "Specific energy",
},
["Cal/g"] = {
per = { "Cal", "g" },
utype = "energy per unit mass",
default = "kJ/g",
},
["BTU/cuft"] = {
per = { "BTU", "cuft" },
utype = "energy per unit volume",
default = "kJ/L",
},
["Cal/12USoz(mL)serve"] = {
per = { "Cal", "-12USoz(mL)serve" },
utype = "energy per unit volume",
default = "kJ/L",
},
["Cal/12USoz(ml)serve"] = {
per = { "Cal", "-12USoz(ml)serve" },
utype = "energy per unit volume",
default = "kJ/l",
},
["Cal/12USozserve"] = {
per = { "Cal", "-12USozserve" },
utype = "energy per unit volume",
default = "kJ/L",
},
["Cal/USoz"] = {
per = { "Cal", "USoz" },
utype = "energy per unit volume",
default = "kJ/ml",
},
["kJ/L"] = {
per = { "kJ", "L" },
utype = "energy per unit volume",
default = "BTU/cuft",
},
["kJ/l"] = {
per = { "kJ", "ll" },
utype = "energy per unit volume",
default = "BTU/cuft",
},
["kJ/ml"] = {
per = { "kJ", "ml" },
utype = "energy per unit volume",
default = "Cal/USoz",
},
["MJ/m3"] = {
per = { "MJ", "m3" },
utype = "energy per unit volume",
default = "BTU/cuft",
},
["Sv"] = {
_name1 = "sievert",
_symbol = "Sv",
utype = "equivalent radiation dose",
scale = 1,
prefixes = 1,
default = "rem",
link = "Sievert",
},
["rem"] = {
_name1 = "rem",
_symbol = "rem",
utype = "equivalent radiation dose",
scale = 0.01,
prefixes = 1,
default = "Sv",
link = "Roentgen equivalent man",
},
["g/km"] = {
name1 = "gram per kilometre",
name1_us = "gram per kilometer",
name2 = "grams per kilometre",
name2_us = "grams per kilometer",
symbol = "g/km",
utype = "exhaust emission",
scale = 1e-6,
default = "oz/mi",
link = "Exhaust gas",
},
["g/mi"] = {
name1 = "gram per mile",
name2 = "grams per mile",
symbol = "g/mi",
utype = "exhaust emission",
scale = 6.2137119223733397e-7,
default = "g/km",
link = "Exhaust gas",
},
["gCO2/km"] = {
name1 = "gram of CO<sub>2</sub> per kilometre",
name1_us = "gram of CO<sub>2</sub> per kilometer",
name2 = "grams of CO<sub>2</sub> per kilometre",
name2_us = "grams of CO<sub>2</sub> per kilometer",
symbol = "g(CO<sub>2</sub>)/km",
utype = "exhaust emission",
scale = 1e-6,
default = "ozCO2/mi",
link = "Exhaust gas",
},
["gCO2/mi"] = {
name1 = "gram of CO<sub>2</sub> per mile",
name2 = "grams of CO<sub>2</sub> per mile",
symbol = "g(CO<sub>2</sub>)/mi",
utype = "exhaust emission",
scale = 6.2137119223733397e-7,
default = "gCO2/km",
link = "Exhaust gas",
},
["kg/km"] = {
name1 = "kilogram per kilometre",
name1_us = "kilogram per kilometer",
name2 = "kilograms per kilometre",
name2_us = "kilograms per kilometer",
symbol = "kg/km",
utype = "exhaust emission",
scale = 0.001,
default = "lb/mi",
link = "Exhaust gas",
},
["kgCO2/km"] = {
name1 = "kilogram of CO<sub>2</sub> per kilometre",
name1_us = "kilogram of CO<sub>2</sub> per kilometer",
name2 = "kilograms of CO<sub>2</sub> per kilometre",
name2_us = "kilograms of CO<sub>2</sub> per kilometer",
symbol = "kg(CO<sub>2</sub>)/km",
utype = "exhaust emission",
scale = 0.001,
default = "lbCO2/mi",
link = "Exhaust gas",
},
["lb/mi"] = {
name1 = "pound per mile",
name2 = "pounds per mile",
symbol = "lb/mi",
utype = "exhaust emission",
scale = 0.00028184923173665794,
default = "kg/km",
link = "Exhaust gas",
},
["lbCO2/mi"] = {
name1 = "pound of CO<sub>2</sub> per mile",
name2 = "pounds of CO<sub>2</sub> per mile",
symbol = "lb(CO<sub>2</sub>)/mi",
utype = "exhaust emission",
scale = 0.00028184923173665794,
default = "kgCO2/km",
link = "Exhaust gas",
},
["oz/mi"] = {
name1 = "ounce per mile",
name2 = "ounces per mile",
symbol = "oz/mi",
utype = "exhaust emission",
scale = 1.7615576983541121e-5,
default = "g/km",
link = "Exhaust gas",
},
["ozCO2/mi"] = {
name1 = "ounce of CO<sub>2</sub> per mile",
name2 = "ounces of CO<sub>2</sub> per mile",
symbol = "oz(CO<sub>2</sub>)/mi",
utype = "exhaust emission",
scale = 1.7615576983541121e-5,
default = "gCO2/km",
link = "Exhaust gas",
},
["cuft/a"] = {
name1 = "cubic foot per annum",
name2 = "cubic feet per annum",
symbol = "cu ft/a",
utype = "flow",
scale = 8.9730672142368242e-10,
default = "m3/a",
link = "Cubic foot per second",
},
["cuft/d"] = {
name1 = "cubic foot per day",
name2 = "cubic feet per day",
symbol = "cu ft/d",
utype = "flow",
scale = 3.2774128000000003e-7,
default = "m3/d",
link = "Cubic foot per second",
},
["cuft/h"] = {
name1 = "cubic foot per hour",
name2 = "cubic feet per hour",
symbol = "cu ft/h",
utype = "flow",
scale = 7.8657907200000004e-6,
default = "m3/h",
link = "Cubic foot per second",
},
["cuft/min"] = {
name1 = "cubic foot per minute",
name2 = "cubic feet per minute",
symbol = "cu ft/min",
utype = "flow",
scale = 0.00047194744319999999,
default = "m3/min",
},
["cuft/s"] = {
name1 = "cubic foot per second",
name2 = "cubic feet per second",
symbol = "cu ft/s",
utype = "flow",
scale = 28316846592e-12,
default = "m3/s",
},
["cumi/a"] = {
name1 = "cubic mile per annum",
name2 = "cubic miles per annum",
symbol = "cu mi/a",
utype = "flow",
scale = 132.08171170940057,
default = "km3/a",
link = "Cubic foot per second",
},
["cuyd/h"] = {
name1 = "cubic yard per hour",
name2 = "cubic yards per hour",
symbol = "cuyd/h",
utype = "flow",
scale = 0.00021237634944000001,
default = "m3/h",
link = "Cubic foot per second",
},
["cuyd/s"] = {
name1 = "cubic yard per second",
name2 = "cubic yards per second",
symbol = "cu yd/s",
utype = "flow",
scale = 0.76455485798400002,
default = "m3/s",
},
["Goilbbl/a"] = {
name1 = "billion barrels per year",
name2 = "billion barrels per year",
symbol = "Gbbl/a",
utype = "flow",
scale = 5.0380033629933836,
default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3/a",
link = "Barrel per day",
},
["impgal/h"] = {
name1 = "imperial gallon per hour",
name2 = "imperial gallons per hour",
symbol = "imp gal/h",
utype = "flow",
scale = 1.2628027777777779e-6,
default = "m3/h",
link = "Gallon",
},
["impgal/min"] = {
name1 = "imperial gallon per minute",
name2 = "imperial gallons per minute",
symbol = "imp gal/min",
utype = "flow",
scale = 7.5768166666666671e-5,
default = "m3/s",
link = "Gallon",
},
["impgal/s"] = {
name1 = "imperial gallon per second",
name2 = "imperial gallons per second",
symbol = "impgal/s",
utype = "flow",
scale = 0.00454609,
default = "m3/s",
link = "Imperial gallons per second",
},
["km3/a"] = {
name1 = "cubic kilometre per annum",
name1_us = "cubic kilometer per annum",
name2 = "cubic kilometres per annum",
name2_us = "cubic kilometers per annum",
symbol = "km<sup>3</sup>/a",
utype = "flow",
scale = 31.68808781402895,
default = "cumi/a",
link = "Cubic metre per second",
},
["km3/d"] = {
name1 = "cubic kilometre per day",
name1_us = "cubic kilometer per day",
name2 = "cubic kilometres per day",
name2_us = "cubic kilometers per day",
symbol = "km<sup>3</sup>/d",
utype = "flow",
scale = 11574.074074074075,
default = "cuft/d",
link = "Cubic metre per second",
},
["koilbbl/a"] = {
name1 = "thousand barrels per year",
name2 = "thousand barrels per year",
symbol = "kbbl/a",
utype = "flow",
scale = 5.0380033629933841e-6,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3/a",
link = "Barrel per day",
},
["koilbbl/d"] = {
name1 = "thousand barrels per day",
name2 = "thousand barrels per day",
symbol = "kbbl/d",
utype = "flow",
scale = 0.0018401307283333335,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3/d",
link = "Barrel per day",
},
["L/h"] = {
name1 = "litre per hour",
name1_us = "liter per hour",
name2 = "litres per hour",
name2_us = "liters per hour",
symbol = "L/h",
utype = "flow",
scale = 2.7777777777777776e-7,
default = "impgal/h USgal/h",
link = "Cubic metre per second",
},
["L/min"] = {
name1 = "litre per minute",
name1_us = "liter per minute",
name2 = "litres per minute",
name2_us = "liters per minute",
symbol = "L/min",
utype = "flow",
scale = 1.6666666666666667e-5,
default = "impgal/min USgal/min",
link = "Cubic metre per second",
},
["L/s"] = {
name1 = "litre per second",
name1_us = "liter per second",
name2 = "litres per second",
name2_us = "liters per second",
symbol = "L/s",
utype = "flow",
scale = 0.001,
default = "cuft/s",
link = "Cubic metre per second",
},
["m3/a"] = {
name1 = "cubic metre per annum",
name1_us = "cubic meter per annum",
name2 = "cubic metres per annum",
name2_us = "cubic meters per annum",
symbol = "m<sup>3</sup>/a",
utype = "flow",
scale = 3.1688087814028947e-8,
default = "cuft/a",
link = "Cubic metre per second",
},
["m3/d"] = {
name1 = "cubic metre per day",
name1_us = "cubic meter per day",
name2 = "cubic metres per day",
name2_us = "cubic meters per day",
symbol = "m<sup>3</sup>/d",
utype = "flow",
scale = 1.1574074074074073e-5,
default = "cuft/d",
link = "Cubic metre per second",
},
["m3/h"] = {
name1 = "cubic metre per hour",
name1_us = "cubic meter per hour",
name2 = "cubic metres per hour",
name2_us = "cubic meters per hour",
symbol = "m<sup>3</sup>/h",
utype = "flow",
scale = 0.00027777777777777778,
default = "cuft/h",
link = "Cubic metre per second",
},
["m3/min"] = {
name1 = "cubic metre per minute",
name1_us = "cubic meter per minute",
name2 = "cubic metres per minute",
name2_us = "cubic meters per minute",
symbol = "m<sup>3</sup>/min",
utype = "flow",
scale = 0.016666666666666666,
default = "cuft/min",
link = "Cubic metre per second",
},
["m3/s"] = {
name1 = "cubic metre per second",
name1_us = "cubic meter per second",
name2 = "cubic metres per second",
name2_us = "cubic meters per second",
symbol = "m<sup>3</sup>/s",
utype = "flow",
scale = 1,
default = "cuft/s",
},
["Moilbbl/a"] = {
name1 = "million barrels per year",
name2 = "million barrels per year",
symbol = "Mbbl/a",
utype = "flow",
scale = 0.0050380033629933837,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/a",
link = "Barrel per day",
},
["Moilbbl/d"] = {
name1 = "million barrels per day",
name2 = "million barrels per day",
symbol = "Mbbl/d",
utype = "flow",
scale = 1.8401307283333335,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/d",
link = "Barrel per day",
},
["oilbbl/a"] = {
name1 = "barrel per year",
name2 = "barrels per year",
symbol = "bbl/a",
utype = "flow",
scale = 5.0380033629933841e-9,
default = "m3/a",
link = "Barrel per day",
},
["oilbbl/d"] = {
name1 = "barrel per day",
name2 = "barrels per day",
symbol = "bbl/d",
utype = "flow",
scale = 1.8401307283333336e-6,
default = "m3/d",
},
["Toilbbl/a"] = {
name1 = "trillion barrels per year",
name2 = "trillion barrels per year",
symbol = "Tbbl/a",
utype = "flow",
scale = 5038.0033629933832,
default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3/a",
link = "Barrel per day",
},
["U.S.gal/d"] = {
name1 = "U.S. gallon per day",
name2 = "U.S. gallons per day",
symbol = "U.S. gal/d",
utype = "flow",
scale = 4.3812636388888893e-8,
default = "m3/s",
customary= 1,
},
["U.S.gal/h"] = {
name1 = "gallon per hour",
name2 = "gallons per hour",
symbol = "gal/h",
utype = "flow",
scale = 1.0515032733333334e-6,
default = "m3/h",
link = "Gallon",
customary= 2,
},
["U.S.gal/min"] = {
name1 = "U.S. gallon per minute",
name2 = "U.S. gallons per minute",
symbol = "U.S. gal/min",
utype = "flow",
scale = 6.3090196400000003e-5,
default = "m3/s",
link = "Gallon",
},
["USgal/a"] = {
name1 = "US gallon per year",
name2 = "US gallons per year",
symbol = "US gal/a",
utype = "flow",
scale = 1.1995246102365199e-10,
default = "m3/s",
},
["USgal/d"] = {
name1 = "US gallon per day",
name2 = "US gallons per day",
symbol = "US gal/d",
utype = "flow",
scale = 4.3812636388888893e-8,
default = "m3/s",
},
["USgal/h"] = {
name1 = "gallon per hour",
name2 = "gallons per hour",
symbol = "gal/h",
utype = "flow",
scale = 1.0515032733333334e-6,
default = "m3/h",
link = "Gallon",
customary= 1,
},
["USgal/min"] = {
name1 = "US gallon per minute",
name2 = "US gallons per minute",
symbol = "US gal/min",
utype = "flow",
scale = 6.3090196400000003e-5,
default = "m3/s",
link = "Gallon",
},
["USgal/s"] = {
name1 = "US gallon per second",
name1_us = "U.S. gallon per second",
name2 = "US gallons per second",
name2_us = "U.S. gallons per second",
symbol = "USgal/s",
utype = "flow",
scale = 0.003785411784,
default = "m3/s",
link = "US gallons per second",
},
["ft3/a"] = {
target = "cuft/a",
},
["ft3/d"] = {
target = "cuft/d",
},
["ft3/h"] = {
target = "cuft/h",
},
["ft3/s"] = {
target = "cuft/s",
},
["Gcuft/a"] = {
target = "e9cuft/a",
},
["Gcuft/d"] = {
target = "e9cuft/d",
},
["kcuft/a"] = {
target = "e3cuft/a",
},
["kcuft/d"] = {
target = "e3cuft/d",
},
["kcuft/s"] = {
target = "e3cuft/s",
},
["Mcuft/a"] = {
target = "e6cuft/a",
},
["Mcuft/d"] = {
target = "e6cuft/d",
},
["Mcuft/s"] = {
target = "e6cuft/s",
},
["m³/s"] = {
target = "m3/s",
},
["Tcuft/a"] = {
target = "e12cuft/a",
},
["Tcuft/d"] = {
target = "e12cuft/d",
},
["u.s.gal/min"] = {
target = "U.S.gal/min",
},
["usgal/min"] = {
target = "USgal/min",
},
["-LTf"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "LTf",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["-STf"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "STf",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["dyn"] = {
name1 = "dyne",
symbol = "dyn",
utype = "force",
scale = 0.00001,
default = "gr-f",
},
["g-f"] = {
name1 = "gram-force",
name2 = "grams-force",
symbol = "g<sub>f</sub>",
utype = "force",
scale = 0.00980665,
default = "mN oz-f",
link = "Kilogram-force",
},
["gf"] = {
name1 = "gram-force",
name2 = "grams-force",
symbol = "gf",
utype = "force",
scale = 0.00980665,
default = "mN ozf",
link = "Kilogram-force",
},
["gr-f"] = {
name1 = "grain-force",
name2 = "grains-force",
symbol = "gr<sub>f</sub>",
utype = "force",
scale = 0.0006354602307515,
default = "μN",
link = "Pound (force)",
},
["grf"] = {
name1 = "grain-force",
name2 = "grains-force",
symbol = "grf",
utype = "force",
scale = 0.0006354602307515,
default = "μN",
link = "Pound (force)",
},
["kdyn"] = {
name1 = "kilodyne",
symbol = "kdyn",
utype = "force",
scale = 0.01,
default = "oz-f",
link = "Dyne",
},
["kg-f"] = {
name1 = "kilogram-force",
name2 = "kilograms-force",
symbol = "kg<sub>f</sub>",
utype = "force",
scale = 9.80665,
default = "N lb-f",
},
["kgf"] = {
name1 = "kilogram-force",
name2 = "kilograms-force",
symbol = "kgf",
utype = "force",
scale = 9.80665,
default = "N lbf",
},
["kp"] = {
name1 = "kilopond",
symbol = "kp",
utype = "force",
scale = 9.80665,
default = "N lb-f",
link = "Kilogram-force",
},
["L/T-f"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "L/T<sub>f</sub>",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["L/Tf"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "L/Tf",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["lb-f"] = {
name1 = "pound-force",
name2 = "pounds-force",
symbol = "lb<sub>f</sub>",
utype = "force",
scale = 4.4482216152605,
default = "N",
link = "Pound (force)",
},
["lbf"] = {
name1 = "pound-force",
name2 = "pounds-force",
symbol = "lbf",
utype = "force",
scale = 4.4482216152605,
default = "N",
link = "Pound (force)",
},
["lb(f)"] = {
name1 = "pound",
symbol = "lb",
utype = "force",
scale = 4.4482216152605,
default = "N",
link = "Pound (force)",
},
["LT-f"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "LT<sub>f</sub>",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["LTf"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "LTf",
usename = 1,
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["Mdyn"] = {
name1 = "megadyne",
symbol = "Mdyn",
utype = "force",
scale = 10,
default = "lb-f",
link = "Dyne",
},
["mdyn"] = {
name1 = "millidyne",
symbol = "mdyn",
utype = "force",
scale = 0.00000001,
default = "gr-f",
link = "Dyne",
},
["mg-f"] = {
name1 = "milligram-force",
name2 = "milligrams-force",
symbol = "mg<sub>f</sub>",
utype = "force",
scale = 0.00000980665,
default = "μN gr-f",
link = "Kilogram-force",
},
["mgf"] = {
name1 = "milligram-force",
name2 = "milligrams-force",
symbol = "mgf",
utype = "force",
scale = 0.00000980665,
default = "μN grf",
link = "Kilogram-force",
},
["Mp"] = {
name1 = "megapond",
symbol = "Mp",
utype = "force",
scale = 9806.65,
default = "kN LT-f ST-f",
link = "Kilogram-force",
},
["mp"] = {
name1 = "millipond",
symbol = "mp",
utype = "force",
scale = 0.00000980665,
default = "μN gr-f",
link = "Kilogram-force",
},
["N"] = {
_name1 = "newton",
_symbol = "N",
utype = "force",
scale = 1,
prefixes = 1,
default = "lb-f",
link = "Newton (unit)",
},
["oz-f"] = {
name1 = "ounce-force",
name2 = "ounces-force",
symbol = "oz<sub>f</sub>",
utype = "force",
scale = 0.2780138203095378125,
default = "mN",
link = "Pound (force)",
},
["ozf"] = {
name1 = "ounce-force",
name2 = "ounces-force",
symbol = "ozf",
utype = "force",
scale = 0.2780138203095378125,
default = "mN",
link = "Pound (force)",
},
["p"] = {
name1 = "pond",
symbol = "p",
utype = "force",
scale = 0.00980665,
default = "mN oz-f",
link = "Kilogram-force",
},
["pdl"] = {
name1 = "poundal",
symbol = "pdl",
utype = "force",
scale = 0.138254954376,
default = "N",
},
["S/T-f"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "S/T<sub>f</sub>",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["S/Tf"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "S/Tf",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["ST-f"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "ST<sub>f</sub>",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["STf"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "STf",
usename = 1,
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["t-f"] = {
name1 = "tonne-force",
name2 = "tonnes-force",
symbol = "t<sub>f</sub>",
utype = "force",
scale = 9806.65,
default = "kN LT-f ST-f",
link = "Ton-force#Tonne-force",
},
["tf"] = {
name1 = "tonne-force",
name2 = "tonnes-force",
symbol = "tf",
utype = "force",
scale = 9806.65,
default = "kN LTf STf",
link = "Ton-force#Tonne-force",
},
["dyne"] = {
target = "dyn",
},
["newtons"] = {
target = "N",
},
["poundal"] = {
target = "pdl",
},
["tonne-force"] = {
target = "tf",
},
["impgal/mi"] = {
per = { "@impgal", "mi" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "L/km USgal/mi",
},
["km/L"] = {
per = { "km", "L" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "mpgimp mpgus",
},
["km/l"] = {
per = { "km", "ll" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "mpgimp mpgus",
},
["L/100 km"] = {
per = { "L", "100km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
symlink = "[[Fuel economy in automobiles#Units of measure|L/100 km]]",
},
["l/100 km"] = {
per = { "ll", "100km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
symlink = "[[Fuel economy in automobiles#Units of measure|l/100 km]]",
},
["L/km"] = {
per = { "L", "km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
},
["l/km"] = {
per = { "ll", "km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
},
["mi/impqt"] = {
per = { "mi", "impqt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/U.S.qt"] = {
per = { "mi", "U.S.qt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/USqt"] = {
per = { "mi", "USqt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/usqt"] = {
per = { "mi", "usqt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mpgimp"] = {
per = { "mi", "@impgal" },
symbol = "mpg<sub>‑imp</sub>",
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "L/100 km+mpgus",
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[Imperial units|imp]]</sub>",
},
["mpgus"] = {
per = { "mi", "+USgal" },
symbol = "mpg<sub>‑US</sub>",
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "L/100 km+mpgimp",
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[United States customary units|US]]</sub>",
},
["U.S.gal/mi"] = {
per = { "*U.S.gal", "mi" },
sp_us = true,
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "L/km impgal/mi",
},
["usgal/mi"] = {
per = { "+USgal", "mi" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "L/km impgal/mi",
},
["L/100km"] = {
target = "L/100 km",
},
["l/100km"] = {
target = "l/100 km",
},
["mpg"] = {
shouldbe = "Use %{mpgus%} for miles per US gallon or %{mpgimp%} for miles per imperial gallon (not %{mpg%})",
},
["mpgU.S."] = {
target = "mpgus",
symbol = "mpg<sub>‑U.S.</sub>",
sp_us = true,
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[United States customary units|U.S.]]</sub>",
},
["mpgu.s."] = {
target = "mpgus",
symbol = "mpg<sub>‑U.S.</sub>",
sp_us = true,
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[United States customary units|U.S.]]</sub>",
},
["mpgUS"] = {
target = "mpgus",
},
["USgal/mi"] = {
target = "usgal/mi",
},
["kPa/m"] = {
per = { "kPa", "-m-frac" },
utype = "fracture gradient",
default = "psi/ft",
},
["psi/ft"] = {
per = { "psi", "-ft-frac" },
utype = "fracture gradient",
default = "kPa/m",
},
["cm/km"] = {
name1 = "centimetre per kilometre",
name1_us = "centimeter per kilometer",
name2 = "centimetres per kilometre",
name2_us = "centimeters per kilometer",
symbol = "cm/km",
utype = "gradient",
scale = 0.00001,
default = "ft/mi",
link = "Grade (slope)",
},
["ft/mi"] = {
name1 = "foot per mile",
name2 = "feet per mile",
symbol = "ft/mi",
utype = "gradient",
scale = 0.00018939393939393939,
default = "v < 5.28 ! c ! ! m/km",
link = "Grade (slope)",
},
["ft/nmi"] = {
name1 = "foot per nautical mile",
name2 = "feet per nautical mile",
symbol = "ft/nmi",
utype = "gradient",
scale = 0.00016457883369330455,
default = "v < 6.076 ! c ! ! m/km",
link = "Grade (slope)",
},
["in/ft"] = {
name1 = "inch per foot",
name2 = "inches per foot",
symbol = "in/ft",
utype = "gradient",
scale = 0.083333333333333329,
default = "mm/m",
link = "Grade (slope)",
},
["in/mi"] = {
name1 = "inch per mile",
name2 = "inches per mile",
symbol = "in/mi",
utype = "gradient",
scale = 1.5782828282828283e-5,
default = "v < 0.6336 ! m ! c ! m/km",
link = "Grade (slope)",
},
["m/km"] = {
name1 = "metre per kilometre",
name1_us = "meter per kilometer",
name2 = "metres per kilometre",
name2_us = "meters per kilometer",
symbol = "m/km",
utype = "gradient",
scale = 0.001,
default = "ft/mi",
link = "Grade (slope)",
},
["mm/km"] = {
name1 = "millimetre per kilometre",
name1_us = "millimeter per kilometer",
name2 = "millimetres per kilometre",
name2_us = "millimeters per kilometer",
symbol = "mm/km",
utype = "gradient",
scale = 0.000001,
default = "in/mi",
link = "Grade (slope)",
},
["mm/m"] = {
name1 = "millimetre per metre",
name1_us = "millimeter per meter",
name2 = "millimetres per metre",
name2_us = "millimeters per meter",
symbol = "mm/m",
utype = "gradient",
scale = 0.001,
default = "in/ft",
link = "Grade (slope)",
},
["admi"] = {
name1 = "admiralty mile",
symbol = "nmi (admiralty)",
utype = "length",
scale = 1853.184,
default = "km mi",
link = "Nautical mile",
},
["AU"] = {
name1 = "astronomical unit",
symbol = "AU",
utype = "length",
scale = 149597870700,
default = "km mi",
},
["Brnmi"] = {
name1 = "British nautical mile",
symbol = "(Brit) nmi",
utype = "length",
scale = 1853.184,
default = "km mi",
link = "Nautical mile",
},
["bu"] = {
name2 = "bu",
symbol = "bu",
usename = 1,
utype = "length",
scale = 0.0030303030303030303,
default = "mm",
link = "Japanese units of measurement#Length",
},
["ch"] = {
name1 = "chain",
symbol = "ch",
utype = "length",
scale = 20.1168,
default = "ft m",
subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } },
link = "Chain (unit)",
},
["chlk"] = {
name1 = "[[Chain (unit)|chain]]",
symbol = "[[Chain (unit)|ch]]",
utype = "length",
scale = 20.1168,
default = "ft m",
link = "",
},
["chain"] = {
symbol = "chain",
usename = 1,
utype = "length",
scale = 20.1168,
default = "ft m",
subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } },
link = "Chain (unit)",
},
["chainlk"] = {
symbol = "[[Chain (unit)|chain]]",
usename = 1,
utype = "length",
scale = 20.1168,
default = "ft m",
link = "",
},
["dpcm"] = {
name2 = "dot/cm",
symbol = "dot/cm",
utype = "length",
scale = 100,
invert = -1,
iscomplex= true,
default = "dpi",
link = "Dots per inch",
},
["dpi"] = {
name2 = "DPI",
symbol = "DPI",
utype = "length",
scale = 39.370078740157481,
invert = -1,
iscomplex= true,
default = "pitch",
link = "Dots per inch",
},
["fathom"] = {
symbol = "fathom",
usename = 1,
utype = "length",
scale = 1.8288,
default = "ft m",
},
["foot"] = {
name1 = "foot",
name2 = "foot",
symbol = "ft",
utype = "length",
scale = 0.3048,
default = "m",
subdivs = { ["in"] = { 12, default = "m" } },
link = "Foot (unit)",
},
["ft"] = {
name1 = "foot",
name2 = "feet",
symbol = "ft",
utype = "length",
scale = 0.3048,
exception= "integer_more_precision",
default = "m",
subdivs = { ["in"] = { 12, default = "m" } },
link = "Foot (unit)",
},
["furlong"] = {
symbol = "furlong",
usename = 1,
utype = "length",
scale = 201.168,
default = "ft m",
},
["Gly"] = {
name1 = "gigalight-year",
symbol = "Gly",
utype = "length",
scale = 9.4607304725808e24,
default = "Mpc",
link = "Light-year#Definitions",
},
["Gpc"] = {
name1 = "gigaparsec",
symbol = "Gpc",
utype = "length",
scale = 3.0856775814671916e25,
default = "Gly",
link = "Parsec#Megaparsecs and gigaparsecs",
},
["hand"] = {
name1 = "hand",
symbol = "h",
utype = "length",
builtin = "hand",
scale = 0.1016,
iscomplex= true,
default = "in cm",
link = "Hand (unit)",
},
["in"] = {
name1 = "inch",
name2 = "inches",
symbol = "in",
utype = "length",
scale = 0.0254,
exception= "subunit_more_precision",
default = "mm",
},
["inabbreviated"] = {
name2 = "in",
symbol = "in",
utype = "length",
scale = 0.0254,
default = "mm",
link = "Inch",
},
["kly"] = {
name1 = "kilolight-year",
symbol = "kly",
utype = "length",
scale = 9.4607304725808e18,
default = "pc",
link = "Light-year#Definitions",
},
["kpc"] = {
name1 = "kiloparsec",
symbol = "kpc",
utype = "length",
scale = 3.0856775814671916e19,
default = "kly",
link = "Parsec#Parsecs and kiloparsecs",
},
["LD"] = {
name1 = "lunar distance",
symbol = "LD",
utype = "length",
scale = 384403000,
default = "km mi",
link = "Lunar distance (astronomy)",
},
["league"] = {
symbol = "league",
usename = 1,
utype = "length",
scale = 4828.032,
default = "km",
link = "League (unit)",
},
["ly"] = {
name1 = "light-year",
symbol = "ly",
utype = "length",
scale = 9.4607304725808e15,
default = "AU",
},
["m"] = {
_name1 = "metre",
_name1_us= "meter",
_symbol = "m",
utype = "length",
scale = 1,
prefixes = 1,
default = "v > 0 and v < 3 ! ftin ! ft",
link = "Metre",
},
["mi"] = {
name1 = "mile",
symbol = "mi",
utype = "length",
scale = 1609.344,
default = "km",
subdivs = { ["ch"] = { 80, default = "km" }, ["chlk"] = { 80, default = "km" }, ["chain"] = { 80, default = "km" }, ["chainlk"] = { 80, default = "km" }, ["ft"] = { 5280, default = "km" }, ["furlong"] = { 8, default = "km" }, ["yd"] = { 1760, default = "km" } },
},
["mil"] = {
symbol = "mil",
usename = 1,
utype = "length",
scale = 0.0000254,
default = "mm",
link = "Thousandth of an inch",
},
["Mly"] = {
name1 = "megalight-year",
symbol = "Mly",
utype = "length",
scale = 9.4607304725808e21,
default = "kpc",
link = "Light-year#Definitions",
},
["Mpc"] = {
name1 = "megaparsec",
symbol = "Mpc",
utype = "length",
scale = 3.0856775814671916e22,
default = "Mly",
link = "Parsec#Megaparsecs and gigaparsecs",
},
["NM"] = {
name1 = "nautical mile",
symbol = "NM",
utype = "length",
scale = 1852,
default = "km mi",
},
["nmi"] = {
name1 = "nautical mile",
symbol = "nmi",
utype = "length",
scale = 1852,
default = "km mi",
},
["oldUKnmi"] = {
name1 = "nautical mile",
symbol = "nmi",
utype = "length",
scale = 1853.184,
default = "km mi",
},
["oldUSnmi"] = {
name1 = "nautical mile",
symbol = "nmi",
utype = "length",
scale = 1853.24496,
default = "km mi",
},
["pc"] = {
name1 = "parsec",
symbol = "pc",
utype = "length",
scale = 3.0856775814671916e16,
default = "ly",
},
["perch"] = {
name2 = "perches",
symbol = "perch",
usename = 1,
utype = "length",
scale = 5.0292,
default = "ft m",
link = "Rod (unit)",
},
["pitch"] = {
name2 = "μm",
symbol = "μm",
utype = "length",
scale = 1e-6,
default = "dpi",
defkey = "pitch",
linkey = "pitch",
link = "Dots per inch",
},
["pole"] = {
symbol = "pole",
usename = 1,
utype = "length",
scale = 5.0292,
default = "ft m",
link = "Rod (unit)",
},
["pre1954U.S.nmi"] = {
name1 = "(pre-1954 U.S.) nautical mile",
symbol = "(pre‑1954 U.S.) nmi",
utype = "length",
scale = 1853.24496,
default = "km mi",
link = "Nautical mile",
},
["pre1954USnmi"] = {
name1 = "(pre-1954 US) nautical mile",
name1_us = "(pre-1954 U.S.) nautical mile",
symbol = "(pre‑1954 US) nmi",
sym_us = "(pre‑1954 U.S.) nmi",
utype = "length",
scale = 1853.24496,
default = "km mi",
link = "Nautical mile",
},
["rd"] = {
name1 = "rod",
symbol = "rd",
utype = "length",
scale = 5.0292,
default = "ft m",
link = "Rod (unit)",
},
["royal cubit"] = {
name1 = "royal cubit",
symbol = "cu",
utype = "length",
scale = 0.524,
default = "mm",
},
["rtkm"] = {
name1 = "route kilometre",
name1_us = "route kilometer",
symbol = "km",
utype = "length",
scale = 1000,
default = "mi",
link = "Kilometre",
},
["rtmi"] = {
name1 = "route mile",
symbol = "mi",
utype = "length",
scale = 1609.344,
default = "km",
link = "Mile",
},
["shaku"] = {
name2 = "shaku",
symbol = "shaku",
usename = 1,
utype = "length",
scale = 0.30303030303030304,
default = "m",
link = "Shaku (unit)",
},
["sm"] = {
name1 = "smoot",
symbol = "sm",
utype = "length",
scale = 1.70180,
default = "m",
link = "Smoot (unit)",
},
["smi"] = {
name1 = "statute mile",
symbol = "mi",
utype = "length",
scale = 1609.344,
default = "km",
subdivs = { ["chain"] = { 80, default = "km" } },
},
["solar radius"] = {
name1 = "solar radius",
name2 = "solar radii",
symbol = "''R''<sub>☉</sub>",
utype = "length",
scale = 695700e3,
default = "km",
},
["sun"] = {
name2 = "sun",
symbol = "sun",
usename = 1,
utype = "length",
scale = 0.030303030303030304,
default = "mm",
link = "Japanese units of measurement#Length",
},
["thou"] = {
name2 = "thou",
symbol = "thou",
usename = 1,
utype = "length",
scale = 0.0000254,
default = "mm",
link = "Thousandth of an inch",
},
["verst"] = {
symbol = "verst",
usename = 1,
utype = "length",
scale = 1066.8,
default = "km mi",
},
["yd"] = {
name1 = "yard",
symbol = "yd",
utype = "length",
scale = 0.9144,
default = "m",
subdivs = { ["ft"] = { 3, default = "m" } },
},
["μin"] = {
name1 = "microinch",
name2 = "microinches",
symbol = "μin",
utype = "length",
scale = 0.0000000254,
default = "nm",
link = "SI prefix#Non-metric units",
},
["Å"] = {
name1 = "ångström",
symbol = "Å",
utype = "length",
scale = 0.0000000001,
default = "in",
},
["Hz"] = {
_name1 = "hertz",
_name2 = "hertz",
_symbol = "Hz",
utype = "length",
scale = 3.3356409519815204e-9,
invert = -1,
iscomplex= true,
prefixes = 1,
default = "m",
link = "Hertz",
},
["rpm"] = {
name1 = "revolution per minute",
name2 = "revolutions per minute",
symbol = "rpm",
utype = "length",
scale = 5.5594015866358675e-11,
invert = -1,
iscomplex= true,
default = "Hz",
link = "Revolutions per minute",
},
["-ft-frac"] = {
target = "ft",
link = "Fracture gradient",
},
["-in-stiff"] = {
target = "in",
link = "Stiffness",
},
["-m-frac"] = {
target = "m",
link = "Fracture gradient",
},
["-m-stiff"] = {
target = "m",
link = "Stiffness",
},
["100km"] = {
target = "km",
multiplier= 100,
},
["100mi"] = {
target = "mi",
multiplier= 100,
},
["100miles"] = {
target = "mi",
symbol = "miles",
multiplier= 100,
},
["admiralty nmi"] = {
target = "oldUKnmi",
},
["angstrom"] = {
target = "Å",
},
["au"] = {
target = "AU",
symbol = "au",
},
["feet"] = {
target = "ft",
},
["hands"] = {
target = "hand",
},
["inch"] = {
target = "in",
},
["inches"] = {
target = "in",
},
["light-year"] = {
target = "ly",
},
["meter"] = {
target = "m",
sp_us = true,
},
["meters"] = {
target = "m",
sp_us = true,
},
["metre"] = {
target = "m",
},
["metres"] = {
target = "m",
},
["micrometre"] = {
target = "μm",
},
["micron"] = {
target = "μm",
default = "μin",
},
["mile"] = {
target = "mi",
usename = 1,
},
["miles"] = {
target = "mi",
usename = 1,
},
["parsec"] = {
target = "pc",
},
["rod"] = {
target = "rd",
},
["smoot"] = {
target = "sm",
},
["uin"] = {
target = "μin",
},
["yard"] = {
target = "yd",
},
["yards"] = {
target = "yd",
},
["yds"] = {
target = "yd",
},
["dtex"] = {
name1 = "decitex",
name2 = "decitex",
symbol = "dtex",
utype = "linear density",
scale = 1e-7,
default = "lb/yd",
link = "Units of textile measurement#Units",
},
["kg/cm"] = {
name1 = "kilogram per centimetre",
name1_us = "kilogram per centimeter",
name2 = "kilograms per centimetre",
name2_us = "kilograms per centimeter",
symbol = "kg/cm",
utype = "linear density",
scale = 100,
default = "lb/yd",
link = "Linear density",
},
["kg/m"] = {
name1 = "kilogram per metre",
name1_us = "kilogram per meter",
name2 = "kilograms per metre",
name2_us = "kilograms per meter",
symbol = "kg/m",
utype = "linear density",
scale = 1,
default = "lb/yd",
link = "Linear density",
},
["lb/ft"] = {
name1 = "pound per foot",
name2 = "pounds per foot",
symbol = "lb/ft",
utype = "linear density",
scale = 1.4881639435695539,
default = "kg/m",
link = "Linear density",
},
["lb/yd"] = {
name1 = "pound per yard",
name2 = "pounds per yard",
symbol = "lb/yd",
utype = "linear density",
scale = 0.49605464785651798,
default = "kg/m",
link = "Linear density",
},
["G"] = {
_name1 = "gauss",
_name2 = "gauss",
_symbol = "G",
utype = "magnetic field strength",
scale = 0.0001,
prefixes = 1,
default = "T",
link = "Gauss (unit)",
},
["T"] = {
_name1 = "tesla",
_symbol = "T",
utype = "magnetic field strength",
scale = 1,
prefixes = 1,
default = "G",
link = "Tesla (unit)",
},
["A/m"] = {
name1 = "ampere per metre",
name1_us = "ampere per meter",
name2 = "amperes per metre",
name2_us = "amperes per meter",
symbol = "A/m",
utype = "magnetizing field",
scale = 1,
default = "Oe",
},
["kA/m"] = {
name1 = "kiloampere per metre",
name1_us = "kiloampere per meter",
name2 = "kiloamperes per metre",
name2_us = "kiloamperes per meter",
symbol = "kA/m",
utype = "magnetizing field",
scale = 1000,
default = "kOe",
link = "Ampere per metre",
},
["MA/m"] = {
name1 = "megaampere per metre",
name1_us = "megaampere per meter",
name2 = "megaamperes per metre",
name2_us = "megaamperes per meter",
symbol = "MA/m",
utype = "magnetizing field",
scale = 1e6,
default = "kOe",
link = "Ampere per metre",
},
["Oe"] = {
_name1 = "oersted",
_symbol = "Oe",
utype = "magnetizing field",
scale = 79.5774715,
prefixes = 1,
default = "kA/m",
link = "Oersted",
},
["-Lcwt"] = {
name1 = "hundredweight",
name2 = "hundredweight",
symbol = "cwt",
utype = "mass",
scale = 50.80234544,
default = "lb",
},
["-Scwt"] = {
name1 = "hundredweight",
name2 = "hundredweight",
symbol = "cwt",
utype = "mass",
scale = 45.359237,
default = "lb",
},
["-ST"] = {
name1 = "short ton",
symbol = "ST",
utype = "mass",
scale = 907.18474,
default = "t",
},
["carat"] = {
symbol = "carat",
usename = 1,
utype = "mass",
scale = 0.0002,
default = "g",
link = "Carat (mass)",
},
["drachm"] = {
name1_us = "dram",
symbol = "drachm",
usename = 1,
utype = "mass",
scale = 0.001771845195,
default = "g",
link = "Dram (unit)",
},
["dram"] = {
target = "drachm",
},
["dwt"] = {
name1 = "pennyweight",
symbol = "dwt",
utype = "mass",
scale = 0.00155517384,
default = "oz g",
},
["DWton"] = {
symbol = "deadweight ton",
usename = 1,
utype = "mass",
scale = 1016.0469088,
default = "DWtonne",
link = "Deadweight tonnage",
},
["DWtonne"] = {
name1_us = "deadweight metric ton",
symbol = "deadweight tonne",
sym_us = "~deadweight metric ton",
usename = 1,
utype = "mass",
scale = 1000,
default = "DWton",
link = "Deadweight tonnage",
},
["g"] = {
_name1 = "gram",
_symbol = "g",
utype = "mass",
scale = 0.001,
prefixes = 1,
default = "oz",
link = "Gram",
},
["gr"] = {
name1 = "grain",
symbol = "gr",
utype = "mass",
scale = 0.00006479891,
default = "g",
link = "Grain (unit)",
},
["Gt"] = {
name1 = "gigatonne",
symbol = "Gt",
utype = "mass",
scale = 1000000000000,
default = "LT ST",
link = "Tonne",
},
["impgalh2o"] = {
name1 = "imperial gallon of water",
name2 = "imperial gallons of water",
symbol = "imp gal H<sub>2</sub>O",
utype = "mass",
scale = 4.5359236999999499,
default = "lb kg",
link = "Imperial gallon",
},
["kt"] = {
name1 = "kilotonne",
symbol = "kt",
utype = "mass",
scale = 1000000,
default = "LT ST",
link = "Tonne",
},
["lb"] = {
name1 = "pound",
symbol = "lb",
utype = "mass",
scale = 0.45359237,
exception= "integer_more_precision",
default = "kg",
subdivs = { ["oz"] = { 16, default = "kg" } },
link = "Pound (mass)",
},
["Lcwt"] = {
name1 = "long hundredweight",
name2 = "long hundredweight",
symbol = "Lcwt",
usename = 1,
utype = "mass",
scale = 50.80234544,
default = "lb",
subdivs = { ["qtr"] = { 4, default = "kg" }, ["st"] = { 8, default = "kg" } },
link = "Hundredweight",
},
["long cwt"] = {
name1 = "long hundredweight",
name2 = "long hundredweight",
symbol = "long cwt",
utype = "mass",
scale = 50.80234544,
default = "lb kg",
subdivs = { ["qtr"] = { 4, default = "kg" } },
link = "Hundredweight",
},
["long qtr"] = {
name1 = "long quarter",
symbol = "long qtr",
utype = "mass",
scale = 12.70058636,
default = "lb kg",
},
["LT"] = {
symbol = "long ton",
usename = 1,
utype = "mass",
scale = 1016.0469088,
default = "t",
subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } },
},
["lt"] = {
name1 = "long ton",
symbol = "LT",
utype = "mass",
scale = 1016.0469088,
default = "t",
subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } },
},
["metric ton"] = {
symbol = "metric ton",
usename = 1,
utype = "mass",
scale = 1000,
default = "long ton",
link = "Tonne",
},
["MT"] = {
name1 = "metric ton",
symbol = "t",
utype = "mass",
scale = 1000,
default = "LT ST",
link = "Tonne",
},
["Mt"] = {
name1 = "megatonne",
symbol = "Mt",
utype = "mass",
scale = 1000000000,
default = "LT ST",
link = "Tonne",
},
["oz"] = {
name1 = "ounce",
symbol = "oz",
utype = "mass",
scale = 0.028349523125,
default = "g",
},
["ozt"] = {
name1 = "troy ounce",
symbol = "ozt",
utype = "mass",
scale = 0.0311034768,
default = "oz g",
},
["pdr"] = {
name1 = "pounder",
symbol = "pdr",
utype = "mass",
scale = 0.45359237,
default = "kg",
link = "Pound (mass)",
},
["qtr"] = {
name1 = "quarter",
symbol = "qtr",
utype = "mass",
scale = 12.70058636,
default = "lb kg",
subdivs = { ["lb"] = { 28, default = "kg" } },
link = "Long quarter",
},
["Scwt"] = {
name1 = "short hundredweight",
name2 = "short hundredweight",
symbol = "Scwt",
usename = 1,
utype = "mass",
scale = 45.359237,
default = "lb",
link = "Hundredweight",
},
["short cwt"] = {
name1 = "short hundredweight",
name2 = "short hundredweight",
symbol = "short cwt",
utype = "mass",
scale = 45.359237,
default = "lb kg",
link = "Hundredweight",
},
["short qtr"] = {
name1 = "short quarter",
symbol = "short qtr",
utype = "mass",
scale = 11.33980925,
default = "lb kg",
},
["ST"] = {
symbol = "short ton",
usename = 1,
utype = "mass",
scale = 907.18474,
default = "t",
subdivs = { ["Scwt"] = { 20, default = "t", unit = "-Scwt" } },
},
["shtn"] = {
name1 = "short ton",
symbol = "sh tn",
utype = "mass",
scale = 907.18474,
default = "t",
},
["shton"] = {
symbol = "ton",
usename = 1,
utype = "mass",
scale = 907.18474,
default = "t",
},
["solar mass"] = {
name1 = "solar mass",
name2 = "solar masses",
symbol = "''M''<sub>☉</sub>",
utype = "mass",
scale = 1.98855e30,
default = "kg",
},
["st"] = {
name1 = "stone",
name2 = "stone",
symbol = "st",
utype = "mass",
scale = 6.35029318,
default = "lb kg",
subdivs = { ["lb"] = { 14, default = "kg lb" } },
link = "Stone (unit)",
},
["t"] = {
name1 = "tonne",
name1_us = "metric ton",
symbol = "t",
utype = "mass",
scale = 1000,
default = "LT ST",
},
["tonne"] = {
name1 = "tonne",
name1_us = "metric ton",
symbol = "t",
utype = "mass",
scale = 1000,
default = "shton",
},
["troy pound"] = {
symbol = "troy pound",
usename = 1,
utype = "mass",
scale = 0.3732417216,
default = "lb kg",
link = "Troy weight",
},
["usgalh2o"] = {
name1 = "US gallon of water",
name1_us = "U.S. gallon of water",
name2 = "US gallons of water",
name2_us = "U.S. gallons of water",
symbol = "US gal H<sub>2</sub>O",
utype = "mass",
scale = 3.7776215836051126,
default = "lb kg",
link = "United States customary units#Fluid volume",
},
["viss"] = {
name2 = "viss",
symbol = "viss",
utype = "mass",
scale = 1.632932532,
default = "kg",
link = "Myanmar units of measurement#Mass",
},
["billion tonne"] = {
target = "e9t",
},
["kilogram"] = {
target = "kg",
},
["kilotonne"] = {
target = "kt",
},
["lbs"] = {
target = "lb",
},
["lbt"] = {
target = "troy pound",
},
["lcwt"] = {
target = "Lcwt",
},
["long ton"] = {
target = "LT",
},
["mcg"] = {
target = "μg",
},
["million tonne"] = {
target = "e6t",
},
["scwt"] = {
target = "Scwt",
},
["short ton"] = {
target = "ST",
},
["stone"] = {
target = "st",
},
["thousand tonne"] = {
target = "e3t",
},
["tonnes"] = {
target = "t",
},
["kg/kW"] = {
name1 = "kilogram per kilowatt",
name2 = "kilograms per kilowatt",
symbol = "kg/kW",
utype = "mass per unit power",
scale = 0.001,
default = "lb/hp",
link = "Kilowatt",
},
["lb/hp"] = {
name1 = "pound per horsepower",
name2 = "pounds per horsepower",
symbol = "lb/hp",
utype = "mass per unit power",
scale = 0.00060827738784176115,
default = "kg/kW",
link = "Horsepower",
},
["kg/h"] = {
per = { "kg", "h" },
utype = "mass per unit time",
default = "lb/h",
},
["lb/h"] = {
per = { "lb", "h" },
utype = "mass per unit time",
default = "kg/h",
},
["g-mol/d"] = {
name1 = "gram-mole per day",
name2 = "gram-moles per day",
symbol = "g‑mol/d",
utype = "molar rate",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "Mole (unit)",
},
["g-mol/h"] = {
name1 = "gram-mole per hour",
name2 = "gram-moles per hour",
symbol = "g‑mol/h",
utype = "molar rate",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "Mole (unit)",
},
["g-mol/min"] = {
name1 = "gram-mole per minute",
name2 = "gram-moles per minute",
symbol = "g‑mol/min",
utype = "molar rate",
scale = 0.016666666666666666,
default = "g-mol/s",
link = "Mole (unit)",
},
["g-mol/s"] = {
name1 = "gram-mole per second",
name2 = "gram-moles per second",
symbol = "g‑mol/s",
utype = "molar rate",
scale = 1,
default = "lb-mol/min",
link = "Mole (unit)",
},
["gmol/d"] = {
name1 = "gram-mole per day",
name2 = "gram-moles per day",
symbol = "gmol/d",
utype = "molar rate",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "Mole (unit)",
},
["gmol/h"] = {
name1 = "gram-mole per hour",
name2 = "gram-moles per hour",
symbol = "gmol/h",
utype = "molar rate",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "Mole (unit)",
},
["gmol/min"] = {
name1 = "gram-mole per minute",
name2 = "gram-moles per minute",
symbol = "gmol/min",
utype = "molar rate",
scale = 0.016666666666666666,
default = "gmol/s",
link = "Mole (unit)",
},
["gmol/s"] = {
name1 = "gram-mole per second",
name2 = "gram-moles per second",
symbol = "gmol/s",
utype = "molar rate",
scale = 1,
default = "lbmol/min",
link = "Mole (unit)",
},
["kmol/d"] = {
name1 = "kilomole per day",
name2 = "kilomoles per day",
symbol = "kmol/d",
utype = "molar rate",
scale = 0.011574074074074073,
default = "mmol/s",
link = "Mole (unit)",
},
["kmol/h"] = {
name1 = "kilomole per hour",
name2 = "kilomoles per hour",
symbol = "kmol/h",
utype = "molar rate",
scale = 0.27777777777777779,
default = "mol/s",
link = "Mole (unit)",
},
["kmol/min"] = {
name1 = "kilomole per minute",
name2 = "kilomoles per minute",
symbol = "kmol/min",
utype = "molar rate",
scale = 16.666666666666668,
default = "mol/s",
link = "Kilomole (unit)",
},
["kmol/s"] = {
name1 = "kilomole per second",
name2 = "kilomoles per second",
symbol = "kmol/s",
utype = "molar rate",
scale = 1000,
default = "lb-mol/s",
link = "Mole (unit)",
},
["lb-mol/d"] = {
name1 = "pound-mole per day",
name2 = "pound-moles per day",
symbol = "lb‑mol/d",
utype = "molar rate",
scale = 0.0052499116898148141,
default = "mmol/s",
link = "Pound-mole",
},
["lb-mol/h"] = {
name1 = "pound-mole per hour",
name2 = "pound-moles per hour",
symbol = "lb‑mol/h",
utype = "molar rate",
scale = 0.12599788055555555,
default = "mol/s",
link = "Pound-mole",
},
["lb-mol/min"] = {
name1 = "pound-mole per minute",
name2 = "pound-moles per minute",
symbol = "lb‑mol/min",
utype = "molar rate",
scale = 7.5598728333333334,
default = "mol/s",
link = "Pound-mole",
},
["lb-mol/s"] = {
name1 = "pound-mole per second",
name2 = "pound-moles per second",
symbol = "lb‑mol/s",
utype = "molar rate",
scale = 453.59237,
default = "kmol/s",
link = "Pound-mole",
},
["lbmol/d"] = {
name1 = "pound-mole per day",
name2 = "pound-moles per day",
symbol = "lbmol/d",
utype = "molar rate",
scale = 0.0052499116898148141,
default = "mmol/s",
link = "Pound-mole",
},
["lbmol/h"] = {
name1 = "pound-mole per hour",
name2 = "pound-moles per hour",
symbol = "lbmol/h",
utype = "molar rate",
scale = 0.12599788055555555,
default = "mol/s",
link = "Pound-mole",
},
["lbmol/min"] = {
name1 = "pound-mole per minute",
name2 = "pound-moles per minute",
symbol = "lbmol/min",
utype = "molar rate",
scale = 7.5598728333333334,
default = "mol/s",
link = "Pound-mole",
},
["lbmol/s"] = {
name1 = "pound-mole per second",
name2 = "pound-moles per second",
symbol = "lbmol/s",
utype = "molar rate",
scale = 453.59237,
default = "kmol/s",
link = "Pound-mole",
},
["mmol/s"] = {
name1 = "millimole per second",
name2 = "millimoles per second",
symbol = "mmol/s",
utype = "molar rate",
scale = 0.001,
default = "lb-mol/d",
link = "Mole (unit)",
},
["mol/d"] = {
name1 = "mole per day",
name2 = "moles per day",
symbol = "mol/d",
utype = "molar rate",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "Mole (unit)",
},
["mol/h"] = {
name1 = "mole per hour",
name2 = "moles per hour",
symbol = "mol/h",
utype = "molar rate",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "Mole (unit)",
},
["mol/min"] = {
name1 = "mole per minute",
name2 = "moles per minute",
symbol = "mol/min",
utype = "molar rate",
scale = 0.016666666666666666,
default = "mol/s",
link = "Mole (unit)",
},
["mol/s"] = {
name1 = "mole per second",
name2 = "moles per second",
symbol = "mol/s",
utype = "molar rate",
scale = 1,
default = "lb-mol/min",
link = "Mole (unit)",
},
["μmol/s"] = {
name1 = "micromole per second",
name2 = "micromoles per second",
symbol = "μmol/s",
utype = "molar rate",
scale = 0.000001,
default = "lb-mol/d",
link = "Mole (unit)",
},
["umol/s"] = {
target = "μmol/s",
},
["/acre"] = {
name1 = "per acre",
name2 = "per acre",
symbol = "/acre",
utype = "per unit area",
scale = 0.00024710538146716532,
default = "/ha",
link = "Acre",
},
["/ha"] = {
name1 = "per hectare",
name2 = "per hectare",
symbol = "/ha",
utype = "per unit area",
scale = 100e-6,
default = "/acre",
link = "Hectare",
},
["/sqcm"] = {
name1 = "per square centimetre",
name1_us = "per square centimeter",
name2 = "per square centimetre",
name2_us = "per square centimeter",
symbol = "/cm<sup>2</sup>",
utype = "per unit area",
scale = 1e4,
default = "/sqin",
link = "Square centimetre",
},
["/sqin"] = {
name1 = "per square inch",
name2 = "per square inch",
symbol = "/in<sup>2</sup>",
utype = "per unit area",
scale = 1550.0031000062002,
default = "/sqcm",
link = "Square inch",
},
["/sqkm"] = {
name1 = "per square kilometre",
name1_us = "per square kilometer",
name2 = "per square kilometre",
name2_us = "per square kilometer",
symbol = "/km<sup>2</sup>",
utype = "per unit area",
scale = 1e-6,
default = "/sqmi",
link = "Square kilometre",
},
["/sqmi"] = {
name1 = "per square mile",
name2 = "per square mile",
symbol = "/sq mi",
utype = "per unit area",
scale = 3.8610215854244582e-7,
default = "/sqkm",
link = "Square mile",
},
["PD/acre"] = {
name1 = "inhabitant per acre",
name2 = "inhabitants per acre",
symbol = "/acre",
utype = "per unit area",
scale = 0.00024710538146716532,
default = "PD/ha",
link = "Acre",
},
["PD/ha"] = {
name1 = "inhabitant per hectare",
name2 = "inhabitants per hectare",
symbol = "/ha",
utype = "per unit area",
scale = 100e-6,
default = "PD/acre",
link = "Hectare",
},
["PD/sqkm"] = {
name1 = "inhabitant per square kilometre",
name1_us = "inhabitant per square kilometer",
name2 = "inhabitants per square kilometre",
name2_us = "inhabitants per square kilometer",
symbol = "/km<sup>2</sup>",
utype = "per unit area",
scale = 1e-6,
default = "PD/sqmi",
link = "Square kilometre",
},
["PD/sqmi"] = {
name1 = "inhabitant per square mile",
name2 = "inhabitants per square mile",
symbol = "/sq mi",
utype = "per unit area",
scale = 3.8610215854244582e-7,
default = "PD/sqkm",
link = "Square mile",
},
["/cm2"] = {
target = "/sqcm",
},
["/in2"] = {
target = "/sqin",
},
["/km2"] = {
target = "/sqkm",
},
["pd/acre"] = {
target = "PD/acre",
},
["pd/ha"] = {
target = "PD/ha",
},
["PD/km2"] = {
target = "PD/sqkm",
},
["pd/km2"] = {
target = "PD/sqkm",
},
["PD/km²"] = {
target = "PD/sqkm",
},
["pd/sqkm"] = {
target = "PD/sqkm",
},
["pd/sqmi"] = {
target = "PD/sqmi",
},
["/l"] = {
name1 = "per litre",
name1_us = "per liter",
name2 = "per litre",
name2_us = "per liter",
symbol = "/l",
utype = "per unit volume",
scale = 1000,
default = "/usgal",
link = "Litre",
},
["/L"] = {
name1 = "per litre",
name1_us = "per liter",
name2 = "per litre",
name2_us = "per liter",
symbol = "/L",
utype = "per unit volume",
scale = 1000,
default = "/usgal",
link = "Litre",
},
["/USgal"] = {
name1 = "per gallon",
name2 = "per gallon",
symbol = "/gal",
utype = "per unit volume",
scale = 264.172052,
default = "/L",
link = "US gallon",
customary= 2,
},
["/usgal"] = {
target = "/USgal",
},
["bhp"] = {
name1 = "brake horsepower",
name2 = "brake horsepower",
symbol = "bhp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
link = "Horsepower#Brake horsepower",
},
["Cal/d"] = {
name1 = "large calorie per day",
name2 = "large calories per day",
symbol = "Cal/d",
utype = "power",
scale = 0.048425925925925928,
default = "kJ/d",
link = "Calorie",
},
["Cal/h"] = {
name1 = "large calorie per hour",
name2 = "large calories per hour",
symbol = "Cal/h",
utype = "power",
scale = 1.1622222222222223,
default = "kJ/h",
link = "Calorie",
},
["cal/h"] = {
name1 = "calorie per hour",
name2 = "calories per hour",
symbol = "cal/h",
utype = "power",
scale = 0.0011622222222222223,
default = "W",
link = "Calorie",
},
["CV"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "CV",
utype = "power",
scale = 735.49875,
default = "kW",
},
["hk"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "hk",
utype = "power",
scale = 735.49875,
default = "kW",
},
["hp"] = {
name1 = "horsepower",
name2 = "horsepower",
symbol = "hp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
},
["hp-electric"] = {
name1 = "electric horsepower",
name2 = "electric horsepower",
symbol = "hp",
utype = "power",
scale = 746,
default = "kW",
link = "Horsepower#Electrical horsepower",
},
["hp-electrical"] = {
name1 = "electrical horsepower",
name2 = "electrical horsepower",
symbol = "hp",
utype = "power",
scale = 746,
default = "kW",
link = "Horsepower#Electrical horsepower",
},
["hp-metric"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "hp",
utype = "power",
scale = 735.49875,
default = "kW",
},
["ihp"] = {
name1 = "indicated horsepower",
name2 = "indicated horsepower",
symbol = "ihp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
link = "Horsepower#Indicated horsepower",
},
["kcal/h"] = {
name1 = "kilocalorie per hour",
name2 = "kilocalories per hour",
symbol = "kcal/h",
utype = "power",
scale = 1.1622222222222223,
default = "kW",
link = "Calorie",
},
["kJ/d"] = {
name1 = "kilojoule per day",
name2 = "kilojoules per day",
symbol = "kJ/d",
utype = "power",
scale = 0.011574074074074073,
default = "Cal/d",
link = "Kilojoule",
},
["kJ/h"] = {
name1 = "kilojoule per hour",
name2 = "kilojoules per hour",
symbol = "kJ/h",
utype = "power",
scale = 0.27777777777777779,
default = "W",
link = "Kilojoule",
},
["PS"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "PS",
utype = "power",
scale = 735.49875,
default = "kW",
},
["shp"] = {
name1 = "shaft horsepower",
name2 = "shaft horsepower",
symbol = "shp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
link = "Horsepower#Shaft horsepower",
},
["W"] = {
_name1 = "watt",
_symbol = "W",
utype = "power",
scale = 1,
prefixes = 1,
default = "hp",
link = "Watt",
},
["BTU/h"] = {
per = { "BTU", "h" },
utype = "power",
default = "W",
},
["Btu/h"] = {
per = { "Btu", "h" },
utype = "power",
default = "W",
},
["BHP"] = {
target = "bhp",
},
["btu/h"] = {
target = "BTU/h",
},
["HP"] = {
target = "hp",
},
["Hp"] = {
target = "hp",
},
["hp-mechanical"] = {
target = "hp",
},
["IHP"] = {
target = "ihp",
},
["SHP"] = {
target = "shp",
},
["whp"] = {
target = "hp",
},
["hp/lb"] = {
name1 = "horsepower per pound",
name2 = "horsepower per pound",
symbol = "hp/lb",
utype = "power per unit mass",
scale = 1643.986806,
default = "kW/kg",
link = "Power-to-weight ratio",
},
["hp/LT"] = {
name1 = "horsepower per long ton",
name2 = "horsepower per long ton",
symbol = "hp/LT",
utype = "power per unit mass",
scale = 0.73392268125000004,
default = "kW/t",
link = "Power-to-weight ratio",
},
["hp/ST"] = {
name1 = "horsepower per short ton",
name2 = "horsepower per short ton",
symbol = "hp/ST",
utype = "power per unit mass",
scale = 0.821993403,
default = "kW/t",
link = "Power-to-weight ratio",
},
["hp/t"] = {
name1 = "horsepower per tonne",
name2 = "horsepower per tonne",
symbol = "hp/t",
utype = "power per unit mass",
scale = 0.74569987158227022,
default = "kW/t",
link = "Power-to-weight ratio",
},
["kW/kg"] = {
name1 = "kilowatt per kilogram",
name2 = "kilowatts per kilogram",
symbol = "kW/kg",
utype = "power per unit mass",
scale = 1000,
default = "hp/lb",
link = "Power-to-weight ratio",
},
["kW/t"] = {
name1 = "kilowatt per tonne",
name2 = "kilowatts per tonne",
symbol = "kW/t",
utype = "power per unit mass",
scale = 1,
default = "PS/t",
link = "Power-to-weight ratio",
},
["PS/t"] = {
name1 = "metric horsepower per tonne",
name2 = "metric horsepower per tonne",
symbol = "PS/t",
utype = "power per unit mass",
scale = 0.73549875,
default = "kW/t",
link = "Power-to-weight ratio",
},
["shp/lb"] = {
name1 = "shaft horsepower per pound",
name2 = "shaft horsepower per pound",
symbol = "shp/lb",
utype = "power per unit mass",
scale = 1643.986806,
default = "kW/kg",
link = "Power-to-weight ratio",
},
["hp/tonne"] = {
target = "hp/t",
symbol = "hp/tonne",
default = "kW/tonne",
},
["kW/tonne"] = {
target = "kW/t",
symbol = "kW/tonne",
},
["-lb/in2"] = {
name1 = "pound per square inch",
name2 = "pounds per square inch",
symbol = "lb/in<sup>2</sup>",
utype = "pressure",
scale = 6894.7572931683608,
default = "kPa kgf/cm2",
},
["atm"] = {
name1 = "standard atmosphere",
symbol = "atm",
utype = "pressure",
scale = 101325,
default = "kPa",
link = "Atmosphere (unit)",
},
["Ba"] = {
name1 = "barye",
symbol = "Ba",
utype = "pressure",
scale = 0.1,
default = "Pa",
},
["bar"] = {
symbol = "bar",
utype = "pressure",
scale = 100000,
default = "kPa",
link = "Bar (unit)",
},
["dbar"] = {
name1 = "decibar",
symbol = "dbar",
utype = "pressure",
scale = 10000,
default = "kPa",
link = "Bar (unit)",
},
["inHg"] = {
name1 = "inch of mercury",
name2 = "inches of mercury",
symbol = "inHg",
utype = "pressure",
scale = 3386.388640341,
default = "kPa",
},
["kBa"] = {
name1 = "kilobarye",
symbol = "kBa",
utype = "pressure",
scale = 100,
default = "hPa",
link = "Barye",
},
["kg-f/cm2"] = {
name1 = "kilogram-force per square centimetre",
name1_us = "kilogram-force per square centimeter",
name2 = "kilograms-force per square centimetre",
name2_us = "kilograms-force per square centimeter",
symbol = "kg<sub>f</sub>/cm<sup>2</sup>",
utype = "pressure",
scale = 98066.5,
default = "psi",
link = "Kilogram-force",
},
["kg/cm2"] = {
name1 = "kilogram per square centimetre",
name1_us = "kilogram per square centimeter",
name2 = "kilograms per square centimetre",
name2_us = "kilograms per square centimeter",
symbol = "kg/cm<sup>2</sup>",
utype = "pressure",
scale = 98066.5,
default = "psi",
link = "Kilogram-force",
},
["kgf/cm2"] = {
name1 = "kilogram-force per square centimetre",
name1_us = "kilogram-force per square centimeter",
name2 = "kilograms-force per square centimetre",
name2_us = "kilograms-force per square centimeter",
symbol = "kgf/cm<sup>2</sup>",
utype = "pressure",
scale = 98066.5,
default = "psi",
link = "Kilogram-force",
},
["ksi"] = {
name1 = "kilopound per square inch",
name2 = "kilopounds per square inch",
symbol = "ksi",
utype = "pressure",
scale = 6894757.2931683613,
default = "MPa",
link = "Pound per square inch",
},
["lbf/in2"] = {
name1 = "pound-force per square inch",
name2 = "pounds-force per square inch",
symbol = "lbf/in<sup>2</sup>",
utype = "pressure",
scale = 6894.7572931683608,
default = "kPa kgf/cm2",
},
["mb"] = {
name1 = "millibar",
symbol = "mb",
utype = "pressure",
scale = 100,
default = "hPa",
link = "Bar (unit)",
},
["mbar"] = {
name1 = "millibar",
symbol = "mbar",
utype = "pressure",
scale = 100,
default = "hPa",
link = "Bar (unit)",
},
["mmHg"] = {
name1 = "millimetre of mercury",
name1_us = "millimeter of mercury",
name2 = "millimetres of mercury",
name2_us = "millimeters of mercury",
symbol = "mmHg",
utype = "pressure",
scale = 133.322387415,
default = "kPa",
},
["Pa"] = {
_name1 = "pascal",
_symbol = "Pa",
utype = "pressure",
scale = 1,
prefixes = 1,
default = "psi",
link = "Pascal (unit)",
},
["psf"] = {
name1 = "pound per square foot",
name2 = "pounds per square foot",
symbol = "psf",
utype = "pressure",
scale = 47.880258980335839,
default = "kPa",
link = "Pound per square inch",
},
["psi"] = {
name1 = "pound per square inch",
name2 = "pounds per square inch",
symbol = "psi",
utype = "pressure",
scale = 6894.7572931683608,
default = "kPa",
},
["Torr"] = {
name1 = "torr",
symbol = "Torr",
utype = "pressure",
scale = 133.32236842105263,
default = "kPa",
},
["N/cm2"] = {
per = { "N", "cm2" },
utype = "pressure",
default = "psi",
},
["N/m2"] = {
per = { "N", "m2" },
utype = "pressure",
default = "psi",
},
["g/cm2"] = {
per = { "g", "cm2" },
utype = "pressure",
default = "lb/sqft",
multiplier= 9.80665,
},
["g/m2"] = {
per = { "g", "m2" },
utype = "pressure",
default = "lb/sqft",
multiplier= 9.80665,
},
["kg/ha"] = {
per = { "kg", "ha" },
utype = "pressure",
default = "lb/acre",
multiplier= 9.80665,
},
["kg/m2"] = {
per = { "kg", "m2" },
utype = "pressure",
default = "lb/sqft",
multiplier= 9.80665,
},
["lb/1000sqft"] = {
per = { "lb", "1000sqft" },
utype = "pressure",
default = "g/m2",
multiplier= 9.80665,
},
["lb/acre"] = {
per = { "lb", "acre" },
utype = "pressure",
default = "kg/ha",
multiplier= 9.80665,
},
["lb/sqft"] = {
per = { "lb", "sqft" },
utype = "pressure",
default = "kg/m2",
multiplier= 9.80665,
},
["lb/sqyd"] = {
per = { "lb", "sqyd" },
utype = "pressure",
default = "kg/m2",
multiplier= 9.80665,
},
["LT/acre"] = {
per = { "LT", "acre" },
utype = "pressure",
default = "t/ha",
multiplier= 9.80665,
},
["MT/ha"] = {
per = { "MT", "ha" },
utype = "pressure",
default = "LT/acre ST/acre",
multiplier= 9.80665,
},
["oz/sqft"] = {
per = { "oz", "sqft" },
utype = "pressure",
default = "g/m2",
multiplier= 9.80665,
},
["oz/sqyd"] = {
per = { "oz", "sqyd" },
utype = "pressure",
default = "g/m2",
multiplier= 9.80665,
},
["ST/acre"] = {
per = { "ST", "acre" },
utype = "pressure",
default = "t/ha",
multiplier= 9.80665,
},
["t/ha"] = {
per = { "t", "ha" },
utype = "pressure",
default = "LT/acre ST/acre",
multiplier= 9.80665,
},
["tonne/acre"] = {
per = { "tonne", "acre" },
utype = "pressure",
default = "tonne/ha",
multiplier= 9.80665,
},
["tonne/ha"] = {
per = { "tonne", "ha" },
utype = "pressure",
default = "tonne/acre",
multiplier= 9.80665,
},
["kgfpsqcm"] = {
target = "kgf/cm2",
},
["kgpsqcm"] = {
target = "kg/cm2",
},
["kN/m2"] = {
target = "kPa",
},
["lb/in2"] = {
target = "lbf/in2",
},
["torr"] = {
target = "Torr",
},
["Bq"] = {
_name1 = "becquerel",
_symbol = "Bq",
utype = "radioactivity",
scale = 1,
prefixes = 1,
default = "pCi",
link = "Becquerel",
},
["Ci"] = {
_name1 = "curie",
_symbol = "Ci",
utype = "radioactivity",
scale = 3.7e10,
prefixes = 1,
default = "GBq",
link = "Curie (unit)",
},
["Rd"] = {
_name1 = "rutherford",
_symbol = "Rd",
utype = "radioactivity",
scale = 1e6,
prefixes = 1,
default = "MBq",
link = "Rutherford (unit)",
},
["cm/h"] = {
name1 = "centimetre per hour",
name1_us = "centimeter per hour",
name2 = "centimetres per hour",
name2_us = "centimeters per hour",
symbol = "cm/h",
utype = "speed",
scale = 2.7777777777777775e-6,
default = "in/h",
link = "Metre per second",
},
["cm/s"] = {
name1 = "centimetre per second",
name1_us = "centimeter per second",
name2 = "centimetres per second",
name2_us = "centimeters per second",
symbol = "cm/s",
utype = "speed",
scale = 0.01,
default = "in/s",
link = "Metre per second",
},
["cm/year"] = {
name1 = "centimetre per year",
name1_us = "centimeter per year",
name2 = "centimetres per year",
name2_us = "centimeters per year",
symbol = "cm/year",
utype = "speed",
scale = 3.168873850681143e-10,
default = "in/year",
link = "Orders of magnitude (speed)",
},
["foot/s"] = {
name1 = "foot per second",
name2 = "foot per second",
symbol = "ft/s",
utype = "speed",
scale = 0.3048,
default = "m/s",
},
["ft/min"] = {
name1 = "foot per minute",
name2 = "feet per minute",
symbol = "ft/min",
utype = "speed",
scale = 0.00508,
default = "m/min",
link = "Feet per second",
},
["ft/s"] = {
name1 = "foot per second",
name2 = "feet per second",
symbol = "ft/s",
utype = "speed",
scale = 0.3048,
default = "m/s",
link = "Feet per second",
},
["furlong per fortnight"] = {
name2 = "furlongs per fortnight",
symbol = "furlong per fortnight",
usename = 1,
utype = "speed",
scale = 0.00016630952380952381,
default = "km/h mph",
link = "FFF system",
},
["in/h"] = {
name1 = "inch per hour",
name2 = "inches per hour",
symbol = "in/h",
utype = "speed",
scale = 7.0555555555555559e-6,
default = "cm/h",
link = "Inch",
},
["in/s"] = {
name1 = "inch per second",
name2 = "inches per second",
symbol = "in/s",
utype = "speed",
scale = 0.0254,
default = "cm/s",
link = "Inch",
},
["in/year"] = {
name1 = "inch per year",
name2 = "inches per year",
symbol = "in/year",
utype = "speed",
scale = 8.0489395807301024e-10,
default = "cm/year",
link = "Orders of magnitude (speed)",
},
["isp"] = {
name1 = "second",
symbol = "s",
utype = "speed",
scale = 9.80665,
default = "km/s",
link = "Specific impulse",
},
["km/d"] = {
name1 = "kilometre per day",
name1_us = "kilometer per day",
name2 = "kilometres per day",
name2_us = "kilometers per day",
symbol = "km/d",
utype = "speed",
scale = 1.1574074074074074e-2,
default = "mi/d",
link = "Orders of magnitude (speed)",
},
["km/h"] = {
name1 = "kilometre per hour",
name1_us = "kilometer per hour",
name2 = "kilometres per hour",
name2_us = "kilometers per hour",
symbol = "km/h",
utype = "speed",
scale = 0.27777777777777779,
default = "mph",
link = "Kilometres per hour",
},
["km/s"] = {
name1 = "kilometre per second",
name1_us = "kilometer per second",
name2 = "kilometres per second",
name2_us = "kilometers per second",
symbol = "km/s",
utype = "speed",
scale = 1000,
default = "mi/s",
link = "Metre per second",
},
["kn"] = {
name1 = "knot",
symbol = "kn",
utype = "speed",
scale = 0.51444444444444448,
default = "km/h mph",
link = "Knot (unit)",
},
["kNs/kg"] = {
name2 = "kN‑s/kg",
symbol = "kN‑s/kg",
utype = "speed",
scale = 1000,
default = "isp",
link = "Specific impulse",
},
["m/min"] = {
name1 = "metre per minute",
name1_us = "meter per minute",
name2 = "metres per minute",
name2_us = "meters per minute",
symbol = "m/min",
utype = "speed",
scale = 0.016666666666666666,
default = "ft/min",
link = "Metre per second",
},
["m/s"] = {
name1 = "metre per second",
name1_us = "meter per second",
name2 = "metres per second",
name2_us = "meters per second",
symbol = "m/s",
utype = "speed",
scale = 1,
default = "ft/s",
},
["Mach"] = {
name2 = "Mach",
symbol = "Mach",
utype = "speed",
builtin = "mach",
scale = 0,
iscomplex= true,
default = "km/h mph",
link = "Mach number",
},
["mi/d"] = {
name1 = "mile per day",
name2 = "miles per day",
symbol = "mi/d",
utype = "speed",
scale = 1.8626666666666667e-2,
default = "km/d",
link = "Orders of magnitude (speed)",
},
["mi/s"] = {
name1 = "mile per second",
name2 = "miles per second",
symbol = "mi/s",
utype = "speed",
scale = 1609.344,
default = "km/s",
link = "Mile",
},
["mm/h"] = {
name1 = "millimetre per hour",
name1_us = "millimeter per hour",
name2 = "millimetres per hour",
name2_us = "millimeters per hour",
symbol = "mm/h",
utype = "speed",
scale = 2.7777777777777781e-7,
default = "in/h",
link = "Metre per second",
},
["mph"] = {
name1 = "mile per hour",
name2 = "miles per hour",
symbol = "mph",
utype = "speed",
scale = 0.44704,
default = "km/h",
link = "Miles per hour",
},
["Ns/kg"] = {
name2 = "N‑s/kg",
symbol = "N‑s/kg",
utype = "speed",
scale = 1,
default = "isp",
link = "Specific impulse",
},
["si tsfc"] = {
name2 = "g/(kN⋅s)",
symbol = "g/(kN⋅s)",
utype = "speed",
scale = 9.9999628621379242e-7,
invert = -1,
iscomplex= true,
default = "tsfc",
link = "Thrust specific fuel consumption",
},
["tsfc"] = {
name2 = "lb/(lbf⋅h)",
symbol = "lb/(lbf⋅h)",
utype = "speed",
scale = 2.832545036049801e-5,
invert = -1,
iscomplex= true,
default = "si tsfc",
link = "Thrust specific fuel consumption",
},
["cm/y"] = {
target = "cm/year",
},
["cm/yr"] = {
target = "cm/year",
},
["in/y"] = {
target = "in/year",
},
["in/yr"] = {
target = "in/year",
},
["knot"] = {
target = "kn",
},
["knots"] = {
target = "kn",
},
["kph"] = {
target = "km/h",
},
["mi/h"] = {
target = "mph",
},
["mm/s"] = {
per = { "mm", "s" },
utype = "speed",
default = "in/s",
link = "Metre per second",
},
["C"] = {
name1 = "degree Celsius",
name2 = "degrees Celsius",
symbol = "°C",
usesymbol= 1,
utype = "temperature",
scale = 1,
offset = -273.15,
iscomplex= true,
istemperature= true,
default = "F",
link = "Celsius",
},
["F"] = {
name1 = "degree Fahrenheit",
name2 = "degrees Fahrenheit",
symbol = "°F",
usesymbol= 1,
utype = "temperature",
scale = 0.55555555555555558,
offset = 32-273.15*(9/5),
iscomplex= true,
istemperature= true,
default = "C",
link = "Fahrenheit",
},
["K"] = {
_name1 = "kelvin",
_symbol = "K",
usesymbol= 1,
utype = "temperature",
scale = 1,
offset = 0,
iscomplex= true,
istemperature= true,
prefixes = 1,
default = "C F",
link = "Kelvin",
},
["keVT"] = {
name1 = "kiloelectronvolt",
symbol = "keV",
utype = "temperature",
scale = 11.604505e6,
offset = 0,
iscomplex= true,
default = "MK",
link = "Electronvolt",
},
["R"] = {
name1 = "degree Rankine",
name2 = "degrees Rankine",
symbol = "°R",
usesymbol= 1,
utype = "temperature",
scale = 0.55555555555555558,
offset = 0,
iscomplex= true,
istemperature= true,
default = "K F C",
link = "Rankine scale",
},
["Celsius"] = {
target = "C",
},
["°C"] = {
target = "C",
},
["°F"] = {
target = "F",
},
["°R"] = {
target = "R",
},
["C-change"] = {
name1 = "degree Celsius change",
name2 = "degrees Celsius change",
symbol = "°C",
usesymbol= 1,
utype = "temperature change",
scale = 1,
default = "F-change",
link = "Celsius",
},
["F-change"] = {
name1 = "degree Fahrenheit change",
name2 = "degrees Fahrenheit change",
symbol = "°F",
usesymbol= 1,
utype = "temperature change",
scale = 0.55555555555555558,
default = "C-change",
link = "Fahrenheit",
},
["K-change"] = {
name1 = "kelvin change",
name2 = "kelvins change",
symbol = "K",
usesymbol= 1,
utype = "temperature change",
scale = 1,
default = "F-change",
link = "Kelvin",
},
["°C-change"] = {
target = "C-change",
},
["°F-change"] = {
target = "F-change",
},
["century"] = {
name1 = "century",
name2 = "centuries",
symbol = "ha",
utype = "time",
scale = 3155760000,
default = "Gs",
},
["d"] = {
name1 = "day",
symbol = "d",
utype = "time",
scale = 86400,
default = "ks",
},
["decade"] = {
name1 = "decade",
symbol = "daa",
utype = "time",
scale = 315576000,
default = "Ms",
},
["dog year"] = {
name1 = "dog year",
symbol = "dog yr",
utype = "time",
scale = 220903200,
default = "years",
link = "List of unusual units of measurement#Dog year",
},
["fortnight"] = {
symbol = "fortnight",
usename = 1,
utype = "time",
scale = 1209600,
default = "week",
},
["h"] = {
name1 = "hour",
symbol = "h",
utype = "time",
scale = 3600,
default = "ks",
},
["long billion year"] = {
name1 = "billion years",
name2 = "billion years",
symbol = "Ta",
utype = "time",
scale = 31557600000000000000,
default = "Es",
link = "Annum",
},
["millennium"] = {
name1 = "millennium",
name2 = "millennia",
symbol = "ka",
utype = "time",
scale = 31557600000,
default = "Gs",
},
["milliard year"] = {
name1 = "milliard years",
name2 = "milliard years",
symbol = "Ga",
utype = "time",
scale = 31557600000000000,
default = "Ps",
link = "Annum",
},
["million year"] = {
name1 = "million years",
name2 = "million years",
symbol = "Ma",
utype = "time",
scale = 31557600000000,
default = "Ts",
link = "Annum",
},
["min"] = {
name1 = "minute",
symbol = "min",
utype = "time",
scale = 60,
default = "s",
},
["month"] = {
symbol = "month",
usename = 1,
utype = "time",
scale = 2629800,
default = "Ms",
},
["months"] = {
name1 = "month",
symbol = "mo",
utype = "time",
scale = 2629800,
default = "year",
},
["s"] = {
_name1 = "second",
_symbol = "s",
utype = "time",
scale = 1,
prefixes = 1,
default = "v < 7200 ! min ! h",
link = "Second",
},
["short billion year"] = {
name1 = "billion years",
name2 = "billion years",
symbol = "Ga",
utype = "time",
scale = 31557600000000000,
default = "Ps",
link = "Annum",
},
["short trillion year"] = {
name1 = "trillion years",
name2 = "trillion years",
symbol = "Ta",
utype = "time",
scale = 31557600000000000000,
default = "Es",
link = "Annum",
},
["thousand million year"] = {
name1 = "thousand million years",
name2 = "thousand million years",
symbol = "Ga",
utype = "time",
scale = 31557600000000000,
default = "Ps",
link = "Annum",
},
["wk"] = {
symbol = "week",
usename = 1,
utype = "time",
scale = 604800,
default = "Ms",
},
["year"] = {
name1 = "year",
symbol = "a",
utype = "time",
scale = 31557600,
default = "Ms",
link = "Annum",
},
["years"] = {
name1 = "year",
symbol = "yr",
utype = "time",
scale = 31557600,
default = "Ms",
link = "Annum",
},
["byr"] = {
target = "short billion year",
},
["day"] = {
target = "d",
},
["days"] = {
target = "d",
},
["dog yr"] = {
target = "dog year",
},
["Gyr"] = {
target = "thousand million year",
},
["hour"] = {
target = "h",
},
["hours"] = {
target = "h",
},
["kMyr"] = {
target = "thousand million year",
},
["kmyr"] = {
target = "thousand million year",
},
["kyr"] = {
target = "millennium",
},
["long byr"] = {
target = "long billion year",
},
["minute"] = {
target = "min",
},
["minutes"] = {
target = "min",
},
["mth"] = {
target = "month",
},
["Myr"] = {
target = "million year",
},
["myr"] = {
target = "million year",
},
["sec"] = {
target = "s",
},
["second"] = {
target = "s",
},
["seconds"] = {
target = "s",
},
["tmyr"] = {
target = "thousand million year",
},
["tryr"] = {
target = "short trillion year",
},
["tyr"] = {
target = "millennium",
},
["week"] = {
target = "wk",
},
["weeks"] = {
target = "wk",
},
["yr"] = {
target = "year",
},
["kg.m"] = {
name1 = "kilogram metre",
name1_us = "kilogram meter",
symbol = "kg⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbft",
link = "Kilogram metre (torque)",
},
["kgf.m"] = {
name1 = "kilogram force-metre",
name1_us = "kilogram force-meter",
symbol = "kgf⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["kgm"] = {
name1 = "kilogram metre",
name1_us = "kilogram meter",
symbol = "kg⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["kpm"] = {
name1 = "kilopond metre",
name1_us = "kilopond meter",
symbol = "kp⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbft",
link = "Kilogram metre (torque)",
},
["lb-fft"] = {
name1 = "pound force-foot",
name2 = "pound force-feet",
symbol = "ft⋅lb<sub>f</sub>",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["lb.ft"] = {
name1 = "pound force-foot",
name2 = "pound force-feet",
symbol = "lb⋅ft",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["lb.in"] = {
name1 = "pound force-inch",
symbol = "lb⋅in",
utype = "torque",
scale = 0.1129848290276167,
default = "mN.m",
link = "Pound-foot (torque)",
},
["lbfft"] = {
name1 = "pound force-foot",
name2 = "pound force-feet",
symbol = "lbf⋅ft",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["lbft"] = {
name1 = "pound-foot",
name2 = "pound-feet",
symbol = "lb⋅ft",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["m.kg-f"] = {
name1 = "metre kilogram-force",
name1_us = "meter kilogram-force",
name2 = "metre kilograms-force",
name2_us = "meter kilograms-force",
symbol = "m⋅kg<sub>f</sub>",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["m.kgf"] = {
name1 = "metre kilogram-force",
name1_us = "meter kilogram-force",
name2 = "metre kilograms-force",
name2_us = "meter kilograms-force",
symbol = "m⋅kgf",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["mN.m"] = {
name1 = "millinewton-metre",
name1_us = "millinewton-meter",
symbol = "mN⋅m",
utype = "torque",
scale = 0.001,
default = "lb.in",
link = "Newton-metre",
},
["Nm"] = {
_name1 = "newton-metre",
_name1_us= "newton-meter",
_symbol = "N⋅m",
utype = "torque",
alttype = "energy",
scale = 1,
prefixes = 1,
default = "lbfft",
link = "Newton-metre",
},
["kN/m"] = {
per = { "kN", "-m-stiff" },
utype = "torque",
default = "lbf/in",
},
["lbf/in"] = {
per = { "lbf", "-in-stiff" },
utype = "torque",
default = "kN/m",
},
["lb-f.ft"] = {
target = "lb-fft",
},
["lbf.ft"] = {
target = "lbfft",
},
["lbf·ft"] = {
target = "lbfft",
},
["lb·ft"] = {
target = "lb.ft",
},
["mkg-f"] = {
target = "m.kg-f",
},
["mkgf"] = {
target = "m.kgf",
},
["N.m"] = {
target = "Nm",
},
["N·m"] = {
target = "Nm",
},
["ton-mile"] = {
symbol = "ton-mile",
usename = 1,
utype = "transportation",
scale = 1.4599723182105602,
default = "tkm",
},
["tkm"] = {
name1 = "tonne-kilometre",
name1_us = "tonne-kilometer",
symbol = "tkm",
utype = "transportation",
scale = 1,
default = "ton-mile",
},
["-12USoz(mL)serve"] = {
name1_us = "12 U.S. fl oz (355 mL) serving",
symbol = "12 US fl oz (355 mL) serving",
sym_us = "12 U.S. fl oz (355 mL) serving",
utype = "volume",
scale = 0.00035488235475000004,
default = "mL",
link = "Beverage can#Standard sizes",
},
["-12USoz(ml)serve"] = {
name1_us = "12 U.S. fl oz (355 ml) serving",
symbol = "12 US fl oz (355 ml) serving",
sym_us = "12 U.S. fl oz (355 ml) serving",
utype = "volume",
scale = 0.00035488235475000004,
default = "ml",
link = "Beverage can#Standard sizes",
},
["-12USozserve"] = {
name1_us = "12 U.S. fl oz serving",
symbol = "12 US fl oz serving",
sym_us = "12 U.S. fl oz serving",
utype = "volume",
scale = 0.00035488235475000004,
default = "mL",
link = "Beverage can#Standard sizes",
},
["acre-foot"] = {
name1 = "acre-foot",
name2 = "acre-foot",
symbol = "acre⋅ft",
utype = "volume",
scale = 1233.48183754752,
default = "m3",
},
["acre-ft"] = {
name1 = "acre-foot",
name2 = "acre-feet",
symbol = "acre⋅ft",
utype = "volume",
scale = 1233.48183754752,
default = "m3",
},
["AUtbsp"] = {
name1 = "Australian tablespoon",
symbol = "AU tbsp",
utype = "volume",
scale = 0.000020,
default = "ml",
},
["Bcuft"] = {
name1 = "billion cubic foot",
name2 = "billion cubic feet",
symbol = "billion cu ft",
utype = "volume",
scale = 28316846.592,
default = "Gl",
link = "Cubic foot",
},
["bdft"] = {
name1 = "board foot",
name2 = "board feet",
symbol = "bd ft",
utype = "volume",
scale = 0.0023597372167,
default = "m3",
},
["board feet"] = {
name2 = "board feet",
symbol = "board foot",
usename = 1,
utype = "volume",
scale = 0.0023597372167,
default = "m3",
},
["board foot"] = {
name2 = "board foot",
symbol = "board foot",
usename = 1,
utype = "volume",
scale = 0.0023597372167,
default = "m3",
},
["cc"] = {
name1 = "cubic centimetre",
name1_us = "cubic centimeter",
symbol = "cc",
utype = "volume",
scale = 0.000001,
default = "cuin",
},
["CID"] = {
name1 = "cubic inch",
name2 = "cubic inches",
symbol = "cu in",
utype = "volume",
scale = 0.000016387064,
default = "cc",
link = "Cubic inch#Engine displacement",
},
["cord"] = {
symbol = "cord",
utype = "volume",
scale = 3.624556363776,
default = "m3",
link = "Cord (unit)",
},
["cufoot"] = {
name1 = "cubic foot",
name2 = "cubic foot",
symbol = "cu ft",
utype = "volume",
scale = 0.028316846592,
default = "m3",
},
["cuft"] = {
name1 = "cubic foot",
name2 = "cubic feet",
symbol = "cu ft",
utype = "volume",
scale = 0.028316846592,
default = "m3",
},
["cuin"] = {
name1 = "cubic inch",
name2 = "cubic inches",
symbol = "cu in",
utype = "volume",
scale = 0.000016387064,
default = "cm3",
},
["cumi"] = {
name1 = "cubic mile",
symbol = "cu mi",
utype = "volume",
scale = 4168181825.440579584,
default = "km3",
},
["cuyd"] = {
name1 = "cubic yard",
symbol = "cu yd",
utype = "volume",
scale = 0.764554857984,
default = "m3",
},
["firkin"] = {
symbol = "firkin",
usename = 1,
utype = "volume",
scale = 0.04091481,
default = "L impgal USgal",
link = "Firkin (unit)",
},
["foot3"] = {
target = "cufoot",
},
["Goilbbl"] = {
name1 = "billion barrels",
name2 = "billion barrels",
symbol = "Gbbl",
utype = "volume",
scale = 158987294.928,
default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["gr water"] = {
name1 = "grains water",
name2 = "grains water",
symbol = "gr H<sub>2</sub>O",
utype = "volume",
scale = 0.00000006479891,
default = "cm3",
link = "Grain (unit)",
},
["grt"] = {
name1 = "gross register ton",
symbol = "grt",
utype = "volume",
scale = 2.8316846592,
default = "m3",
link = "Gross register tonnage",
},
["impbbl"] = {
name1 = "imperial barrel",
symbol = "imp bbl",
utype = "volume",
scale = 0.16365924,
default = "L impgal USgal",
link = "Barrel (unit)",
},
["impbsh"] = {
name1 = "imperial bushel",
symbol = "imp bsh",
utype = "volume",
scale = 0.03636872,
default = "L impgal USdrygal",
},
["impbu"] = {
name1 = "imperial bushel",
symbol = "imp bu",
utype = "volume",
scale = 0.03636872,
default = "m3",
},
["impgal"] = {
name1 = "imperial gallon",
symbol = "imp gal",
utype = "volume",
scale = 0.00454609,
default = "L USgal",
},
["impgi"] = {
name1 = "gill",
symbol = "gi",
utype = "volume",
scale = 0.0001420653125,
default = "ml USoz",
link = "Gill (unit)",
},
["impkenning"] = {
name1 = "imperial kenning",
symbol = "kenning",
utype = "volume",
scale = 0.01818436,
default = "L USdrygal",
link = "Kenning (unit)",
},
["impoz"] = {
name1 = "imperial fluid ounce",
symbol = "imp fl oz",
utype = "volume",
scale = 0.0000284130625,
default = "ml USoz",
},
["imppk"] = {
name1 = "imperial peck",
symbol = "pk",
utype = "volume",
scale = 0.00909218,
default = "L USdrygal",
link = "Peck",
},
["imppt"] = {
name1 = "imperial pint",
symbol = "imp pt",
utype = "volume",
scale = 0.00056826125,
default = "L",
},
["impqt"] = {
name1 = "imperial quart",
symbol = "imp qt",
utype = "volume",
scale = 0.0011365225,
default = "ml USoz",
customary= 3,
},
["kilderkin"] = {
symbol = "kilderkin",
usename = 1,
utype = "volume",
scale = 0.08182962,
default = "L impgal USgal",
},
["koilbbl"] = {
name1 = "thousand barrels",
name2 = "thousand barrels",
symbol = "kbbl",
utype = "volume",
scale = 158.987294928,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["L"] = {
_name1 = "litre",
_name1_us= "liter",
_symbol = "L",
utype = "volume",
scale = 0.001,
prefixes = 1,
default = "impgal USgal",
link = "Litre",
},
["l"] = {
_name1 = "litre",
_name1_us= "liter",
_symbol = "l",
utype = "volume",
scale = 0.001,
prefixes = 1,
default = "impgal USgal",
link = "Litre",
},
["ll"] = {
name1 = "litre",
name1_us = "liter",
symbol = "l",
utype = "volume",
scale = 0.001,
default = "impgal USgal",
},
["m3"] = {
_name1 = "cubic metre",
_name1_us= "cubic meter",
_symbol = "m<sup>3</sup>",
prefix_position= 7,
utype = "volume",
scale = 1,
prefixes = 3,
default = "cuft",
link = "Cubic metre",
},
["Mbbl"] = {
name1 = "thousand barrels",
name2 = "thousand barrels",
symbol = "Mbbl",
utype = "volume",
scale = 158.987294928,
default = "v * 1.58987294928 < 10 ! e3 ! ! m3",
link = "Barrel (unit)#Oil barrel",
},
["MMoilbbl"] = {
name1 = "million barrels",
name2 = "million barrels",
symbol = "MMbbl",
utype = "volume",
scale = 158987.294928,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["Moilbbl"] = {
name1 = "million barrels",
name2 = "million barrels",
symbol = "Mbbl",
utype = "volume",
scale = 158987.294928,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["MTON"] = {
name1 = "measurement ton",
symbol = "MTON",
utype = "volume",
scale = 1.13267386368,
default = "m3",
},
["MUSgal"] = {
name1 = "million US gallons",
name1_us = "million U.S. gallons",
name2 = "million US gallons",
name2_us = "million U.S. gallons",
symbol = "million US gal",
sym_us = "million U.S. gal",
utype = "volume",
scale = 3785.411784,
default = "Ml",
link = "US gallon",
},
["oilbbl"] = {
name1 = "barrel",
symbol = "bbl",
utype = "volume",
scale = 0.158987294928,
default = "m3",
link = "Barrel (unit)#Oil barrel",
},
["stere"] = {
symbol = "stere",
usename = 1,
utype = "volume",
scale = 1,
default = "cuft",
},
["Toilbbl"] = {
name1 = "trillion barrels",
name2 = "trillion barrels",
symbol = "Tbbl",
utype = "volume",
scale = 158987294928,
default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["USbbl"] = {
name1 = "US barrel",
name1_us = "U.S. barrel",
symbol = "US bbl",
sym_us = "U.S. bbl",
utype = "volume",
scale = 0.119240471196,
default = "L USgal impgal",
link = "Barrel (unit)",
},
["USbeerbbl"] = {
name1 = "US beer barrel",
name1_us = "U.S. beer barrel",
symbol = "US bbl",
sym_us = "U.S. bbl",
utype = "volume",
scale = 0.117347765304,
default = "L USgal impgal",
link = "Barrel (unit)",
},
["USbsh"] = {
name1 = "US bushel",
name1_us = "U.S. bushel",
symbol = "US bsh",
sym_us = "U.S. bsh",
utype = "volume",
scale = 0.03523907016688,
default = "L USdrygal impgal",
link = "Bushel",
},
["USbu"] = {
name1 = "US bushel",
name1_us = "U.S. bushel",
symbol = "US bu",
sym_us = "U.S. bu",
utype = "volume",
scale = 0.03523907016688,
default = "L USdrygal impgal",
link = "Bushel",
},
["USdrybbl"] = {
name1 = "US dry barrel",
name1_us = "U.S. dry barrel",
symbol = "US dry bbl",
sym_us = "U.S. dry bbl",
utype = "volume",
scale = 0.11562819898508,
default = "m3",
link = "Barrel (unit)",
},
["USdrygal"] = {
name1 = "US dry gallon",
name1_us = "U.S. dry gallon",
symbol = "US dry gal",
sym_us = "U.S. dry gal",
utype = "volume",
scale = 0.00440488377086,
default = "L",
link = "Gallon",
},
["USdrypt"] = {
name1 = "US dry pint",
name1_us = "U.S. dry pint",
symbol = "US dry pt",
sym_us = "U.S. dry pt",
utype = "volume",
scale = 0.0005506104713575,
default = "ml",
link = "Pint",
},
["USdryqt"] = {
name1 = "US dry quart",
name1_us = "U.S. dry quart",
symbol = "US dry qt",
sym_us = "U.S. dry qt",
utype = "volume",
scale = 0.001101220942715,
default = "ml",
link = "Quart",
},
["USflgal"] = {
name1 = "US gallon",
name1_us = "U.S. gallon",
symbol = "US fl gal",
sym_us = "U.S. fl gal",
utype = "volume",
scale = 0.003785411784,
default = "L impgal",
link = "Gallon",
},
["USgal"] = {
name1 = "US gallon",
name1_us = "U.S. gallon",
symbol = "US gal",
sym_us = "U.S. gal",
utype = "volume",
scale = 0.003785411784,
default = "L impgal",
},
["USgi"] = {
name1 = "gill",
symbol = "gi",
utype = "volume",
scale = 0.0001182941183,
default = "ml impoz",
link = "Gill (unit)",
},
["USkenning"] = {
name1 = "US kenning",
name1_us = "U.S. kenning",
symbol = "US kenning",
sym_us = "U.S. kenning",
utype = "volume",
scale = 0.01761953508344,
default = "L impgal",
link = "Kenning (unit)",
},
["USmin"] = {
name1 = "US minim",
name1_us = "U.S. minim",
symbol = "US min",
sym_us = "U.S. min",
utype = "volume",
scale = 0.000000061611519921875,
default = "ml",
link = "Minim (unit)",
},
["USoz"] = {
name1 = "US fluid ounce",
name1_us = "U.S. fluid ounce",
symbol = "US fl oz",
sym_us = "U.S. fl oz",
utype = "volume",
scale = 0.0000295735295625,
default = "ml",
},
["USpk"] = {
name1 = "US peck",
name1_us = "U.S. peck",
symbol = "US pk",
sym_us = "U.S. pk",
utype = "volume",
scale = 0.00880976754172,
default = "L impgal",
link = "Peck",
},
["USpt"] = {
name1 = "US pint",
name1_us = "U.S. pint",
symbol = "US pt",
sym_us = "U.S. pt",
utype = "volume",
scale = 0.000473176473,
default = "L imppt",
link = "Pint",
},
["USqt"] = {
name1 = "US quart",
name1_us = "U.S. quart",
symbol = "US qt",
sym_us = "U.S. qt",
utype = "volume",
scale = 0.000946352946,
default = "ml",
link = "Quart",
customary= 1,
},
["USquart"] = {
name1 = "US quart",
name1_us = "U.S. quart",
symbol = "US qt",
sym_us = "U.S. qt",
utype = "volume",
scale = 0.000946352946,
default = "ml impoz",
link = "Quart",
},
["UStbsp"] = {
name1 = "US tablespoon",
name1_us = "U.S. tablespoon",
symbol = "US tbsp",
sym_us = "U.S. tbsp",
utype = "volume",
scale = 1.4786764781250001e-5,
default = "ml",
},
["winecase"] = {
symbol = "case",
usename = 1,
utype = "volume",
scale = 0.009,
default = "L",
link = "Case (goods)",
},
["*U.S.drygal"] = {
target = "USdrygal",
sp_us = true,
customary= 2,
},
["*U.S.gal"] = {
target = "USgal",
sp_us = true,
customary= 2,
},
["+USdrygal"] = {
target = "USdrygal",
customary= 1,
},
["+usfloz"] = {
target = "USoz",
link = "Fluid ounce",
customary= 1,
},
["+USgal"] = {
target = "USgal",
customary= 1,
},
["+USoz"] = {
target = "USoz",
customary= 1,
},
["@impgal"] = {
target = "impgal",
link = "Gallon",
customary= 3,
},
["acre feet"] = {
target = "acre-ft",
},
["acre foot"] = {
target = "acre-foot",
},
["acre ft"] = {
target = "acre-ft",
},
["acre-feet"] = {
target = "acre-ft",
},
["acre.foot"] = {
target = "acre-foot",
},
["acre.ft"] = {
target = "acre-ft",
},
["acre·ft"] = {
target = "acre-ft",
},
["bushels"] = {
target = "USbsh",
},
["cid"] = {
target = "CID",
},
["ft3"] = {
target = "cuft",
},
["gal"] = {
target = "USgal",
},
["gallon"] = {
shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallon%})",
},
["gallons"] = {
shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallons%})",
},
["Gcuft"] = {
target = "e9cuft",
},
["impfloz"] = {
target = "impoz",
},
["Impgal"] = {
target = "impgal",
},
["in3"] = {
target = "cuin",
symbol = "in<sup>3</sup>",
},
["hm³"] = {
target = "hm3",
},
["kcuft"] = {
target = "e3cuft",
},
["kcum"] = {
target = "e3m3",
},
["km³"] = {
target = "km3",
},
["liter"] = {
target = "L",
sp_us = true,
},
["liters"] = {
target = "L",
sp_us = true,
},
["litre"] = {
target = "L",
},
["litres"] = {
target = "L",
},
["Mcuft"] = {
target = "e6cuft",
},
["Mcum"] = {
target = "e6m3",
},
["Mft3"] = {
target = "e6cuft",
},
["mi3"] = {
target = "cumi",
},
["m³"] = {
target = "m3",
},
["Pcuft"] = {
target = "e15cuft",
},
["pt"] = {
shouldbe = "Use %{USpt%} for US pints or %{imppt%} for imperial pints (not %{pt%})",
},
["qt"] = {
shouldbe = "Use %{USqt%} for US quarts or %{impqt%} for imperial quarts (not %{qt%})",
},
["Tcuft"] = {
target = "e12cuft",
},
["Tft3"] = {
target = "e12cuft",
},
["U.S.bbl"] = {
target = "USbbl",
sp_us = true,
default = "L U.S.gal impgal",
},
["U.S.beerbbl"] = {
target = "USbeerbbl",
sp_us = true,
default = "L U.S.gal impgal",
},
["U.S.bsh"] = {
target = "USbsh",
sp_us = true,
default = "L U.S.drygal impgal",
},
["U.S.bu"] = {
target = "USbu",
sp_us = true,
default = "L U.S.drygal impgal",
},
["U.S.drybbl"] = {
target = "USdrybbl",
sp_us = true,
},
["U.S.drygal"] = {
target = "USdrygal",
sp_us = true,
},
["U.S.drypt"] = {
target = "USdrypt",
sp_us = true,
},
["U.S.dryqt"] = {
target = "USdryqt",
sp_us = true,
},
["U.S.flgal"] = {
target = "USflgal",
sp_us = true,
},
["U.S.floz"] = {
target = "USoz",
sp_us = true,
},
["U.S.gal"] = {
target = "USgal",
sp_us = true,
link = "U.S. gallon",
},
["u.s.gal"] = {
target = "USgal",
sp_us = true,
link = "U.S. gallon",
},
["U.S.gi"] = {
target = "USgi",
sp_us = true,
},
["U.S.kenning"] = {
target = "USkenning",
sp_us = true,
},
["U.S.oz"] = {
target = "USoz",
sp_us = true,
},
["U.S.pk"] = {
target = "USpk",
sp_us = true,
},
["U.S.pt"] = {
target = "USpt",
sp_us = true,
},
["U.S.qt"] = {
target = "USqt",
sp_us = true,
default = "L impqt",
customary= 2,
},
["usbbl"] = {
target = "USbbl",
},
["usbeerbbl"] = {
target = "USbeerbbl",
},
["usbsh"] = {
target = "USbsh",
},
["usbu"] = {
target = "USbu",
},
["usdrybbl"] = {
target = "USdrybbl",
},
["usdrygal"] = {
target = "USdrygal",
},
["usdrypt"] = {
target = "USdrypt",
},
["usdryqt"] = {
target = "USdryqt",
},
["USfloz"] = {
target = "USoz",
},
["usfloz"] = {
target = "USoz",
},
["USGAL"] = {
target = "USgal",
},
["usgal"] = {
target = "USgal",
},
["usgi"] = {
target = "USgi",
},
["uskenning"] = {
target = "USkenning",
},
["usoz"] = {
target = "USoz",
},
["uspk"] = {
target = "USpk",
},
["uspt"] = {
target = "USpt",
},
["usqt"] = {
target = "USqt",
},
["yd3"] = {
target = "cuyd",
},
["cuft/sqmi"] = {
per = { "cuft", "sqmi" },
utype = "volume per unit area",
default = "m3/km2",
},
["m3/ha"] = {
name1 = "cubic metre per hectare",
name1_us = "cubic meter per hectare",
name2 = "cubic metres per hectare",
name2_us = "cubic meters per hectare",
symbol = "m<sup>3</sup>/ha",
utype = "volume per unit area",
scale = 0.0001,
default = "USbu/acre",
link = "Hectare",
},
["m3/km2"] = {
per = { "m3", "km2" },
utype = "volume per unit area",
default = "cuft/sqmi",
},
["U.S.gal/acre"] = {
per = { "U.S.gal", "acre" },
utype = "volume per unit area",
default = "m3/km2",
},
["USbu/acre"] = {
name2 = "US bushels per acre",
symbol = "US bushel per acre",
usename = 1,
utype = "volume per unit area",
scale = 8.7077638761350888e-6,
default = "m3/ha",
link = "Bushel",
},
["USgal/acre"] = {
per = { "USgal", "acre" },
utype = "volume per unit area",
default = "m3/km2",
},
["cuyd/mi"] = {
per = { "cuyd", "mi" },
utype = "volume per unit length",
default = "m3/km",
},
["m3/km"] = {
per = { "m3", "km" },
utype = "volume per unit length",
default = "cuyd/mi",
},
["mich"] = {
combination= { "ch", "mi" },
multiple = { 80 },
utype = "length",
},
["michlk"] = {
combination= { "chlk", "mi" },
multiple = { 80 },
utype = "length",
},
["michainlk"] = {
combination= { "chainlk", "mi" },
multiple = { 80 },
utype = "length",
},
["miyd"] = {
combination= { "yd", "mi" },
multiple = { 1760 },
utype = "length",
},
["miydftin"] = {
combination= { "in", "ft", "yd", "mi" },
multiple = { 12, 3, 1760 },
utype = "length",
},
["mift"] = {
combination= { "ft", "mi" },
multiple = { 5280 },
utype = "length",
},
["ydftin"] = {
combination= { "in", "ft", "yd" },
multiple = { 12, 3 },
utype = "length",
},
["ydft"] = {
combination= { "ft", "yd" },
multiple = { 3 },
utype = "length",
},
["ftin"] = {
combination= { "in", "ft" },
multiple = { 12 },
utype = "length",
},
["footin"] = {
combination= { "in", "foot" },
multiple = { 12 },
utype = "length",
},
["handin"] = {
combination= { "in", "hand" },
multiple = { 4 },
utype = "length",
},
["lboz"] = {
combination= { "oz", "lb" },
multiple = { 16 },
utype = "mass",
},
["stlb"] = {
combination= { "lb", "st" },
multiple = { 14 },
utype = "mass",
},
["stlboz"] = {
combination= { "oz", "lb", "st" },
multiple = { 16, 14 },
utype = "mass",
},
["st and lb"] = {
combination= { "lb", "st" },
multiple = { 14 },
utype = "mass",
},
["GN LTf"] = {
combination= { "GN", "-LTf" },
utype = "force",
},
["GN LTf STf"] = {
combination= { "GN", "-LTf", "-STf" },
utype = "force",
},
["GN STf"] = {
combination= { "GN", "-STf" },
utype = "force",
},
["GN STf LTf"] = {
combination= { "GN", "-STf", "-LTf" },
utype = "force",
},
["kN LTf"] = {
combination= { "kN", "-LTf" },
utype = "force",
},
["kN LTf STf"] = {
combination= { "kN", "-LTf", "-STf" },
utype = "force",
},
["kN STf"] = {
combination= { "kN", "-STf" },
utype = "force",
},
["kN STf LTf"] = {
combination= { "kN", "-STf", "-LTf" },
utype = "force",
},
["LTf STf"] = {
combination= { "-LTf", "-STf" },
utype = "force",
},
["MN LTf"] = {
combination= { "MN", "-LTf" },
utype = "force",
},
["MN LTf STf"] = {
combination= { "MN", "-LTf", "-STf" },
utype = "force",
},
["MN STf"] = {
combination= { "MN", "-STf" },
utype = "force",
},
["MN STf LTf"] = {
combination= { "MN", "-STf", "-LTf" },
utype = "force",
},
["STf LTf"] = {
combination= { "-STf", "-LTf" },
utype = "force",
},
["L/100 km mpgimp"] = {
combination= { "L/100 km", "mpgimp" },
utype = "fuel efficiency",
},
["l/100 km mpgimp"] = {
combination= { "l/100 km", "mpgimp" },
utype = "fuel efficiency",
},
["L/100 km mpgUS"] = {
combination= { "L/100 km", "mpgus" },
utype = "fuel efficiency",
},
["L/100 km mpgus"] = {
combination= { "L/100 km", "mpgus" },
utype = "fuel efficiency",
},
["l/100 km mpgus"] = {
combination= { "l/100 km", "mpgus" },
utype = "fuel efficiency",
},
["mpgimp L/100 km"] = {
combination= { "mpgimp", "L/100 km" },
utype = "fuel efficiency",
},
["LT ST t"] = {
combination= { "lt", "-ST", "t" },
utype = "mass",
},
["LT t ST"] = {
combination= { "lt", "t", "-ST" },
utype = "mass",
},
["ST LT t"] = {
combination= { "-ST", "lt", "t" },
utype = "mass",
},
["ST t LT"] = {
combination= { "-ST", "t", "lt" },
utype = "mass",
},
["t LT ST"] = {
combination= { "t", "lt", "-ST" },
utype = "mass",
},
["ton"] = {
combination= { "LT", "ST" },
utype = "mass",
},
["kPa kg/cm2"] = {
combination= { "kPa", "kgf/cm2" },
utype = "pressure",
},
["kPa lb/in2"] = {
combination= { "kPa", "-lb/in2" },
utype = "pressure",
},
["floz"] = {
combination= { "impoz", "USoz" },
utype = "volume",
},
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local default_exceptions = {
-- Prefixed units with a default different from that of the base unit.
-- Each key item is a prefixed symbol (unitcode for engineering notation).
["cm<sup>2</sup>"] = "sqin",
["dm<sup>2</sup>"] = "sqin",
["e3acre"] = "km2",
["e3m2"] = "e6sqft",
["e6acre"] = "km2",
["e6ha"] = "e6acre",
["e6km2"] = "e6sqmi",
["e6m2"] = "e6sqft",
["e6sqft"] = "v * 9.290304 < 100 ! e3 ! e6 ! m2",
["e6sqmi"] = "e6km2",
["hm<sup>2</sup>"] = "acre",
["km<sup>2</sup>"] = "sqmi",
["mm<sup>2</sup>"] = "sqin",
["aJ"] = "eV",
["e3BTU"] = "MJ",
["e6BTU"] = "GJ",
["EJ"] = "kWh",
["fJ"] = "keV",
["GJ"] = "kWh",
["MJ"] = "kWh",
["PJ"] = "kWh",
["pJ"] = "MeV",
["TJ"] = "kWh",
["YJ"] = "kWh",
["yJ"] = "μeV",
["ZJ"] = "kWh",
["zJ"] = "meV",
["e12cuft/a"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/a",
["e12cuft/d"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/d",
["e12m3/a"] = "Tcuft/a",
["e12m3/d"] = "Tcuft/d",
["e3cuft/a"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/a",
["e3cuft/d"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/d",
["e3cuft/s"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/s",
["e3m3/a"] = "v < 28.316846592 ! k ! M ! cuft/a",
["e3m3/d"] = "v < 28.316846592 ! k ! M ! cuft/d",
["e3m3/s"] = "v < 28.316846592 ! k ! M ! cuft/s",
["e3USgal/a"] = "v * 3.785411784 < 1000 ! ! e3 ! m3/a",
["e6cuft/a"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/a",
["e6cuft/d"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/d",
["e6cuft/s"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/s",
["e6m3/a"] = "v < 28.316846592 ! M ! G ! cuft/a",
["e6m3/d"] = "v < 28.316846592 ! M ! G ! cuft/d",
["e6m3/s"] = "v < 28.316846592 ! e6 ! e9 ! cuft/s",
["e6USgal/a"] = "v * 3.785411784 < 1000 ! e3 ! e6 ! m3/a",
["e9cuft/a"] = "m3/a",
["e9cuft/d"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3/d",
["e9m3/a"] = "v < 28.316846592 ! G ! T ! cuft/a",
["e9m3/d"] = "v < 28.316846592 ! G ! T ! cuft/d",
["e9m3/s"] = "v < 28.316846592 ! e9 ! e12 ! cuft/s",
["e9USgal/a"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/a",
["e9USgal/s"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/s",
["nN"] = "gr-f",
["μN"] = "gr-f",
["mN"] = "oz-f",
["am"] = "in",
["cm"] = "in",
["dam"] = "ft",
["dm"] = "in",
["e12km"] = "e12mi",
["e12mi"] = "e12km",
["e3AU"] = "ly",
["e3km"] = "e3mi",
["e3mi"] = "e3km",
["e6km"] = "e6mi",
["e6mi"] = "e6km",
["e9km"] = "AU",
["e9mi"] = "e9km",
["Em"] = "mi",
["fm"] = "in",
["Gm"] = "mi",
["hm"] = "ft",
["km"] = "mi",
["mm"] = "in",
["Mm"] = "mi",
["nm"] = "in",
["Pm"] = "mi",
["pm"] = "in",
["Tm"] = "mi",
["Ym"] = "mi",
["ym"] = "in",
["Zm"] = "mi",
["zm"] = "in",
["μm"] = "in",
["e12lb"] = "v * 4.5359237 < 10 ! Mt ! Gt",
["e3lb"] = "v * 4.5359237 < 10 ! kg ! t",
["e3ozt"] = "v * 0.311034768 < 10 ! kg ! t",
["e3t"] = "LT ST",
["e6carat"] = "t",
["e6lb"] = "v * 4.5359237 < 10 ! t ! kilotonne",
["e6ozt"] = "lb kg",
["e6ST"] = "Mt",
["e6t"] = "LT ST",
["e9lb"] = "v * 4.5359237 < 10 ! kilotonne ! Mt",
["e9t"] = "LT ST",
["Gg"] = "lb",
["kg"] = "lb",
["mg"] = "gr",
["Mg"] = "LT ST",
["ng"] = "gr",
["μg"] = "gr",
["mBq"] = "fCi",
["kBq"] = "nCi",
["MBq"] = "μCi",
["GBq"] = "mCi",
["TBq"] = "Ci",
["PBq"] = "kCi",
["EBq"] = "kCi",
["fCi"] = "mBq",
["pCi"] = "Bq",
["nCi"] = "Bq",
["μCi"] = "kBq",
["mCi"] = "MBq",
["kCi"] = "TBq",
["MCi"] = "PBq",
["ns"] = "μs",
["μs"] = "ms",
["ms"] = "s",
["ks"] = "h",
["Ms"] = "week",
["Gs"] = "decade",
["Ts"] = "millennium",
["Ps"] = "million year",
["Es"] = "thousand million year",
["MK"] = "keVT",
["cL"] = "impoz usoz",
["cl"] = "impoz usoz",
["cm<sup>3</sup>"] = "cuin",
["dL"] = "impoz usoz",
["dl"] = "impoz usoz",
["mm<sup>3</sup>"] = "cuin",
["dm<sup>3</sup>"] = "cuin",
["e12cuft"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3",
["e12impgal"] = "v * 4.54609 < 1000 ! T ! P ! l",
["e12m3"] = "v < 28.316846592 ! T ! P ! cuft",
["e12U.S.gal"] = "v * 3.785411784 < 1000 ! T ! P ! l",
["e12USgal"] = "v * 3.785411784 < 1000 ! T ! P ! l",
["e15cuft"] = "v * 2.8316846592 < 100 ! e12 ! e15 ! m3",
["e15m3"] = "Pcuft",
["e3bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3",
["e3cuft"] = "v * 2.8316846592 < 100 ! ! e3 ! m3",
["e3impgal"] = "v * 4.54609 < 1000 ! k ! M ! l",
["e3m3"] = "v < 28.316846592 ! k ! M ! cuft",
["e3U.S.gal"] = "v * 3.785411784 < 1000 ! k ! M ! l",
["e3USgal"] = "v * 3.785411784 < 1000 ! k ! M ! l",
["e6bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3",
["e6cuft"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3",
["e6cuyd"] = "v * 7.64554857984 < 10 ! e3 ! e6 ! m3",
["e6impgal"] = "v * 4.54609 < 1000 ! M ! G ! l",
["e6L"] = "USgal",
["e6m3"] = "v < 28.316846592 ! M ! G ! cuft",
["e6U.S.gal"] = "v * 3.785411784 < 1000 ! M ! G ! l",
["e6USgal"] = "v * 3.785411784 < 1000 ! M ! G ! l",
["e9bdft"] = "v * 0.23597372167 < 100 ! e6 ! e9 ! m3",
["e9cuft"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3",
["e9impgal"] = "v * 4.54609 < 1000 ! G ! T ! l",
["e9m3"] = "v < 28.316846592 ! G ! T ! cuft",
["e9U.S.gal"] = "v * 3.785411784 < 1000 ! G ! T ! l",
["e9USgal"] = "v * 3.785411784 < 1000 ! G ! T ! l",
["GL"] = "cuft",
["Gl"] = "cuft",
["kL"] = "cuft",
["kl"] = "cuft",
["km<sup>3</sup>"] = "cumi",
["mL"] = "impoz usoz",
["ml"] = "impoz usoz",
["Ml"] = "v < 28.316846592 ! e3 ! e6 ! cuft",
["ML"] = "v < 28.316846592 ! e3 ! e6 ! cuft",
["TL"] = "cumi",
["Tl"] = "cumi",
["μL"] = "cuin",
["μl"] = "cuin",
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local link_exceptions = {
-- Prefixed units with a linked article different from that of the base unit.
-- Each key item is a prefixed symbol (not unitcode).
["mm<sup>2</sup>"] = "Square millimetre",
["cm<sup>2</sup>"] = "Square centimetre",
["dm<sup>2</sup>"] = "Square decimetre",
["km<sup>2</sup>"] = "Square kilometre",
["kJ"] = "Kilojoule",
["MJ"] = "Megajoule",
["GJ"] = "Gigajoule",
["TJ"] = "Terajoule",
["fm"] = "Femtometre",
["pm"] = "Picometre",
["nm"] = "Nanometre",
["μm"] = "Micrometre",
["mm"] = "Millimetre",
["cm"] = "Centimetre",
["dm"] = "Decimetre",
["dam"] = "Decametre",
["hm"] = "Hectometre",
["km"] = "Kilometre",
["Mm"] = "Megametre",
["Gm"] = "Gigametre",
["Tm"] = "Terametre",
["Pm"] = "Petametre",
["Em"] = "Exametre",
["Zm"] = "Zettametre",
["Ym"] = "Yottametre",
["μg"] = "Microgram",
["mg"] = "Milligram",
["kg"] = "Kilogram",
["Mg"] = "Tonne",
["yW"] = "Yoctowatt",
["zW"] = "Zeptowatt",
["aW"] = "Attowatt",
["fW"] = "Femtowatt",
["pW"] = "Picowatt",
["nW"] = "Nanowatt",
["μW"] = "Microwatt",
["mW"] = "Milliwatt",
["kW"] = "Kilowatt",
["MW"] = "Megawatt",
["GW"] = "Gigawatt",
["TW"] = "Terawatt",
["PW"] = "Petawatt",
["EW"] = "Exawatt",
["ZW"] = "Zettawatt",
["YW"] = "Yottawatt",
["as"] = "Attosecond",
["fs"] = "Femtosecond",
["ps"] = "Picosecond",
["ns"] = "Nanosecond",
["μs"] = "Microsecond",
["ms"] = "Millisecond",
["ks"] = "Kilosecond",
["Ms"] = "Megasecond",
["Gs"] = "Gigasecond",
["Ts"] = "Terasecond",
["Ps"] = "Petasecond",
["Es"] = "Exasecond",
["Zs"] = "Zettasecond",
["Ys"] = "Yottasecond",
["mm<sup>3</sup>"] = "Cubic millimetre",
["cm<sup>3</sup>"] = "Cubic centimetre",
["dm<sup>3</sup>"] = "Cubic decimetre",
["dam<sup>3</sup>"] = "Cubic decametre",
["km<sup>3</sup>"] = "Cubic kilometre",
["μL"] = "Microlitre",
["μl"] = "Microlitre",
["mL"] = "Millilitre",
["ml"] = "Millilitre",
["cL"] = "Centilitre",
["cl"] = "Centilitre",
["dL"] = "Decilitre",
["dl"] = "Decilitre",
["daL"] = "Decalitre",
["dal"] = "Decalitre",
["hL"] = "Hectolitre",
["hl"] = "Hectolitre",
["kL"] = "Kilolitre",
["kl"] = "Kilolitre",
["ML"] = "Megalitre",
["Ml"] = "Megalitre",
["GL"] = "Gigalitre",
["Gl"] = "Gigalitre",
["TL"] = "Teralitre",
["Tl"] = "Teralitre",
["PL"] = "Petalitre",
["Pl"] = "Petalitre",
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local per_unit_fixups = {
-- Automatically created per units of form "x/y" may have their unit type
-- changed, for example, "length/time" is changed to "speed".
-- Other adjustments can also be specified.
["/area"] = "per unit area",
["/volume"] = "per unit volume",
["area/area"] = "area per unit area",
["energy/length"] = "energy per unit length",
["energy/mass"] = "energy per unit mass",
["energy/time"] = { utype = "power", link = "Power (physics)" },
["energy/volume"] = "energy per unit volume",
["force/area"] = { utype = "pressure", link = "Pressure" },
["length/length"] = { utype = "gradient", link = "Grade (slope)" },
["length/time"] = { utype = "speed", link = "Speed" },
["length/time/time"] = { utype = "acceleration", link = "Acceleration" },
["mass/area"] = { utype = "pressure", multiplier = 9.80665 },
["mass/length"] = "linear density",
["mass/mass"] = "concentration",
["mass/power"] = "mass per unit power",
["mass/time"] = "mass per unit time",
["mass/volume"] = { utype = "density", link = "Density" },
["power/mass"] = "power per unit mass",
["power/volume"] = { link = "Power density" },
["pressure/length"] = "fracture gradient",
["speed/time"] = { utype = "acceleration", link = "Acceleration" },
["volume/area"] = "volume per unit area",
["volume/length"] = "volume per unit length",
["volume/time"] = "flow",
}
return {
all_units = all_units,
default_exceptions = default_exceptions,
link_exceptions = link_exceptions,
per_unit_fixups = per_unit_fixups,
}
69cd04fba2962c152d0008b00cb8b7df57549e07
Module:Convert/text
828
722
1107
2024-10-26T23:10:17Z
wikipedia>Johnuniq
0
update from sandbox per [[Template talk:Convert#Module version 30]]
Scribunto
text/plain
-- Text used by Module:Convert for enwiki.
-- This is a separate module to simplify translation for use on another wiki.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
-- Some units accept an SI prefix before the unit code, such as "kg" for kilogram.
local SIprefixes = {
-- The prefix field is what the prefix should be, if different from the prefix used.
['Q'] = { exponent = 30, name = 'quetta', },
['R'] = { exponent = 27, name = 'ronna', },
['Y'] = { exponent = 24, name = 'yotta', },
['Z'] = { exponent = 21, name = 'zetta', },
['E'] = { exponent = 18, name = 'exa' , },
['P'] = { exponent = 15, name = 'peta' , },
['T'] = { exponent = 12, name = 'tera' , },
['G'] = { exponent = 9, name = 'giga' , },
['M'] = { exponent = 6, name = 'mega' , },
['k'] = { exponent = 3, name = 'kilo' , },
['h'] = { exponent = 2, name = 'hecto', },
['da']= { exponent = 1, name = 'deca' , name_us = 'deka' },
['d'] = { exponent = -1, name = 'deci' , },
['c'] = { exponent = -2, name = 'centi', },
['m'] = { exponent = -3, name = 'milli', },
['μ'] = { exponent = -6, name = 'micro', }, -- key = 'GREEK SMALL LETTER MU' (U+03BC) utf-8 CE BC
['µ'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- key = 'MICRO SIGN' (U+00B5) utf-8 C2 B5
['u'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- not an SI prefix, but allow for people typing this
['n'] = { exponent = -9, name = 'nano' , },
['p'] = { exponent =-12, name = 'pico' , },
['f'] = { exponent =-15, name = 'femto', },
['a'] = { exponent =-18, name = 'atto' , },
['z'] = { exponent =-21, name = 'zepto', },
['y'] = { exponent =-24, name = 'yocto', },
['r'] = { exponent =-27, name = 'ronto', },
['q'] = { exponent =-30, name = 'quecto', },
}
-- Some units can be qualified with one of the following prefixes, when linked.
local customary_units = {
{ "US", link = "United States customary units" },
{ "U.S.", link = "United States customary units" },
{ "imperial", link = "Imperial units" },
{ "imp", link = "Imperial units" },
}
-- Names when using engineering notation (a prefix of "eN" where N is a number; example "e6km").
-- key = { "name", link = "article title", exponent = numeric_key_value }
-- If lk=on and link is defined, the name of the number will appear as a link.
local eng_scales = {
["3"] = { "thousand", exponent = 3 },
["6"] = { "million", exponent = 6 },
["9"] = { "billion", link = "1000000000 (number)", exponent = 9 },
["12"] = { "trillion", link = "1000000000000 (number)", exponent = 12 },
["15"] = { "quadrillion", link = "1000000000000000 (number)", exponent = 15 },
}
local all_categories = {
unit = "[[Category:Convert errors]]",
option = "[[Category:Convert errors]]",
warning = '[[Category:Convert invalid options]]',
tracking = '[[Category:Convert tracking]]',
}
-- For some error messages, the following puts the wanted style around
-- each unit code marked like '...%{ft%}...'.
local unitcode_regex = '%%([{}])'
local unitcode_replace = { ['{'] = '"', ['}'] = '"' } -- no longer need the more elaborate substitute used before 2013-09-28
-- All messages that may be displayed if a problem occurs.
local all_messages = {
-- Message format string: $1=title, $2=text, $3=category, $4=anchor.
-- Each displayed message starts with "Convert:" so can easily locate by searching article.
cvt_format = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[<i>[[Help:Convert messages#$4|<span title="Convert: $1">convert: $2</span>]]</i>]</sup>$3<span class="error"></span>',
cvt_format2 = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[[Help:Convert messages#$4|<span title="Convert: $1">$2</span>]]</sup>$3<span class="error"></span>',
cvt_format_preview = '<strong class="error">Error in convert: $1 [[Help:Convert messages#$4|(help)]]</strong>$3',
-- Each of following messages is a table:
-- { [1] = 'title', -- mouseover title text
-- [2] = 'text', -- link text displayed in article
-- [3] = 'category key', -- key to lookup category in all_categories
-- [4] = 'anchor', -- anchor for link to relevant section on help page
-- regex = gsub_regex,
-- replace = gsub_table,
-- } Mouseover title text Link text CatKey Anchor
cvt_bad_input = { 'input "$1" must be a number and unit' , 'invalid input' , 'option', 'invalid_input' },
cvt_bad_num = { 'Value "$1" must be a number' , 'invalid number' , 'option', 'invalid_number' },
cvt_big_prec = { 'Precision "$1" is too large' , 'precision too large' , 'option', 'precision_too_large' },
cvt_invalid_num = { 'Number has overflowed' , 'number overflow' , 'option', 'number_overflow' },
cvt_no_num = { 'Needs the number to be converted' , 'needs a number' , 'option', 'needs_number' },
cvt_no_num2 = { 'Needs another number for a range' , 'needs another number', 'option', 'needs_another_number' },
cvt_bad_altitude = { '"$1" needs an integer' , 'invalid altitude' , 'option', 'invalid_altitude' },
cvt_bad_frac = { '"$1" needs an integer above 1' , 'invalid fraction' , 'option', 'invalid_fraction' },
cvt_bad_prec = { 'Precision "$1" must be an integer' , 'invalid precision' , 'option', 'invalid_precision' },
cvt_bad_sigfig = { '"$1" needs a positive integer' , 'invalid sigfig' , 'option', 'invalid_sigfig' },
cvt_empty_option = { 'Ignored empty option "$1"' , 'empty option' , 'option', 'empty_option' },
cvt_deprecated = { 'Option "$1" is deprecated' , '*' , 'option', 'deprecated_option', format = 'cvt_format2', nowarn = true },
cvt_no_spell = { 'Spelling is not available' , 'bug, ask for help' , 'option', 'ask_for_help' },
cvt_unknown_option = { 'Ignored invalid option "$1"' , 'invalid option' , 'option', 'invalid_option' },
cvt_wd_fail = { 'Unable to access Wikidata' , 'wikidata problem' , 'option', 'wikidata_problem' },
cvt_bad_default = { 'Unit "$1" has an invalid default' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_bad_unit = { 'Unit "$1" is invalid here' , 'unit invalid here' , 'unit' , 'unit_invalid_here' },
cvt_no_default = { 'Unit "$1" has no default output unit' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_no_unit = { 'Needs name of unit' , 'needs unit name' , 'unit' , 'needs_unit_name' },
cvt_unknown = { 'Unit name "$1" is not known' , 'unknown unit' , 'unit' , 'unknown_unit' },
cvt_should_be = { '$1' , 'ambiguous unit' , 'unit' , 'ambiguous_unit', regex = unitcode_regex, replace = unitcode_replace },
cvt_mismatch = { 'Cannot convert "$1" to "$2"' , 'unit mismatch' , 'unit' , 'unit_mismatch' },
cvt_bug_convert = { 'Bug: Cannot convert between specified units', 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_lookup = { 'Unit "$1" is incorrectly defined' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
}
-- Text to join input value/unit with output value/unit.
local disp_joins = {
-- [1]=before output, [2]=after output, [3]=between outputs in a combination; default "; "
-- [wantname] gives default abbr=off
["or"] = { " or " , "" , " or ", wantname = true },
["sqbr-sp"] = { " [" , "]" },
["sqbr-nbsp"] = { " [" , "]" },
["comma"] = { ", " , "" , ", " },
["semicolon"] = { "; " , "" },
["slash-sp"] = { " / " , "" , wantname = true },
["slash-nbsp"] = { " / ", "" , wantname = true },
["slash-nosp"] = { "/" , "" , wantname = true },
["b"] = { " (" , ")" },
["(or)"] = { " (" , ")", " or " },
["br"] = { "<br />" , "" , wantname = true },
["br()"] = { "<br />(" , ")", wantname = true },
}
-- Text to separate values in a range.
local range_types = {
-- Specifying a table requires either:
-- * "off" and "on" values (for "abbr=off" and "abbr=on"), or
-- * "input" and "output" values (for LHS and RHS);
-- other fields are optional.
-- When "adj=on|abbr=off" applies, spaces in range text are replaced with hyphens.
-- With "exception = true", that also occurs with "adj=on|abbr=on".
-- If "adj" is defined here, that text (unchanged) is used with "adj=on".
["+"] = " + ",
[","] = ", ",
[", and"] = ", and ",
[", or"] = ", or ",
["by"] = " by ",
["-"] = "–",
["to about"] = " to about ",
["and"] = { off = " and ", on = " and ", exception = true },
["and(-)"] = { input = " and ", output = "–" },
["or"] = { off = " or " , on = " or " , exception = true },
["to"] = { off = " to " , on = " to " , exception = true },
["to(-)"] = { input = " to ", output = "–" },
["+/-"] = { off = " ± ", on = " ± ", adj = " ± ", is_range_change = true },
["by(x)"] = { input = " by ", output = " × ", out_range_x = true },
["x"] = { off = " by ", on = " × ", abbr_range_x = true },
["xx"] = " × ",
["*"] = "×",
["/"] = " / ", -- for a table of high/low temperatures with {{convert|83|/|63|F|disp=br()|abbr=values}}
}
local range_aliases = {
-- ["alternative name for a range"] = "standard range name"
["–"] = "-",
["–"] = "-",
["×"] = "x",
["×"] = "x",
["±"] = "+/-",
["±"] = "+/-",
}
-- Convert accepts range text delimited with whitespace, for example, {{convert|1 to 2|ft}}.
-- In addition, the following "words" are accepted without spaces, for example, {{convert|1-2|ft}}.
-- Words must be in correct order for searching, for example, 'x' after 'xx'.
local range_words = { '-', '–', 'xx', 'x', '*' }
local ranges = {
types = range_types,
aliases = range_aliases,
words = range_words,
}
-- Valid option names.
local en_option_name = {
-- ["local text for option name"] = "en name used in this module"
["$"] = "$",
["abbr"] = "abbr",
["adj"] = "adj",
["altitude_ft"] = "altitude_ft",
["altitude_m"] = "altitude_m",
["comma"] = "comma",
["debug"] = "debug",
["disp"] = "disp",
["frac"] = "frac",
["input"] = "input",
["lang"] = "lang",
["link"] = "lk",
["lk"] = "lk",
["order"] = "order",
["qid"] = "qid",
["qual"] = "qual",
["qualifier"] = "qual",
["round"] = "round",
["sigfig"] = "sigfig",
["sing"] = "adj", -- "sing" is an old alias for "adj"
["sortable"] = "sortable",
["sp"] = "sp",
["spell"] = "spell",
["stylein"] = "stylein",
["styleout"] = "styleout",
["tracking"] = "tracking",
}
-- Valid option values.
-- Convention: parms.opt_xxx refers to an option that is set here
-- (not intended to be set by the template which invokes this module).
-- Example: At enwiki, "abbr" includes:
-- ["values"] = "opt_values"
-- As a result, if the template uses abbr=values, Module:Convert sets:
-- parms["opt_values"] = true
-- parms["abbr"] = nil
-- Therefore parms.abbr will be nil, or will have one of the listed values
-- that do not start with "opt_".
-- An option value of form "xxx?" is the same as "xxx" but shows the input as deprecated.
-- Options removed in January 2018 with remnants still in Module:Convert:
-- abbr=mos (in a range, repeat the input unit)
-- adj=1 (set opt_singular to make the unit name singular when 0 < abs(value) <= 1)
local en_option_value = {
["$"] = 'TEXT', -- TEXT should be a currency symbol that will be used instead of "$"
["abbr"] = {
-- ["local text for option value"] = "en value used in this module"
["def"] = "", -- ignored (some wrapper templates call convert with "abbr=def" to mean "default abbreviation")
["h"] = "on", -- abbr=on + use "h" for hand unit (default)
["hh"] = "opt_hand_hh", -- abbr=on + use "hh" for hand unit
["in"] = "in", -- use symbol for LHS unit
["none"] = "off", -- old name for "off"
["off"] = "off", -- use name for all units
["on"] = "on", -- use symbol for all units
["out"] = "out", -- use symbol for RHS unit (default)
["unit"] = "unit", -- abbr=on but abbreviate units only: e6km → million km (not ×10⁶ km)
["values"] = "opt_values", -- show only input and output numbers, not units
["~"] = "opt_also_symbol", -- show input unit symbol as well as name
},
["adj"] = {
["mid"] = "opt_adjectival, opt_adj_mid", -- adj=on with user-specified text after input unit (between input and output)
["off"] = "", -- ignored (off is the default)
["on"] = "opt_adjectival", -- unit name is singular and hyphenated
["pre"] = "opt_one_preunit", -- user-specified text before input unit
["ri0"] = "opt_ri=0", -- round input with precision = 0
["ri1"] = "opt_ri=1", -- round input with precision = 1
["ri2"] = "opt_ri=2", -- round input with precision = 2
["ri3"] = "opt_ri=3", -- round input with precision = 3
["~"] = "opt_also_symbol", -- same as abbr=~ so can have {{convert|1|C|K|abbr=off|adj=~}}
},
["altitude_ft"] = 'INTEGER',
["altitude_m"] = 'INTEGER',
["comma"] = {
["5"] = "opt_comma5", -- only use numsep grouping if 5 or more digits
["gaps"] = "opt_gaps", -- use gaps, not numsep, to separate groups of digits
["gaps3"] = "opt_gaps, opt_gaps3", -- group only in threes rather than default of no gap before a single digit after decimal mark
["off"] = "opt_nocomma", -- no numsep in input or output numbers
},
["debug"] = {
["yes"] = "opt_sortable_debug", -- make the normally hidden sort key visible
},
["disp"] = {
["5"] = "opt_round=5?", -- round output value to nearest 5
["b"] = "b", -- join: '(...)'
["(or)"] = "(or)", -- join: '(...)' with 'or' between outputs in a combination
["br"] = "br", -- join: '<br />'
["br()"] = "br()", -- join: '<br />(...)'
["comma"] = "comma", -- join: ','
["flip"] = "opt_flip", -- reverse order of input/output
["number"] = "opt_output_number_only", -- display output value (not input, and not output symbol/name)
["or"] = "or", -- join: 'or'
["out"] = "opt_output_only",
["output number only"] = "opt_output_number_only",
["output only"] = "opt_output_only",
["preunit"] = "opt_two_preunits", -- user-specified text before input and output units
["semicolon"] = "semicolon", -- join: ';'
["sqbr"] = "sqbr", -- join: '[...]'
["table"] = "opt_table", -- output is suitable for a table cell with align="right"
["tablecen"] = "opt_tablecen", -- output is suitable for a table cell with align="center"
["unit"] = "opt_input_unit_only", -- display input symbol/name (not output, and not input value)
["unit or text"] = "opt_input_unit_only, opt_ignore_error", -- display input symbol/name, or given unit code if not known
["unit2"] = "opt_output_unit_only",
["x"] = "x", -- join: <first>...<second> (user-specified text)
},
["frac"] = 'INTEGER',
["input"] = 'TEXT', -- TEXT should be <value><space><unitcode> or <wikidata-property-id>
["lang"] = { -- language for output digits (both en and local digits are always accepted for input)
["en"] = "opt_lang_en", -- use en digits for numbers, regardless of local language
["local"] = "opt_lang_local", -- use local digits for numbers (default, although config can change default to en)
},
["lk"] = {
["in"] = "in", -- link LHS unit name or symbol
["off"] = "off", -- do not link: same as default except for hand unit
["on"] = "on", -- link all unit names or symbols (but not twice for the same unit)
["out"] = "out", -- link RHS unit name or symbol
},
["order"] = {
["flip"] = "opt_flip", -- reverse order of input/output
["out"] = "opt_order_out", -- do not show input; instead, use order in output combination, with the first output shown as the input
},
["qid"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier
["qual"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier
["round"] = {
["0.5"] = "opt_round=0.5", -- round output value to nearest 0.5
["5"] = "opt_round=5", -- round output value to nearest 5
["10"] = "opt_round=10", -- round output value to nearest 10 (same as but clearer than "|-1")
["25"] = "opt_round=25", -- round output value to nearest 25
["50"] = "opt_round=50", -- round output value to nearest 50
["each"] = "opt_round_each", -- using default precision in a range, round each output separately (default uses highest precision of each item in range)
},
["sigfig"] = 'INTEGER',
["sortable"] = {
["off"] = "", -- ignored (off is the default)
["on"] = "opt_sortable_on", -- output sort key for use in a sortable table, based on value from converting to a standard base unit
["debug"] = "opt_sortable_on, opt_sortable_debug", -- |sortable=debug is the same as |sortable=on|debug=yes
},
["sp"] = {
["us"] = "opt_sp_us", -- use U.S. spelling (like "meter" instead of default "metre")
},
["spell"] = { -- only English spelling is supported; not scientific notation; only some fractions
["in"] = "opt_spell_in", -- spell input value in words
["In"] = "opt_spell_in, opt_spell_upper", -- spell input value in words with first letter uppercase
["on"] = "opt_spell_in, opt_spell_out", -- spell input and output values in words
["On"] = "opt_spell_in, opt_spell_out, opt_spell_upper", -- same, with first letter of first word in result uppercase
["us"] = "opt_sp_us", -- use U.S. spelling; same as sp=us so spell=us also works
},
["stylein"] = 'TEXT',
["styleout"] = 'TEXT',
["tracking"] = 'TEXT',
}
local titles = {
["frac"] = "Fraction/styles.css",
["sfrac"] = "Sfrac/styles.css",
}
return {
SIprefixes = SIprefixes,
all_categories = all_categories,
all_messages = all_messages,
currency = { ['$'] = true, ['£'] = true, ['€'] = true, ['₱'] = true, ['₽'] = true, ['¥'] = true },
customary_units = customary_units,
disp_joins = disp_joins,
en_option_name = en_option_name,
en_option_value = en_option_value,
eng_scales = eng_scales,
ranges = ranges,
titles = titles,
}
d9f24f7b3c125178aa827b8e2b4ad1e7ba143f48
Template:Sfrac
10
729
1121
2025-02-27T18:27:09Z
wikipedia>Great Brightstar
0
Additional fix
wikitext
text/x-wiki
{{ {{{|safesubst:}}}#invoke:Unsubst||$B=<templatestyles src="Sfrac/styles.css" /><span class="sfrac">⁠{{#if:{{{3|}}}|{{{1}}}<span class="sr-only">+</span>}}<!--
--><span class="tion" {{#if:{{{font-size|}}}|style="font-size:{{{font-size}}}"}}><!--
--><span class="num">{{#if:{{{3|}}}|{{{2}}}|{{#if:{{{2|}}}|{{{1}}}|1}}}}</span><!--
--><span class="sr-only">/</span><!--
--><span class="den">{{{3|{{{2|{{{1|1}}}}}}}}}</span><!--
--></span><!--
-->⁠</span>}}<noinclude>
{{documentation}}
<!-- Add categories to /doc subpage, not here. -->
</noinclude>
1a4f22ed67a613ab0f1d9abf9816187efc00f50a
Module:Hatnote
828
338
443
2025-03-18T15:47:33Z
wikipedia>Ahecht
0
Revert
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p
e4b658e3483374de2bebf772f3d19aaa713ca3f5
Module:Val
828
718
1099
2025-06-01T05:39:35Z
wikipedia>Johnuniq
0
change 0.3em spacing to 0.225em (same total space as old code) per [[Template talk:Val#Proposal to reduce spacing around ±]]
Scribunto
text/plain
-- For Template:Val, output a number and optional unit.
-- Format options include scientific and uncertainty notations.
local numdot = '.' -- decimal mark (use ',' for Italian)
local numsep = ',' -- group separator (use ' ' for Italian)
local mtext = {
-- Message and other text that should be localized.
['mt-bad-exponent'] = 'exponent parameter (<b>e</b>)',
['mt-parameter'] = 'parameter ',
['mt-not-number'] = 'is not a valid number',
['mt-cannot-range'] = 'cannot use a range if the first parameter includes "e"',
['mt-need-range'] = 'needs a range in parameter 2',
['mt-should-range'] = 'should be a range',
['mt-cannot-with-e'] = 'cannot be used if the first parameter includes "e"',
['mt-not-range'] = 'does not accept a range',
['mt-cannot-e'] = 'cannot use e notation',
['mt-too-many-parameter'] = 'too many parameters',
['mt-need-number'] = 'need a number after the last parameter because it is a range.',
['mt-ignore-parameter4'] = 'Val parameter 4 ignored',
['mt-val-not-supported'] = 'Val parameter "%s=%s" is not supported',
['mt-invalid-scale'] = 'Unit "%s" has invalid scale "%s"',
['mt-both-u-ul'] = 'unit (<b>u</b>) and unit with link (<b>ul</b>) are both specified, only one is allowed.',
['mt-both-up-upl'] = 'unit per (<b>up</b>) and unit per with link (<b>upl</b>) are both specified, only one is allowed.',
}
local data_module = 'Module:Val/units'
local convert_module = 'Module:Convert'
local function valerror(msg, nocat, iswarning)
-- Return formatted message text for an error or warning.
-- Can append "#FormattingError" to URL of a page with a problem to find it.
local anchor = '<span id="FormattingError"></span>'
local body, category
if nocat or mw.title.getCurrentTitle():inNamespaces(1, 2, 3, 5) then
-- No category in Talk, User, User_talk, or Wikipedia_talk.
category = ''
else
category = '[[Category:Pages with incorrect formatting templates use]]'
end
iswarning = false -- problems are infrequent so try showing large error so editor will notice
if iswarning then
body = '<sup class="noprint Inline-Template" style="white-space:nowrap;">' ..
'[[Template:Val|<span title="' ..
msg:gsub('"', '"') ..
'">warning</span>]]</sup>'
else
body = '<strong class="error">' ..
'Error in {{[[Template:val|val]]}}: ' ..
msg ..
'</strong>'
end
return anchor .. body .. category
end
local range_types = {
-- No need for ' ' because nowrap applies to all output.
[","] = ", ",
["by"] = " by ",
["-"] = "–",
["–"] = "–",
["and"] = " and ",
["or"] = " or " ,
["to"] = " to " ,
["x"] = " × ",
["×"] = " × ",
["/"] = "/",
}
local range_repeat_unit = {
-- WP:UNIT wants unit repeated when a "multiply" range is used.
["x"] = true,
["×"] = true,
}
local function extract_item(index, numbers, arg)
-- Extract an item from arg and store the result in numbers[index].
-- If no argument or if argument is valid, return nil (no error);
-- otherwise, return an error message.
-- The stored result is:
-- * a table for a number (empty if there was no specified number); or
-- * a string for range text
-- Input like 1e3 is regarded as invalid for all except argument 1
-- which accepts e notation as an alternative to the 'e' argument.
-- Input group separators are removed.
local which = index
local function fail(msg)
local description
if which == 'e' then
description = mtext['mt-bad-exponent']
else
description = mtext['mt-parameter'] .. which
end
return description .. ' ' .. (msg or mtext['mt-not-number']) .. '.'
end
local result = {}
local range = range_types[arg]
if range then
if type(index) == 'number' and (index % 2 == 0) then
if index == 2 then
if numbers[1] and numbers[1].exp then
return fail(mtext['mt-cannot-range'])
end
numbers.has_ranges = true
else
if not numbers.has_ranges then
return fail(mtext['mt-need-range'])
end
end
numbers[index] = range
if range_repeat_unit[arg] then
-- Any "repeat" range forces unit (if any) to be repeated for all items.
numbers.isrepeat = true
end
return nil
end
return fail(mtext['mt-not-range'])
end
if numbers.has_ranges and type(index) == 'number' and (index % 2 == 0) then
return fail(mtext['mt-should-range'])
end
if index == 'e' then
local e = numbers[1] and numbers[1].exp
if e then
if arg then
return fail(mtext['mt-cannot-with-e'])
end
arg = e
which = 1
end
end
if arg and arg ~= '' then
arg = arg:gsub(numsep, '')
if numdot ~= '.' then
arg = arg:gsub(numdot, '.')
end
if arg:sub(1, 1) == '(' and arg:sub(-1) == ')' then
result.parens = true
arg = arg:sub(2, -2)
end
local a, b = arg:match('^(.+)[Ee](.+)$')
if a then
if index == 1 then
arg = a
result.exp = b
else
return fail(mtext['mt-cannot-e'])
end
end
local isnegative, propersign, prefix
local minus = '−'
prefix, arg = arg:match('^(.-)([%d.]+)$')
local value = tonumber(arg)
if not value then
return fail()
end
if arg:sub(1, 1) == '.' then
arg = '0' .. arg
end
if prefix == '' then
-- Ignore.
elseif prefix == '±' then
-- Display for first number, ignore for others.
if index == 1 then
propersign = '±'
end
elseif prefix == '+' then
propersign = '+'
elseif prefix == '-' or prefix == minus then
propersign = minus
isnegative = true
else
return fail()
end
result.clean = arg
result.sign = propersign or ''
result.value = isnegative and -value or value
end
numbers[index] = result
return nil -- no error
end
local function get_args(numbers, args)
-- Extract arguments and store the results in numbers.
-- Return nothing (no error) if ok; otherwise, return an error message.
for index = 1, 99 do
local which = index
local arg = args[which] -- has been trimmed
if not arg then
which = 'e'
arg = args[which]
end
local msg = extract_item(which, numbers, arg)
if msg then
return msg
end
if which == 'e' then
break
end
if index > 19 then
return mtext['mt-too-many-parameter']
end
end
if numbers.has_ranges and (#numbers % 2 == 0) then
return mtext['mt-need-number']
end
end
local function get_scale(text, ucode)
-- Return the value of text as a number, or throw an error.
-- This supports extremely basic expressions of the form:
-- a / b
-- a ^ b
-- where a and b are numbers or 'pi'.
local n = tonumber(text)
if n then
return n
end
n = text:gsub('pi', math.pi)
for _, op in ipairs({ '/', '^' }) do
local a, b = n:match('^(.-)' .. op .. '(.*)$')
if a then
a = tonumber(a)
b = tonumber(b)
if a and b then
if op == '/' then
return a / b
elseif op == '^' then
return a ^ b
end
end
break
end
end
error(string.format(mtext['mt-invalid-scale'], ucode, text))
end
local function get_builtin_unit(ucode, definitions)
-- Return table of information for the specified built-in unit, or nil if not known.
-- Each defined unit code must be followed by two spaces (not tab characters).
local _, pos = definitions:find('\n' .. ucode .. ' ', 1, true)
if pos then
local endline = definitions:find('%s*\n', pos)
if endline then
local result = {}
local n = 0
local text = definitions:sub(pos + 1, endline - 1):gsub('%s%s+', '\t')
for item in (text .. '\t'):gmatch('(%S.-)\t') do
if item == 'ALIAS' then
result.alias = true
elseif item == 'ANGLE' then
result.isangle = true
result.nospace = true
elseif item == 'NOSPACE' then
result.nospace = true
elseif item == 'SI' then
result.si = true
else
n = n + 1
if n == 1 then
local link, symbol = item:match('^%[%[([^|]+)|(.+)%]%]$')
if link then
result.symbol = symbol
result.link = link
n = 2
else
result.symbol = item
end
elseif n == 2 then
result.link = item
elseif n == 3 then
result.scale_text = item
result.scale = get_scale(item, ucode)
else
result.more_ignored = item
break
end
end
end
if result.si then
local s = result.symbol
if ucode == 'mc' .. s or ucode == 'mu' .. s then
result.ucode = 'µ' .. s -- unit code for convert should be this
end
end
if n >= 2 or (n >= 1 and result.alias) then
return result
end
-- Ignore invalid definition, treating it as a comment.
end
end
end
local function convert_lookup(ucode, value, scaled_top, want_link, si, options)
local lookup = require(convert_module)._unit
return lookup(ucode, {
value = value,
scaled_top = scaled_top,
link = want_link,
si = si,
sort = options.sortable,
})
end
local function get_unit(ucode, value, scaled_top, options)
local want_link = options.want_link
if scaled_top then
want_link = options.want_per_link
end
local data = mw.loadData(data_module)
local result = options.want_longscale and
get_builtin_unit(ucode, data.builtin_units_long_scale) or
get_builtin_unit(ucode, data.builtin_units)
local si, use_convert
if result then
if result.alias then
ucode = result.symbol
use_convert = true
end
if result.scale then
-- Setting si means convert will use the unit as given, and the sort key
-- will be calculated from the value without any extra scaling that may
-- occur if convert found the unit code. For example, if val defines the
-- unit 'year' with a scale and if si were not set, convert would also apply
-- its own scale because convert knows that a year is 31,557,600 seconds.
si = { result.symbol, result.link }
value = value * result.scale
end
if result.si then
ucode = result.ucode or ucode
si = { result.symbol, result.link }
use_convert = true
end
else
result = {}
use_convert = true
end
local convert_unit = convert_lookup(ucode, value, scaled_top, want_link, si, options)
result.sortkey = convert_unit.sortspan
if use_convert then
result.text = convert_unit.text
result.scaled_top = convert_unit.scaled_value
else
if want_link then
result.text = '[[' .. result.link .. '|' .. result.symbol .. ']]'
else
result.text = result.symbol
end
result.scaled_top = value
end
return result
end
local function makeunit(value, options)
-- Return table of information for the requested unit and options, or
-- return nil if no unit.
options = options or {}
local unit
local ucode = options.u
local percode = options.per
if ucode then
unit = get_unit(ucode, value, nil, options)
elseif percode then
unit = { nospace = true, scaled_top = value }
else
return nil
end
local text = unit.text or ''
local sortkey = unit.sortkey
if percode then
local function bracketed(code, text)
return code:find('[*./]') and '(' .. text .. ')' or text
end
local perunit = get_unit(percode, 1, unit.scaled_top, options)
text = (ucode and bracketed(ucode, text) or '') ..
'/' .. bracketed(percode, perunit.text)
sortkey = perunit.sortkey
end
if not (unit.nospace or options.nospace) then
text = ' ' .. text
end
return { text = text, isangle = unit.isangle, sortkey = sortkey }
end
local function list_units(mode)
-- Return wikitext to list the built-in units.
-- A unit code should not contain wikimarkup so don't bother escaping.
local data = mw.loadData(data_module)
local definitions = data.builtin_units .. data.builtin_units_long_scale
local last_was_blank = true
local n = 0
local result = {}
local function add(line)
if line == '' then
last_was_blank = true
else
if last_was_blank and n > 0 then
n = n + 1
result[n] = ''
end
last_was_blank = false
n = n + 1
result[n] = line
end
end
local si_prefixes = {
-- These are the prefixes recognized by convert; u is accepted for micro.
y = 'y',
z = 'z',
a = 'a',
f = 'f',
p = 'p',
n = 'n',
u = 'µ',
['µ'] = 'µ',
m = 'm',
c = 'c',
d = 'd',
da = 'da',
h = 'h',
k = 'k',
M = 'M',
G = 'G',
T = 'T',
P = 'P',
E = 'E',
Z = 'Z',
Y = 'Y',
}
local function is_valid(ucode, unit)
if unit and not unit.more_ignored then
assert(type(unit.symbol) == 'string' and unit.symbol ~= '')
if unit.alias then
if unit.link or unit.scale_text or unit.si then
return false
end
end
if unit.si then
if unit.scale_text then
return false
end
ucode = unit.ucode or ucode
local base = unit.symbol
if ucode == base then
unit.display = base
return true
end
local plen = #ucode - #base
if plen > 0 then
local prefix = si_prefixes[ucode:sub(1, plen)]
if prefix and ucode:sub(plen + 1) == base then
unit.display = prefix .. base
return true
end
end
else
unit.display = unit.symbol
return true
end
end
return false
end
local lookup = require(convert_module)._unit
local function show_convert(ucode, unit)
-- If a built-in unit defines a scale or sets the SI flag, any unit defined in
-- convert is not used (the scale or SI prefix's scale is used for a sort key).
-- If there is no scale or SI flag, and the unit is not defined in convert,
-- the sort key may not be correct; this allows such units to be identified.
if not (unit.si or unit.scale_text) then
if mode == 'convert' then
unit.show = not lookup(unit.alias and unit.symbol or ucode).unknown
unit.show_text = 'CONVERT'
elseif mode == 'unknown' then
unit.show = lookup(unit.alias and unit.symbol or ucode).unknown
unit.show_text = 'UNKNOWN'
elseif not unit.alias then
-- Show convert's scale in square brackets ('[1]' for an unknown unit).
-- Don't show scale for an alias because it's misleading for temperature
-- and an alias is probably not useful for anything else.
local scale = lookup(ucode, {value=1, sort='on'}).scaled_value
if type(scale) == 'number' then
scale = string.format('%.5g', scale):gsub('e%+?(%-?)0*(%d+)', 'e%1%2')
else
scale = '?'
end
unit.show = true
unit.show_text = '[' .. scale .. ']'
end
end
end
for line in definitions:gmatch('([^\n]*)\n') do
local pos, _ = line:find(' ', 1, true)
if pos then
local ucode = line:sub(1, pos - 1)
local unit = get_builtin_unit(ucode, '\n' .. line .. '\n')
if is_valid(ucode, unit) then
show_convert(ucode, unit)
local flags, text
if unit.alias then
text = unit.symbol
else
text = '[[' .. unit.link .. '|' .. unit.display .. ']]'
end
if unit.isangle then
unit.nospace = nil -- don't show redundant flag
end
for _, f in ipairs({
{ 'alias', 'ALIAS' },
{ 'isangle', 'ANGLE' },
{ 'nospace', 'NOSPACE' },
{ 'si', 'SI' },
{ 'scale_text', unit.scale_text },
{ 'show', unit.show_text },
}) do
if unit[f[1]] then
local t = f[2]
if t:match('^%u+$') then
t = '<small>' .. t .. '</small>'
end
if flags then
flags = flags .. ' ' .. t
else
flags = t
end
end
end
if flags then
text = text .. ' • ' .. flags
end
add(ucode .. ' = ' .. text .. '<br />')
else
add(line .. ' ◆ <b>invalid definition</b><br />')
end
else
add(line)
end
end
return table.concat(result, '\n')
end
local delimit_groups = require('Module:Gapnum').groups
local function delimit(sign, numstr, fmt)
-- Return sign and numstr (unsigned digits or numdot only) after formatting.
-- Four-digit integers are not formatted with gaps.
fmt = (fmt or ''):lower()
if fmt == 'none' or (fmt == '' and #numstr == 4 and numstr:match('^%d+$')) then
return sign .. numstr
end
-- Group number by integer and decimal parts.
-- If there is no decimal part, delimit_groups returns only one table.
local ipart, dpart = delimit_groups(numstr)
local result
if fmt == 'commas' then
result = sign .. table.concat(ipart, numsep)
if dpart then
result = result .. numdot .. table.concat(dpart)
end
else
-- Delimit with a small gap by default.
local groups = {}
groups[1] = table.remove(ipart, 1)
for _, v in ipairs(ipart) do
table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>')
end
if dpart then
table.insert(groups, numdot .. (table.remove(dpart, 1) or ''))
for _, v in ipairs(dpart) do
table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>')
end
end
result = sign .. table.concat(groups)
end
return result
end
local function sup_sub(sup, sub, align)
-- Return the same result as Module:Su except val defaults to align=right.
if align == 'l' or align == 'left' then
align = 'left'
elseif align == 'c' or align == 'center' then
align = 'center'
else
align = 'right'
end
return '<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1.2em;font-size:85%;text-align:' ..
align .. ';">' .. sup .. '<br />' .. sub .. '</span>'
end
local function range_text(items, unit_table, options)
local fmt = options.fmt
local nend = items.nend or ''
if items.isrepeat or unit_table.isangle then
nend = nend .. unit_table.text
end
local text = ''
for i = 1, #items do
if i % 2 == 0 then
text = text .. items[i]
else
text = text .. delimit(items[i].sign, items[i].clean, fmt) .. nend
end
end
return text
end
local function uncertainty_text(uncertainty, unit_table, options)
local angle, text, need_parens
if unit_table.isangle then
angle = unit_table.text
end
local upper = uncertainty.upper or {}
local lower = uncertainty.lower or {}
local uncU = upper.clean
if uncU then
local fmt = options.fmt
local uncL = lower.clean
if uncL then
uncU = delimit('+', uncU, fmt) .. (upper.errend or '')
uncL = delimit('−', uncL, fmt) .. (lower.errend or '')
if angle then
uncU = uncU .. angle
uncL = uncL .. angle
end
text = (angle or '') ..
'<span style="margin-left:0.3em;">' ..
sup_sub(uncU, uncL, options.align) ..
'</span>'
else
if upper.parens then
text = '(' .. uncU .. ')' -- old template did not delimit
else
text = (angle or '') ..
'<span style="margin-left:0.225em;margin-right:0.225em;">±</span>' ..
delimit('', uncU, fmt)
need_parens = true
end
if uncertainty.errend then
text = text .. uncertainty.errend
end
if angle then
text = text .. angle
end
end
else
if angle then
text = angle
end
end
return text, need_parens
end
local function _main(values, unit_spec, options)
if options.sandbox then
data_module = data_module .. '/sandbox'
convert_module = convert_module .. '/sandbox'
end
local action = options.action
if action then
if action == 'list' then
-- Kludge: am using the align parameter (a=xxx) for type of list.
return list_units(options.align)
end
return valerror('invalid action "' .. action .. '".', options.nocat)
end
local number = values.number or (values.numbers and values.numbers[1]) or {}
local e_10 = options.e or {}
local novalue = (number.value == nil and e_10.clean == nil)
local fmt = options.fmt
local want_sort = true
local sortable = options.sortable
if sortable == 'off' or (sortable == nil and novalue) then
want_sort = false
elseif sortable == 'debug' then
-- Same as sortable = 'on' but the sort key is displayed.
else
sortable = 'on'
end
local sort_value = 1
if want_sort then
sort_value = number.value or 1
if e_10.value and sort_value ~= 0 then
-- The 'if' avoids {{val|0|e=1234}} giving an invalid sort_value due to overflow.
sort_value = sort_value * 10^e_10.value
end
end
local unit_table = makeunit(sort_value, {
u = unit_spec.u,
want_link = unit_spec.want_link,
per = unit_spec.per,
want_per_link = unit_spec.want_per_link,
nospace = novalue,
want_longscale = unit_spec.want_longscale,
sortable = sortable,
})
local sortkey
if unit_table then
if want_sort then
sortkey = unit_table.sortkey
end
else
unit_table = { text = '' }
if want_sort then
sortkey = convert_lookup('dummy', sort_value, nil, nil, nil, { sortable = sortable }).sortspan
end
end
local final_unit = unit_table.isangle and '' or unit_table.text
local e_text, n_text, need_parens
local uncertainty = values.uncertainty
if uncertainty then
if number.clean then
n_text = delimit(number.sign, number.clean, fmt) .. (number.nend or '')
local text
text, need_parens = uncertainty_text(uncertainty, unit_table, options)
if text then
n_text = n_text .. text
end
else
n_text = ''
end
else
if values.numbers.isrepeat then
final_unit = ''
end
n_text = range_text(values.numbers, unit_table, options)
need_parens = true
end
if e_10.clean then
if need_parens then
n_text = '(' .. n_text .. ')'
end
e_text = '10<sup>' .. delimit(e_10.sign, e_10.clean, fmt) .. '</sup>'
if number.clean then
e_text = '<span style="margin-left:0.25em;margin-right:0.15em;">×</span>' .. e_text
end
else
e_text = ''
end
local result =
(sortkey or '') ..
(options.prefix or '') ..
n_text ..
e_text ..
final_unit ..
(options.suffix or '')
if result ~= '' then
result = '<span class="nowrap">' .. result .. '</span>'
end
return result .. (options.warning or '')
end
local function check_parameters(args, has_ranges, nocat)
-- Return warning text for the first problem parameter found, or nothing if ok.
local whitelist = {
a = true,
action = true,
debug = true,
e = true,
['end'] = true,
errend = true,
['+errend'] = true,
['-errend'] = true,
fmt = true,
['long scale'] = true,
long_scale = true,
longscale = true,
nocategory = true,
p = true,
s = true,
sortable = true,
u = true,
ul = true,
up = true,
upl = true,
}
for k, v in pairs(args) do
if type(k) == 'string' and not whitelist[k] then
local warning = string.format(mtext['mt-val-not-supported'], k, v)
return valerror(warning, nocat, true)
end
end
if not has_ranges and args[4] then
return valerror(mtext['mt-ignore-parameter4'], nocat, true)
end
end
local function main(frame)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame, {wrappers = { 'Template:Val' }})
local nocat = args.nocategory
local numbers = {} -- table of number tables, perhaps with range text
local msg = get_args(numbers, args)
if msg then
return valerror(msg, nocat)
end
if args.u and args.ul then
return valerror(mtext['mt-both-u-ul'], nocat)
end
if args.up and args.upl then
return valerror(mtext['mt-both-up-upl'], nocat)
end
local values
if numbers.has_ranges then
-- Multiple values with range separators but no uncertainty.
numbers.nend = args['end']
values = {
numbers = numbers,
}
else
-- A single value with optional uncertainty.
local function setfield(i, dst, src)
local v = args[src]
if v then
if numbers[i] then
numbers[i][dst] = v
else
numbers[i] = { [dst] = v }
end
end
end
setfield(1, 'nend', 'end')
setfield(2, 'errend', '+errend')
setfield(3, 'errend', '-errend')
values = {
number = numbers[1],
uncertainty = {
upper = numbers[2],
lower = numbers[3],
errend = args.errend,
}
}
end
local unit_spec = {
u = args.ul or args.u,
want_link = args.ul ~= nil,
per = args.upl or args.up,
want_per_link = args.upl ~= nil,
want_longscale = (args.longscale or args.long_scale or args['long scale']) == 'on',
}
local options = {
action = args.action,
align = args.a,
e = numbers.e,
fmt = args.fmt,
nocat = nocat,
prefix = args.p,
sandbox = string.find(frame:getTitle(), 'sandbox', 1, true) ~= nil,
sortable = args.sortable or (args.debug == 'yes' and 'debug' or nil),
suffix = args.s,
warning = check_parameters(args, numbers.has_ranges, nocat),
}
return _main(values, unit_spec, options)
end
return { main = main, _main = _main }
6a50e544e78223a89c0b012cb5fc6de86419edf8
Module:Val/units
828
719
1101
2025-06-23T22:02:44Z
wikipedia>MSGJ
0
remove superfluous space
Scribunto
text/plain
-- Definitions for units known to val
-- File format is two strings and a return statement with them in it:
-- string in quotes [=[ ... builtin_units ... ]=].
-- string in quotes [=[ ... builtin_units_long_scale ... ]=].
-- First string, builtin_units, is short-scale, second string is long scale.
-- Entry format:
-- One record per line, starting in first column, having 2-4 fields.
-- Field separator: two or more spaces
-- Between first and second fields: two or more spaces
-- Between all other fields: two or more spaces, or one or more tabs
-- Entries without two spaces in them are ignored.
-- There must be a blank line before the first entry and after the last.
-- I.e. the first two and last two characters of the string must be newlines.
-- Format of entry. Two record types:
--
-- One record type is a wikilink:
-- Unit-code [[ pagename | Symbol-accepts-HTML-only ]]
-- Text-field separator is still two spaces. Two spaces not allowed in wikilink.
--
-- The other record type is all fields:
-- Unit-code symbol-accepts-HTML-only pagename#section-OK
--
-- Plus there is an optional field that goes at the end after two or more spaces.
-- Whether it is a number or an equation or the letters SI,
-- any of these three has the same function: a wikitable sorting "scale".
-- It is for sorting, and it works for either record type.
-- Difference is SI can't accept HTML. But SI correctly scales any SI prefix.
-- (Optional fields ALIAS and NOSPACE and ANGLE are for advanced users.)
-- "Invalid unit" error:
-- Using SI requires that the symbol equal unit-code, so never allows HTML.
-- Any difference between SI or symbol must be an SI prefix, such as k, M, or G.
-- A space at the end of an entry is an error. No space at each EOL.
local builtin_units = [=[
== Test ==
Foo [[Hz|<samp>Foo</samp>]]
Baz [[Hertz|baz<sub>0</sub>]]
Baz [[Kelvins|baz<sub>0</sub>]]
Bar [[Foobar|bar<abbr title="super duper">0</abbr>]]
quux [[Foobar|<span title="super duper 2">bar0</span>]]
== Unsorted units ==
c0 [[Speed of light#Numerical value, notation, and units|''c''<sub>0</sub>]]
lbf [[Pound (force)|<span title="pound-force">lb<sub>F</sub></span>]]
N.s [[Newton-second|N⋅s]]
J.K-1 [[Joule per kelvin|J⋅K<sup>−1</sup>]]
C.mol-1 [[Faraday constant|C⋅mol<sup>−1</sup>]]
C/mol [[Faraday constant|C/mol]]
C.kg-1 [[Roentgen (unit)|C⋅kg<sup>−1</sup>]]
C/kg [[Roentgen (unit)|C/kg]]
F.m-1 [[vacuum permittivity|F⋅m<sup>−1</sup>]]
F/m [[vacuum permittivity|F/m]]
e [[Elementary charge|''e'']]
kB [[Kilobyte|kB]] 8e3
KB [[Kilobyte|KB]] 8e3
MB [[Megabyte|MB]] 8e6
GB [[Gigabyte|GB]] 8e9
TB [[Terabyte|TB]] 8e12
lx [[Lux (unit)|lx]]
nat [[nat (unit)|nat]]
== Time and frequency ==
byte/s [[Data rate units|byte/s]] 8
kB/s [[Data rate units#Kilobyte per second|<span title="Kilobytes per second">kB/s</span>]] 8e3
MB/s [[Data rate units#Megabyte per second|<span title="Megabytes per second">MB/s</span>]] 8e6
GB/s [[Data rate units#Gigabyte per second|<span title="Gigabytes per second">GB/s</span>]] 8e9
TB/s [[Data rate units#Terabyte per second|<span title="Terabytes per second">TB/s</span>]] 8e12
bit/s [[Bit per second|bit/s]] 1
bps [[Bit per second|bit/s]] 1
kbit/s [[Kilobit per second|kbit/s]] 1e3
Mbit/s [[Megabit per second|Mbit/s]] 1e6
Gbit/s [[Gigabit per second|Gbit/s]] 1e9
Tbit/s [[Terabit per second|Tbit/s]] 1e12
kT/s [[Transfer (computing)|<span title="Kilotransfers per second">kT/s</span>]] 1e3
MT/s [[Transfer (computing)|<span title="Megatransfers per second">MT/s</span>]] 1e6
GT/s [[Transfer (computing)|<span title="Gigatransfers per second">GT/s</span>]] 1e9
year [[Year|year]] 31557600
years [[Year|years]] 31557600
yr [[Year#Symbols and abbreviations|yr]] 31557600
y [[Year|y]] 31557600
a [[Annum|a]] 31557600
Ga [[Gigaannum|Ga]] 31557600000000000
Ma [[Megaannum|Ma]] 31557600000000
ka [[Kiloannum|ka]] 31557600000
kyr [[kyr|kyr]] 31557600000
kya [[kyr|kya]] 31557600000
myr [[myr|myr]] 31557600000000
mya [[Mya (unit)|mya]] 31557600000000
byr [[Billion years|byr]] 31557600000000000
bya [[Billion years ago|bya]] 31557600000000000
Gyr [[billion years|Gyr]] 31557600000000000
BP [[Before present|BP]]
uBP [[Radiocarbon dating#Calibration|<sup>14</sup>C yr BP]]
BC [[Before Christ|BC]] -1
AD [[Anno Domini|AD]] 1
BCE [[Before the Common Era|BCE]] -1
CE [[Common Era|CE]] 1
JD [[Julian date|JD]] 1
MJD [[Modified Julian date|MJD]] 1
s-1 [[Second|s<sup>−1</sup>]]
s-2 [[Second|s<sup>−2</sup>]]
s2 [[Second|s<sup>2</sup>]]
s [[Second|s]] SI
as [[Attosecond|s]] SI
cs [[Second|s]] SI
das [[Second|s]] SI
ds [[Second|s]] SI
Es [[Second|s]] SI
fs [[Femtosecond|s]] SI
Gs [[Second|s]] SI
hs [[Second|s]] SI
ks [[Second|s]] SI
ms [[Millisecond|s]] SI
µs [[Microsecond|s]] SI
us [[Microsecond|s]] SI
Ms [[Second|s]] SI
ns [[Nanosecond|s]] SI
ps [[Picosecond|s]] SI
Ps [[Second|s]] SI
Ts [[Second|s]] SI
Ys [[Second|s]] SI
ys [[Yoctosecond|s]] SI
Zs [[Second|s]] SI
zs [[Zeptosecond|s]] SI
Hz [[Hertz|Hz]] SI
aHz [[Hertz|Hz]] SI
cHz [[Hertz|Hz]] SI
daHz [[Hertz|Hz]] SI
dHz [[Hertz|Hz]] SI
EHz [[Hertz|Hz]] SI
fHz [[Hertz|Hz]] SI
hHz [[Hertz|Hz]] SI
GHz [[Gigahertz|Hz]] SI
kHz [[Kilohertz|Hz]] SI
MHz [[Megahertz|Hz]] SI
mHz [[Hertz|Hz]] SI
uHz [[Hertz|Hz]] SI
µHz [[Hertz|Hz]] SI
nHz [[Hertz|Hz]] SI
pHz [[Hertz|Hz]] SI
PHz [[Hertz|Hz]] SI
THz [[Hertz|Hz]] SI
yHz [[Hertz|Hz]] SI
YHz [[Hertz|Hz]] SI
zHz [[Hertz|Hz]] SI
ZHz [[Hertz|Hz]] SI
ips [[Inch per second|ips]]
== Length, area, volume ==
Å3 [[Ångström|Å<sup>3</sup>]]
fb-1 [[Barn (unit)#Inverse femtobarn|fb<sup>−1</sup>]]
m-1 [[Metre|m<sup>−1</sup>]]
m-2 [[Square metre|m<sup>−2</sup>]]
m-3 [[Cubic metre|m<sup>−3</sup>]]
km2 [[Square kilometre|km<sup>2</sup>]]
km3 [[Cubic kilometre|km<sup>3</sup>]]
µm2 [[Square metre|µm<sup>2</sup>]]
um2 [[Square metre|µm<sup>2</sup>]]
am2 [[Square metre|am<sup>2</sup>]]
cm2 [[Square centimetre|cm<sup>2</sup>]]
dam2 [[Square metre|dam<sup>2</sup>]]
dm2 [[Square metre|dm<sup>2</sup>]]
Em2 [[Square metre|Em<sup>2</sup>]]
fm2 [[Square metre|fm<sup>2</sup>]]
Gm2 [[Square metre|Gm<sup>2</sup>]]
hm2 [[Square metre|hm<sup>2</sup>]]
mm2 [[Square metre|mm<sup>2</sup>]]
Mm2 [[Square metre|Mm<sup>2</sup>]]
nm2 [[Square metre|nm<sup>2</sup>]]
pm2 [[Square metre|pm<sup>2</sup>]]
Pm2 [[Square metre|Pm<sup>2</sup>]]
Tm2 [[Square metre|Tm<sup>2</sup>]]
ym2 [[Square metre|ym<sup>2</sup>]]
Ym2 [[Square metre|Ym<sup>2</sup>]]
zm2 [[Square metre|zm<sup>2</sup>]]
Zm2 [[Square metre|Zm<sup>2</sup>]]
gal [[Gallon|gal]]
Gal [[Gal (unit)|Gal]]
uGal [[Gal (unit)|µGal]]
µGal [[Gal (unit)|µGal]]
mGal [[Gal (unit)|mGal]]
b [[Barn (unit)|b]] SI
ab [[Barn (unit)|b]] SI
cb [[Barn (unit)|b]] SI
dab [[Barn (unit)|b]] SI
db [[Barn (unit)|b]] SI
Eb [[Barn (unit)|b]] SI
fb [[Barn (unit)|b]] SI
Gb [[Barn (unit)|b]] SI
hb [[Barn (unit)|b]] SI
kb [[Barn (unit)|b]] SI
mb [[Barn (unit)|b]] SI
µb [[Barn (unit)|b]] SI
ub [[Barn (unit)|b]] SI
Mb [[Barn (unit)|b]] SI
nb [[Barn (unit)|b]] SI
pb [[Barn (unit)|b]] SI
Pb [[Barn (unit)|b]] SI
Tb [[Barn (unit)|b]] SI
Yb [[Barn (unit)|b]] SI
yb [[Barn (unit)|b]] SI
Zb [[Barn (unit)|b]] SI
zb [[Barn (unit)|b]] SI
== Velocity and acceleration ==
m.s-2 [[Metre per second squared|m⋅s<sup>−2</sup>]]
m/s2 [[Metre per second squared|m/s<sup>2</sup>]]
m.s-1 [[Metre per second|m⋅s<sup>−1</sup>]]
m/s [[Metre per second|m/s]]
km.s-1 [[Metre per second|km⋅s<sup>−1</sup>]]
km/s [[Metre per second|km/s]]
== Mass and energy ==
lbm [[Pound (mass)|<span title="pound-mass">lb<sub>m</sub></span>]]
uJ [[Joule|µJ]]
J.s [[Joule-second|J⋅s]]
kWh [[Kilowatt hour|kWh]]
kW.h [[Kilowatt hour|kW⋅h]]
J/C [[Volt|J/C]]
J/kg [[Joule|J/kg]]
Da [[Dalton (unit)|Da]] SI
EDa [[Dalton (unit)|Da]] SI
PDa [[Dalton (unit)|Da]] SI
TDa [[Dalton (unit)|Da]] SI
GDa [[Dalton (unit)|Da]] SI
MDa [[Dalton (unit)|Da]] SI
kDa [[Dalton (unit)|Da]] SI
mDa [[Dalton (unit)|Da]] SI
uDa [[Dalton (unit)|Da]] SI
μDa [[Dalton (unit)|Da]] SI
nDa [[Dalton (unit)|Da]] SI
pDa [[Dalton (unit)|Da]] SI
fDa [[Dalton (unit)|Da]] SI
aDa [[Dalton (unit)|Da]] SI
g [[Gram|g]] SI
ag [[Attogram|g]] SI
cg [[Centigram|g]] SI
dag [[Gram|g]] SI
dg [[Decigram|g]] SI
Eg [[Exagram|g]] SI
fg [[Femtogram|g]] SI
Gg [[Gigagram|g]] SI
hg [[Kilogram#SI multiples|g]] SI
kg [[Kilogram|g]] SI
mcg [[Microgram|g]] SI
Mg [[Megagram|g]] SI
mg [[Milligram|g]] SI
ug [[Microgram|g]] SI
µg [[Microgram|g]] SI
ng [[Nanogram|g]] SI
Pg [[Petagram|g]] SI
pg [[Picogram|g]] SI
Tg [[Tonne|g]] SI
yg [[Yoctogram|g]] SI
Yg [[Yottagram|g]] SI
zg [[Zeptogram|g]] SI
Zg [[Zettagram|g]] SI
== Pressure and density ==
psi [[Pounds per square inch|psi]]
g.cm-3 [[Gram per cubic centimetre|g⋅cm<sup>−3</sup>]]
g/cm3 [[Gram per cubic centimetre|g/cm<sup>3</sup>]]
kg.m-3 [[Kilogram per cubic metre|kg⋅m<sup>−3</sup>]]
kg/m3 [[Kilogram per cubic metre|kg/m<sup>3</sup>]]
kg/cm3 [[Density#Formula and common units|kg/cm<sup>3</sup>]]
g/L [[Gram per litre|g/L]]
g/l [[Gram per litre|g/l]]
mcg/dL [[Gram per litre|µg/dL]]
mcg/dl [[Gram per litre|µg/dl]]
mg/mL [[Gram per litre|mg/mL]]
mg/ml [[Gram per litre|mg/ml]]
ug/dL [[Gram per litre|µg/dL]]
ug/dl [[Gram per litre|µg/dl]]
μg/dL [[Gram per litre|μg/dL]]
μg/dl [[Gram per litre|μg/dl]]
mg.L-1 [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]]
mg/L [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]]
mg.l-1 [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]]
mg/l [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]]
== Fracture toughness ==
MPa.m.5 [[Fracture toughness|MPa⋅m<sup>1/2</sup>]]
kPa.m.5 [[Fracture toughness|kPa⋅m<sup>1/2</sup>]]
Pa.m.5 [[Fracture toughness|Pa⋅m<sup>1/2</sup>]]
== Temperature ==
degC °C ALIAS
degF °F ALIAS
degR °R ALIAS
K [[Kelvin|K]] SI
YK [[Yottakelvin|K]] SI
ZK [[Zettakelvin|K]] SI
EK [[Kelvin|K]] SI
PK [[Petakelvin|K]] SI
TK [[Terakelvin|K]] SI
GK [[Gigakelvin|K]] SI
MK [[Megakelvin|K]] SI
kK [[Kilokelvin|K]] SI
hK [[Hectokelvin|K]] SI
daK [[Decakelvin|K]] SI
dK [[Decikelvin|K]] SI
cK [[Centikelvin|K]] SI
mK [[Millikelvin|K]] SI
µK [[Microkelvin|K]] SI
uK [[Microkelvin|K]] SI
nK [[Nanokelvin|K]] SI
pK [[Picokelvin|K]] SI
fK [[Femtokelvin|K]] SI
aK [[Attokelvin|K]] SI
zK [[Zeptokelvin|K]] SI
yK [[Yoctokelvin|K]] SI
== Electromagnetism ==
Wb [[Weber (unit)|Wb]]
N.A-2 [[Permeability (electromagnetism)|N⋅A<sup>−2</sup>]]
H.m-1 [[Permeability (electromagnetism)|H⋅m<sup>−1</sup>]]
V.m-1 [[Electric field|V⋅m<sup>−1</sup>]]
V/m [[Electric field|V/m]]
C [[Coulomb|C]] SI
YC [[Coulomb|C]] SI
ZC [[Coulomb|C]] SI
EC [[Coulomb|C]] SI
PC [[Coulomb|C]] SI
TC [[Coulomb|C]] SI
GC [[Coulomb|C]] SI
MC [[Coulomb|C]] SI
kC [[Coulomb|C]] SI
hC [[Coulomb|C]] SI
daC [[Coulomb|C]] SI
dC [[Coulomb|C]] SI
cC [[Coulomb|C]] SI
mC [[Coulomb|C]] SI
µC [[Coulomb|C]] SI
uC [[Coulomb|C]] SI
nC [[Coulomb|C]] SI
pC [[Coulomb|C]] SI
fC [[Coulomb|C]] SI
aC [[Coulomb|C]] SI
zC [[Coulomb|C]] SI
yC [[Coulomb|C]] SI
F [[Farad|F]] SI
YF [[Farad|F]] SI
ZF [[Farad|F]] SI
EF [[Farad|F]] SI
PF [[Farad|F]] SI
TF [[Farad|F]] SI
GF [[Farad|F]] SI
MF [[Farad|F]] SI
kF [[Farad|F]] SI
hF [[Farad|F]] SI
daF [[Farad|F]] SI
dF [[Farad|F]] SI
cF [[Farad|F]] SI
mF [[Farad|F]] SI
µF [[Farad|F]] SI
uF [[Farad|F]] SI
nF [[Farad|F]] SI
pF [[Farad|F]] SI
fF [[Farad|F]] SI
aF [[Farad|F]] SI
zF [[Farad|F]] SI
yF [[Farad|F]] SI
H [[Henry (unit)|H]] SI
YH [[Henry (unit)|H]] SI
ZH [[Henry (unit)|H]] SI
EH [[Henry (unit)|H]] SI
PH [[Henry (unit)|H]] SI
TH [[Henry (unit)|H]] SI
GH [[Henry (unit)|H]] SI
MH [[Henry (unit)|H]] SI
kH [[Henry (unit)|H]] SI
hH [[Henry (unit)|H]] SI
daH [[Henry (unit)|H]] SI
dH [[Henry (unit)|H]] SI
cH [[Henry (unit)|H]] SI
mH [[Henry (unit)|H]] SI
µH [[Henry (unit)|H]] SI
uH [[Henry (unit)|H]] SI
nH [[Henry (unit)|H]] SI
pH [[Henry (unit)|H]] SI
fH [[Henry (unit)|H]] SI
aH [[Henry (unit)|H]] SI
zH [[Henry (unit)|H]] SI
yH [[Henry (unit)|H]] SI
A [[Ampere|A]] SI
YA [[Ampere|A]] SI
ZA [[Ampere|A]] SI
EA [[Ampere|A]] SI
PA [[Ampere|A]] SI
TA [[Ampere|A]] SI
GA [[Ampere|A]] SI
MA [[Ampere|A]] SI
kA [[Ampere|A]] SI
hA [[Ampere|A]] SI
daA [[Ampere|A]] SI
dA [[Ampere|A]] SI
cA [[Ampere|A]] SI
mA [[Ampere|A]] SI
µA [[Ampere|A]] SI
uA [[Ampere|A]] SI
nA [[Ampere|A]] SI
pA [[Ampere|A]] SI
fA [[Ampere|A]] SI
aA [[Ampere|A]] SI
zA [[Ampere|A]] SI
yA [[Ampere|A]] SI
V [[Volt|V]] SI
YV [[Volt|V]] SI
ZV [[Volt|V]] SI
EV [[Volt|V]] SI
PV [[Volt|V]] SI
TV [[Volt|V]] SI
GV [[Volt|V]] SI
MV [[Volt|V]] SI
kV [[Volt|V]] SI
hV [[Volt|V]] SI
daV [[Volt|V]] SI
dV [[Volt|V]] SI
cV [[Volt|V]] SI
mV [[Volt|V]] SI
µV [[Volt|V]] SI
uV [[Volt|V]] SI
nV [[Volt|V]] SI
pV [[Volt|V]] SI
fV [[Volt|V]] SI
aV [[Volt|V]] SI
zV [[Volt|V]] SI
yV [[Volt|V]] SI
VA [[Volt-ampere|VA]] SI
YVA [[Volt-ampere|VA]] SI
ZVA [[Volt-ampere|VA]] SI
EVA [[Volt-ampere|VA]] SI
PVA [[Volt-ampere|VA]] SI
TVA [[Volt-ampere|VA]] SI
GVA [[Volt-ampere|VA]] SI
MVA [[Volt-ampere|VA]] SI
kVA [[Volt-ampere|VA]] SI
hVA [[Volt-ampere|VA]] SI
daVA [[Volt-ampere|VA]] SI
dVA [[Volt-ampere|VA]] SI
cVA [[Volt-ampere|VA]] SI
mVA [[Volt-ampere|VA]] SI
µVA [[Volt-ampere|VA]] SI
uVA [[Volt-ampere|VA]] SI
nVA [[Volt-ampere|VA]] SI
pVA [[Volt-ampere|VA]] SI
fVA [[Volt-ampere|VA]] SI
aVA [[Volt-ampere|VA]] SI
zVA [[Volt-ampere|VA]] SI
yVA [[Volt-ampere|VA]] SI
Ω [[Ohm|Ω]] SI
YΩ.m [[Electrical resistivity and conductivity#Definition|YΩ⋅m]] 1e24
ZΩ.m [[Electrical resistivity and conductivity#Definition|ZΩ⋅m]] 1e21
EΩ.m [[Electrical resistivity and conductivity#Definition|EΩ⋅m]] 1e18
PΩ.m [[Electrical resistivity and conductivity#Definition|PΩ⋅m]] 1e15
TΩ.m [[Electrical resistivity and conductivity#Definition|TΩ⋅m]] 1e12
GΩ.m [[Electrical resistivity and conductivity#Definition|GΩ⋅m]] 1e9
MΩ.m [[Electrical resistivity and conductivity#Definition|MΩ⋅m]] 1e6
kΩ.m [[Electrical resistivity and conductivity#Definition|kΩ⋅m]] 1e3
Ω.m [[Electrical resistivity and conductivity#Definition|Ω⋅m]] 1
mΩ.m [[Electrical resistivity and conductivity#Definition|mΩ⋅m]] 1e-3
µΩ.m [[Electrical resistivity and conductivity#Definition|µΩ⋅m]] 1e-6
uΩ.m [[Electrical resistivity and conductivity#Definition|µΩ⋅m]] 1e-6
nΩ.m [[Electrical resistivity and conductivity#Definition|nΩ⋅m]] 1e-9
pΩ.m [[Electrical resistivity and conductivity#Definition|pΩ⋅m]] 1e-12
fΩ.m [[Electrical resistivity and conductivity#Definition|fΩ⋅m]] 1e-15
aΩ.m [[Electrical resistivity and conductivity#Definition|aΩ⋅m]] 1e-18
zΩ.m [[Electrical resistivity and conductivity#Definition|zΩ⋅m]] 1e-21
yΩ.m [[Electrical resistivity and conductivity#Definition|yΩ⋅m]] 1e-24
R [[Rayleigh (unit)|R]] SI
G [[Gauss (unit)|G]] SI
aG [[Attogauss|G]] SI
cG [[Centigauss|G]] SI
daG [[Decagauss|G]] SI
dG [[Decigauss|G]] SI
EG [[Exagauss|G]] SI
fG [[Femtogauss|G]] SI
GG [[Gigagauss|G]] SI
hG [[Hectogauss|G]] SI
kG [[Kilogauss|G]] SI
MG [[Megagauss|G]] SI
mG [[Milligauss|G]] SI
uG [[Microgauss|G]] SI
µG [[Microgauss|G]] SI
nG [[Nanogauss|G]] SI
PG [[Petagauss|G]] SI
pG [[Picogauss|G]] SI
TG [[Teragauss|G]] SI
yG [[Yoctogauss|G]] SI
YG [[Yottagauss|G]] SI
zG [[Zeptogauss|G]] SI
ZG [[Zettagauss|G]] SI
T [[Tesla (unit)|T]] SI
aT [[Attotesla|T]] SI
cT [[Centitesla|T]] SI
daT [[Decatesla|T]] SI
dT [[Decitesla|T]] SI
ET [[Exatesla|T]] SI
fT [[Femtotesla|T]] SI
GT [[Gigatesla|T]] SI
hT [[Hectotesla|T]] SI
kT [[Kilotesla|T]] SI
MT [[Megatesla|T]] SI
mT [[Millitesla|T]] SI
uT [[Microtesla|T]] SI
µT [[Microtesla|T]] SI
nT [[Nanotesla|T]] SI
PT [[Petatesla|T]] SI
pT [[Picotesla|T]] SI
TT [[Teratesla|T]] SI
yT [[Yoctotesla|T]] SI
YT [[Yottatesla|T]] SI
zT [[Zeptotesla|T]] SI
ZT [[Zettatesla|T]] SI
== Astrophysics ==
au [[Astronomical unit|au]]
c [[Speed of light|''c'']]
ly [[Light-year|ly]]
Earth mass [[Earth mass|''M''<sub>🜨</sub>]]
Earth radius [[Earth radius|''R''<sub>🜨</sub>]]
M_Earth [[Earth mass|''M''<sub>🜨</sub>]]
R_Earth [[Earth radius|''R''<sub>🜨</sub>]]
M+ [[Earth mass|''M''<sub>🜨</sub>]]
R+ [[Earth radius|''R''<sub>🜨</sub>]]
Jupiter mass [[Jupiter mass|''M''<sub>J</sub>]]
Jupiter radius [[Jupiter radius|''R''<sub>J</sub>]]
Jy [[Jansky|Jy]]
M_Jupiter [[Jupiter mass|''M''<sub>J</sub>]]
R_Jupiter [[Jupiter radius|''R''<sub>J</sub>]]
Solar mass [[Solar mass|''M''<sub>☉</sub>]]
solar mass [[Solar mass|''M''<sub>☉</sub>]]
M_Solar [[Solar mass|''M''<sub>☉</sub>]]
M_solar [[Solar mass|''M''<sub>☉</sub>]]
R_Solar [[Solar radius|''R''<sub>☉</sub>]]
R_solar [[Solar radius|''R''<sub>☉</sub>]]
Solar radius [[Solar radius|''R''<sub>☉</sub>]]
solar radius [[Solar radius|''R''<sub>☉</sub>]]
Solar luminosity [[Solar luminosity|''L''<sub>☉</sub>]]
solar luminosity [[Solar luminosity|''L''<sub>☉</sub>]]
L_solar [[Solar luminosity|''L''<sub>☉</sub>]]
L_Solar [[Solar luminosity|''L''<sub>☉</sub>]]
Lo [[Solar luminosity|''L''<sub>☉</sub>]]
pc2 [[Parsec|pc<sup>2</sup>]]
pc3 [[Parsec|pc<sup>3</sup>]]
kpc2 [[Parsec#Parsecs and kiloparsecs|kpc<sup>2</sup>]]
kpc3 [[Parsec#Parsecs and kiloparsecs|kpc<sup>3</sup>]]
kpc [[Parsec#Parsecs and kiloparsecs|kpc]]
Mpc2 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>2</sup>]]
Mpc3 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>3</sup>]]
Mpc [[Parsec#Megaparsecs and gigaparsecs|Mpc]]
Gpc2 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>2</sup>]]
Gpc3 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>3</sup>]]
Gpc [[Parsec#Megaparsecs and gigaparsecs|Gpc]]
== Nuclear physics and chemistry ==
cm-1 [[Wavenumber|cm<sup>−1</sup>]]
u [[Unified atomic mass unit|u]]
osmol [[Osmole (unit)|osmol]]
Osm [[Osmole (unit)|Osm]]
M [[Molarity|M]]
TM [[Molarity|M]] SI
GM [[Molarity|M]] SI
MM [[Molarity|M]] SI
kM [[Molarity|M]] SI
hM [[Molarity|M]] SI
daM [[Molarity|M]] SI
dM [[Molarity|M]] SI
cM [[Molarity|M]] SI
mM [[Molarity|M]] SI
uM [[Molarity|M]] 1e-6
nM [[Molarity|M]] SI
pM [[Molarity|M]] SI
kg.mol-1 [[Molar mass|kg⋅mol<sup>−1</sup>]]
kg/mol [[Molar mass|kg/mol]]
g.mol-1 [[Molar mass|g⋅mol<sup>−1</sup>]]
g/mol [[Molar mass|g/mol]]
eV/c2 [[Electronvolt#Mass|eV/''c''<sup>2</sup>]]
keV/c2 [[Electronvolt#Mass|keV/''c''<sup>2</sup>]]
MeV/c2 [[Electronvolt#Mass|MeV/''c''<sup>2</sup>]]
GeV/c2 [[Electronvolt#Mass|GeV/''c''<sup>2</sup>]]
TeV/c2 [[Electronvolt#Mass|TeV/''c''<sup>2</sup>]]
eV [[Electronvolt|eV]]
meV [[Electronvolt|meV]]
keV [[Electronvolt|keV]]
MeV [[Electronvolt|MeV]]
GeV [[Electronvolt|GeV]]
TeV [[Electronvolt|TeV]]
mol-1 [[Avogadro constant|mol<sup>−1</sup>]]
J.mol-1 [[Joule per mole|J⋅mol<sup>−1</sup>]]
J/mol [[Joule per mole|J/mol]]
kJ.mol-1 [[Joule per mole|kJ⋅mol<sup>−1</sup>]]
kJ/mol [[Joule per mole|kJ/mol]]
MJ.mol-1 [[Joule per mole|MJ⋅mol<sup>−1</sup>]]
MJ/mol [[Joule per mole|MJ/mol]]
GJ.mol-1 [[Joule per mole|GJ⋅mol<sup>−1</sup>]]
GJ/mol [[Joule per mole|GJ/mol]]
TJ.mol-1 [[Joule per mole|TJ⋅mol<sup>−1</sup>]]
TJ/mol [[Joule per mole|TJ/mol]]
μB [[Bohr magneton|''μ''<sub>B</sub>]]
== Numbers and phrases ==
pp [[Page (paper)|pp]]
ppb [[Parts per billion|ppb]] 1e-9
ppm [[Parts per million|ppm]] 1e-6
billiard [[Orders of magnitude (numbers)#1015|billiard]] 1e15
billion [[1,000,000,000|billion]] 1e9
billionth [[1,000,000,000|billionth]] 1e-9
billionths [[1,000,000,000|billionths]] 1e-9
decilliard [[Orders of magnitude (numbers)#1063|decilliard]] 1e63
decillion [[Orders of magnitude (numbers)#1033|decillion]] 1e33
decillionth [[Orders of magnitude (numbers)#1033|decillionth]] 1e-33
decillionths [[Orders of magnitude (numbers)#1033|decillionths]] 1e-33
milliard [[1,000,000,000|milliard]] 1e9
million [[Million|million]] 1e6
millionth [[Million|millionth]] 1e-6
millionths [[Million|millionths]] 1e-6
nonilliard [[Orders of magnitude (numbers)#1057|nonilliard]] 1e57
nonillion [[Orders of magnitude (numbers)#1030|nonillion]] 1e30
nonillionth [[Orders of magnitude (numbers)#1030|nonillionth]] 1e-30
nonillionths [[Orders of magnitude (numbers)#1030|nonillionths]] 1e-30
octilliard [[Orders of magnitude (numbers)#1051|octilliard]] 1e51
octillion [[Orders of magnitude (numbers)#1027|octillion]] 1e27
octillionth [[Orders of magnitude (numbers)#1027|octillionth]] 1e-27
octillionths [[Orders of magnitude (numbers)#1027|octillionths]] 1e-27
quadrilliard [[Orders of magnitude (numbers)#1027|quadrilliard]] 1e27
quadrillion [[Orders of magnitude (numbers)#1015|quadrillion]] 1e15
quadrillionth [[Orders of magnitude (numbers)#1015|quadrillionth]] 1e-15
quadrillionths [[Orders of magnitude (numbers)#1015|quadrillionths]] 1e-15
quintilliard [[Orders of magnitude (numbers)#1033|quintilliard]] 1e33
quintillion [[Orders of magnitude (numbers)#1018|quintillion]] 1e18
quintillionth [[Orders of magnitude (numbers)#1018|quintillionth]] 1e-18
quintillionths [[Orders of magnitude (numbers)#1018|quintillionths]] 1e-18
septilliard [[Orders of magnitude (numbers)#1045|septilliard]] 1e45
septillion [[Orders of magnitude (numbers)#1024|septillion]] 1e24
septillionth [[Orders of magnitude (numbers)#1024|septillionth]] 1e-24
septillionths [[Orders of magnitude (numbers)#1024|septillionths]] 1e-24
sextilliard [[Orders of magnitude (numbers)#1039|sextilliard]] 1e39
sextillion [[Orders of magnitude (numbers)#1021|sextillion]] 1e21
sextillionth [[Orders of magnitude (numbers)#1021|sextillionth]] 1e-21
sextillionths [[Orders of magnitude (numbers)#1021|sextillionths]] 1e-21
trilliard [[Orders of magnitude (numbers)#1021|trilliard]] 1e21
trillion [[Orders of magnitude (numbers)#1012|trillion]] 1e12
trillionth [[Orders of magnitude (numbers)#1012|trillionth]] 1e-12
trillionths [[Orders of magnitude (numbers)#1012|trillionths]] 1e-12
== Angles ==
% % Percent ANGLE 0.01
percent % Percent ANGLE 0.01
per cent % Percent ANGLE 0.01
‰ ‰ Per mil ANGLE 1e-3
per mil ‰ Per mil ANGLE 1e-3
per mill ‰ Per mil ANGLE 1e-3
per mille ‰ Per mil ANGLE 1e-3
permil ‰ Per mil ANGLE 1e-3
permill ‰ Per mil ANGLE 1e-3
permille ‰ Per mil ANGLE 1e-3
° ° Degree (angle) ANGLE pi/180
deg ° Degree (angle) ANGLE pi/180
degree ° Degree (angle) NOSPACE pi/180 -- for a degree symbol that does not repeat
' ′ Minute of arc ANGLE pi/10800
′ ′ Minute of arc ANGLE pi/10800
arcmin ′ Minute of arc ANGLE pi/10800
arcminute ′ Minute of arc ANGLE pi/10800
" ″ Second of arc ANGLE pi/648000
″ ″ Second of arc ANGLE pi/648000
arcsec ″ Second of arc ANGLE pi/648000
arcsecond ″ Second of arc ANGLE pi/648000
mas [[Milliarcsecond|mas]] pi/648000000
]=]
-- If val has "|long scale=on" the following definitions are used
-- (then, if not found here, the normal definitions are used).
-- Unit code [[Link|Symbol]] Flags/Scale
local builtin_units_long_scale = [=[
== Long scale numbers and phrases ==
billion [[Orders of magnitude (numbers)#1012|billion]] 1e12
billionth [[Orders of magnitude (numbers)#1012|billionth]] 1e-12
billionths [[Orders of magnitude (numbers)#1012|billionths]] 1e-12
decillion [[Orders of magnitude (numbers)#1060|decillion]] 1e60
decillionth [[Orders of magnitude (numbers)#1060|decillionth]] 1e-60
decillionths [[Orders of magnitude (numbers)#1060|decillionths]] 1e-60
nonillion [[Orders of magnitude (numbers)#1054|nonillion]] 1e54
nonillionth [[Orders of magnitude (numbers)#1054|nonillionth]] 1e-54
nonillionths [[Orders of magnitude (numbers)#1054|nonillionths]] 1e-54
octillion [[Orders of magnitude (numbers)#1048|octillion]] 1e48
octillionth [[Orders of magnitude (numbers)#1048|octillionth]] 1e-48
octillionths [[Orders of magnitude (numbers)#1048|octillionths]] 1e-48
quadrillion [[Orders of magnitude (numbers)#1024|quadrillion]] 1e24
quadrillionth [[Orders of magnitude (numbers)#1024|quadrillionth]] 1e-24
quadrillionths [[Orders of magnitude (numbers)#1024|quadrillionths]] 1e-24
quintillion [[Orders of magnitude (numbers)#1030|quintillion]] 1e30
quintillionth [[Orders of magnitude (numbers)#1030|quintillionth]] 1e-30
quintillionths [[Orders of magnitude (numbers)#1030|quintillionths]] 1e-30
septillion [[Orders of magnitude (numbers)#1042|septillion]] 1e42
septillionth [[Orders of magnitude (numbers)#1042|septillionth]] 1e-42
septillionths [[Orders of magnitude (numbers)#1042|septillionths]] 1e-42
sextillion [[Orders of magnitude (numbers)#1036|sextillion]] 1e36
sextillionth [[Orders of magnitude (numbers)#1036|sextillionth]] 1e-36
sextillionths [[Orders of magnitude (numbers)#1036|sextillionths]] 1e-36
trillion [[Orders of magnitude (numbers)#1018|trillion]] 1e18
trillionth [[Orders of magnitude (numbers)#1018|trillionth]] 1e-18
trillionths [[Orders of magnitude (numbers)#1018|trillionths]] 1e-18
]=]
return { builtin_units = builtin_units, builtin_units_long_scale = builtin_units_long_scale }
2307ae0d1410328f2d5ace7ab494855c5cb9c9e9
Module:Convert/extra
828
725
1113
2025-07-02T08:58:47Z
wikipedia>Johnuniq
0
try "per-km2" workaround per [[Template talk:Convert#per km²]]
Scribunto
text/plain
-- Extra conversion data used by Module:Convert.
--
-- [[Module:Convert/data]] defines all units and is transcluded in all pages
-- where [[Module:Convert]] is used. Testing new units by editing that module
-- would invalidate the cache for all affected pages.
--
-- For quick changes and experiments with new units, this module can be edited.
-- Since this module is transcluded in only a small number of pages, changes
-- should cause little server overhead and should propagate quickly.
--
-- If a unit is defined in the data module, any definition here is ignored,
-- so defining the same unit in both modules is not an error.
-- A unit defined here can refer to units that are also defined here, and
-- can refer to units defined in the data module.
--
-- Periodically, those extra units that are wanted permanently can be removed
-- from here after being added to [[Module:Convert/data]].
local extra_units = {
["bit"] = {
_name1 = "bit",
_symbol = "bit",
utype = "information",
scale = 0.125,
prefixes = 1,
default = "B",
link = "Bit",
},
["per-km2"] = {
name1 = "per square kilometre",
name1_us = "per square kilometer",
name2 = "per square kilometre",
name2_us = "per square kilometer",
symbol = "per km<sup>2</sup>",
utype = "per unit area",
scale = 1e-6,
default = "/sqmi",
link = "Square kilometre",
},
}
return { extra_units = extra_units }
55a4ac716545a8687a16e661345c64dca7597848
Category:Dual Wields
14
469
702
2025-07-13T14:44:26Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
[[Category:Weapons]]
febdf29cf9dcbef034e184720fe19a5ac5f353d8
Category:Weapons
14
468
700
2025-07-13T14:45:01Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
'''Weapons''' are equipment the player can use to damage monsters and defend themselves.
98e971be059993e01129097dd2602abe573ed443
Sharp
0
526
812
2025-07-13T14:49:25Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
'''Sharp''' is a type of damage in {{BFF}}.
791f7c953da43e2ac6ebe338f36d863e32d3ac49
Module:Math
828
534
828
2025-07-13T14:59:23Z
Sharparam
284703
Initial page copied from [[wikipedia:Module:Math]]
Scribunto
text/plain
--[[
This module provides a number of basic mathematical operations.
]]
local yesno, getArgs -- lazily initialized
local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules.
local wrap = {} -- Holds wrapper functions that process arguments from #invoke. These act as intemediary between functions meant for #invoke and functions meant for Lua.
--[[
Helper functions used to avoid redundant code.
]]
local function err(msg)
-- Generates wikitext error messages.
return mw.ustring.format('<strong class="error">Formatting error: %s</strong>', msg)
end
local function unpackNumberArgs(args)
-- Returns an unpacked list of arguments specified with numerical keys.
local ret = {}
for k, v in pairs(args) do
if type(k) == 'number' then
table.insert(ret, v)
end
end
return unpack(ret)
end
local function makeArgArray(...)
-- Makes an array of arguments from a list of arguments that might include nils.
local args = {...} -- Table of arguments. It might contain nils or non-number values, so we can't use ipairs.
local nums = {} -- Stores the numbers of valid numerical arguments.
local ret = {}
for k, v in pairs(args) do
v = p._cleanNumber(v)
if v then
nums[#nums + 1] = k
args[k] = v
end
end
table.sort(nums)
for i, num in ipairs(nums) do
ret[#ret + 1] = args[num]
end
return ret
end
local function fold(func, ...)
-- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters,
-- and must return a number as an output. This number is then supplied as input to the next function call.
local vals = makeArgArray(...)
local count = #vals -- The number of valid arguments
if count == 0 then return
-- Exit if we have no valid args, otherwise removing the first arg would cause an error.
nil, 0
end
local ret = table.remove(vals, 1)
for _, val in ipairs(vals) do
ret = func(ret, val)
end
return ret, count
end
--[[
Fold arguments by selectively choosing values (func should return when to choose the current "dominant" value).
]]
local function binary_fold(func, ...)
local value = fold((function(a, b) if func(a, b) then return a else return b end end), ...)
return value
end
--[[
random
Generate a random number
Usage:
{{#invoke: Math | random }}
{{#invoke: Math | random | maximum value }}
{{#invoke: Math | random | minimum value | maximum value }}
]]
function wrap.random(args)
local first = p._cleanNumber(args[1])
local second = p._cleanNumber(args[2])
return p._random(first, second)
end
function p._random(first, second)
math.randomseed(mw.site.stats.edits + mw.site.stats.pages + os.time() + math.floor(os.clock() * 1000000000))
-- math.random will throw an error if given an explicit nil parameter, so we need to use if statements to check the params.
if first and second then
if first <= second then -- math.random doesn't allow the first number to be greater than the second.
return math.random(first, second)
end
elseif first then
return math.random(first)
else
return math.random()
end
end
--[[
order
Determine order of magnitude of a number
Usage:
{{#invoke: Math | order | value }}
]]
function wrap.order(args)
local input_string = (args[1] or args.x or '0');
local input_number = p._cleanNumber(input_string);
if input_number == nil then
return err('order of magnitude input appears non-numeric')
else
return p._order(input_number)
end
end
function p._order(x)
if x == 0 then return 0 end
return math.floor(math.log10(math.abs(x)))
end
--[[
precision
Detemines the precision of a number using the string representation
Usage:
{{ #invoke: Math | precision | value }}
]]
function wrap.precision(args)
local input_string = (args[1] or args.x or '0');
local trap_fraction = args.check_fraction;
local input_number;
if not yesno then
yesno = require('Module:Yesno')
end
if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]].
local pos = string.find(input_string, '/', 1, true);
if pos ~= nil then
if string.find(input_string, '/', pos + 1, true) == nil then
local denominator = string.sub(input_string, pos+1, -1);
local denom_value = tonumber(denominator);
if denom_value ~= nil then
return math.log10(denom_value);
end
end
end
end
input_number, input_string = p._cleanNumber(input_string);
if input_string == nil then
return err('precision input appears non-numeric')
else
return p._precision(input_string)
end
end
function p._precision(x)
if type(x) == 'number' then
x = tostring(x)
end
x = string.upper(x)
local decimal = x:find('%.')
local exponent_pos = x:find('E')
local result = 0;
if exponent_pos ~= nil then
local exponent = string.sub(x, exponent_pos + 1)
x = string.sub(x, 1, exponent_pos - 1)
result = result - tonumber(exponent)
end
if decimal ~= nil then
result = result + string.len(x) - decimal
return result
end
local pos = string.len(x);
while x:byte(pos) == string.byte('0') do
pos = pos - 1
result = result - 1
if pos <= 0 then
return 0
end
end
return result
end
--[[
max
Finds the maximum argument
Usage:
{{#invoke:Math| max | value1 | value2 | ... }}
Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.max(args)
return p._max(unpackNumberArgs(args))
end
function p._max(...)
local max_value = binary_fold((function(a, b) return a > b end), ...)
if max_value then
return max_value
end
end
--[[
median
Find the median of set of numbers
Usage:
{{#invoke:Math | median | number1 | number2 | ...}}
OR
{{#invoke:Math | median }}
]]
function wrap.median(args)
return p._median(unpackNumberArgs(args))
end
function p._median(...)
local vals = makeArgArray(...)
local count = #vals
table.sort(vals)
if count == 0 then
return 0
end
if p._mod(count, 2) == 0 then
return (vals[count/2] + vals[count/2+1])/2
else
return vals[math.ceil(count/2)]
end
end
--[[
min
Finds the minimum argument
Usage:
{{#invoke:Math| min | value1 | value2 | ... }}
OR
{{#invoke:Math| min }}
When used with no arguments, it takes its input from the parent
frame. Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.min(args)
return p._min(unpackNumberArgs(args))
end
function p._min(...)
local min_value = binary_fold((function(a, b) return a < b end), ...)
if min_value then
return min_value
end
end
--[[
sum
Finds the sum
Usage:
{{#invoke:Math| sum | value1 | value2 | ... }}
OR
{{#invoke:Math| sum }}
Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.sum(args)
return p._sum(unpackNumberArgs(args))
end
function p._sum(...)
local sums, count = fold((function(a, b) return a + b end), ...)
if not sums then
return 0
else
return sums
end
end
--[[
average
Finds the average
Usage:
{{#invoke:Math| average | value1 | value2 | ... }}
OR
{{#invoke:Math| average }}
Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.average(args)
return p._average(unpackNumberArgs(args))
end
function p._average(...)
local sum, count = fold((function(a, b) return a + b end), ...)
if not sum then
return 0
else
return sum / count
end
end
--[[
round
Rounds a number to specified precision
Usage:
{{#invoke:Math | round | value | precision }}
--]]
function wrap.round(args)
local value = p._cleanNumber(args[1] or args.value or 0)
local precision = p._cleanNumber(args[2] or args.precision or 0)
if value == nil or precision == nil then
return err('round input appears non-numeric')
else
return p._round(value, precision)
end
end
function p._round(value, precision)
local rescale = math.pow(10, precision or 0);
return math.floor(value * rescale + 0.5) / rescale;
end
--[[
log10
returns the log (base 10) of a number
Usage:
{{#invoke:Math | log10 | x }}
]]
function wrap.log10(args)
return math.log10(args[1])
end
--[[
mod
Implements the modulo operator
Usage:
{{#invoke:Math | mod | x | y }}
--]]
function wrap.mod(args)
local x = p._cleanNumber(args[1])
local y = p._cleanNumber(args[2])
if not x then
return err('first argument to mod appears non-numeric')
elseif not y then
return err('second argument to mod appears non-numeric')
else
return p._mod(x, y)
end
end
function p._mod(x, y)
local ret = x % y
if not (0 <= ret and ret < y) then
ret = 0
end
return ret
end
--[[
gcd
Calculates the greatest common divisor of multiple numbers
Usage:
{{#invoke:Math | gcd | value 1 | value 2 | value 3 | ... }}
--]]
function wrap.gcd(args)
return p._gcd(unpackNumberArgs(args))
end
function p._gcd(...)
local function findGcd(a, b)
local r = b
local oldr = a
while r ~= 0 do
local quotient = math.floor(oldr / r)
oldr, r = r, oldr - quotient * r
end
if oldr < 0 then
oldr = oldr * -1
end
return oldr
end
local result, count = fold(findGcd, ...)
return result
end
--[[
precision_format
Rounds a number to the specified precision and formats according to rules
originally used for {{template:Rnd}}. Output is a string.
Usage:
{{#invoke: Math | precision_format | number | precision }}
]]
function wrap.precision_format(args)
local value_string = args[1] or 0
local precision = args[2] or 0
return p._precision_format(value_string, precision)
end
function p._precision_format(value_string, precision)
-- For access to Mediawiki built-in formatter.
local lang = mw.getContentLanguage();
local value
value, value_string = p._cleanNumber(value_string)
precision = p._cleanNumber(precision)
-- Check for non-numeric input
if value == nil or precision == nil then
return err('invalid input when rounding')
end
local current_precision = p._precision(value)
local order = p._order(value)
-- Due to round-off effects it is neccesary to limit the returned precision under
-- some circumstances because the terminal digits will be inaccurately reported.
if order + precision >= 14 then
if order + p._precision(value_string) >= 14 then
precision = 13 - order;
end
end
-- If rounding off, truncate extra digits
if precision < current_precision then
value = p._round(value, precision)
current_precision = p._precision(value)
end
local formatted_num = lang:formatNum(math.abs(value))
local sign
-- Use proper unary minus sign rather than ASCII default
if value < 0 then
sign = '−'
else
sign = ''
end
-- Handle cases requiring scientific notation
if string.find(formatted_num, 'E', 1, true) ~= nil or math.abs(order) >= 9 then
value = value * math.pow(10, -order)
current_precision = current_precision + order
precision = precision + order
formatted_num = lang:formatNum(math.abs(value))
else
order = 0;
end
formatted_num = sign .. formatted_num
-- Pad with zeros, if needed
if current_precision < precision then
local padding
if current_precision <= 0 then
if precision > 0 then
local zero_sep = lang:formatNum(1.1)
formatted_num = formatted_num .. zero_sep:sub(2,2)
padding = precision
if padding > 20 then
padding = 20
end
formatted_num = formatted_num .. string.rep('0', padding)
end
else
padding = precision - current_precision
if padding > 20 then
padding = 20
end
formatted_num = formatted_num .. string.rep('0', padding)
end
end
-- Add exponential notation, if necessary.
if order ~= 0 then
-- Use proper unary minus sign rather than ASCII default
if order < 0 then
order = '−' .. lang:formatNum(math.abs(order))
else
order = lang:formatNum(order)
end
formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>'
end
return formatted_num
end
--[[
divide
Implements the division operator
Usage:
{{#invoke:Math | divide | x | y | round= | precision= }}
--]]
function wrap.divide(args)
local x = args[1]
local y = args[2]
local round = args.round
local precision = args.precision
if not yesno then
yesno = require('Module:Yesno')
end
return p._divide(x, y, yesno(round), precision)
end
function p._divide(x, y, round, precision)
if y == nil or y == "" then
return err("Empty divisor")
elseif not tonumber(y) then
if type(y) == 'string' and string.sub(y, 1, 1) == '<' then
return y
else
return err("Not a number: " .. y)
end
elseif x == nil or x == "" then
return err("Empty dividend")
elseif not tonumber(x) then
if type(x) == 'string' and string.sub(x, 1, 1) == '<' then
return x
else
return err("Not a number: " .. x)
end
else
local z = x / y
if round then
return p._round(z, 0)
elseif precision then
return p._round(z, precision)
else
return z
end
end
end
--[[
Helper function that interprets the input numerically. If the
input does not appear to be a number, attempts evaluating it as
a parser functions expression.
]]
function p._cleanNumber(number_string)
if type(number_string) == 'number' then
-- We were passed a number, so we don't need to do any processing.
return number_string, tostring(number_string)
elseif type(number_string) ~= 'string' or not number_string:find('%S') then
-- We were passed a non-string or a blank string, so exit.
return nil, nil;
end
-- Attempt basic conversion
local number = tonumber(number_string)
-- If failed, attempt to evaluate input as an expression
if number == nil then
local success, result = pcall(mw.ext.ParserFunctions.expr, number_string)
if success then
number = tonumber(result)
number_string = tostring(number)
else
number = nil
number_string = nil
end
else
number_string = number_string:match("^%s*(.-)%s*$") -- String is valid but may contain padding, clean it.
number_string = number_string:match("^%+(.*)$") or number_string -- Trim any leading + signs.
if number_string:find('^%-?0[xX]') then
-- Number is using 0xnnn notation to indicate base 16; use the number that Lua detected instead.
number_string = tostring(number)
end
end
return number, number_string
end
--[[
Wrapper function that does basic argument processing. This ensures that all functions from #invoke can use either the current
frame or the parent frame, and it also trims whitespace for all arguments and removes blank arguments.
]]
local mt = { __index = function(t, k)
return function(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return wrap[k](getArgs(frame)) -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed.
end
end }
return setmetatable(p, mt)
2bbe734d898299f65412963a3c1782e9fcc4d9ca
Template:Average
10
531
822
2025-07-13T15:05:57Z
Sharparam
284703
Initial page copied from [[wikipedia:Template:Average]]
wikitext
text/x-wiki
<includeonly>{{#if:{{{round|}}}|{{formatnum:{{round|{{#invoke:math|average}}|{{{round|}}}}}|R}}|{{#invoke:math|average}}}}</includeonly><noinclude>{{doc}}</noinclude>
b37093608b62a3faf722c64135fc79c4498e3d5b
Template:Tooltip/styles.css
10
530
820
2025-07-13T16:45:58Z
Sharparam
284703
Remove protection template
sanitized-css
text/css
.tooltip-dotted {
border-bottom: 1px dotted;
}
.tooltip-help {
cursor: help;
}
af2f58c266b5958cf73537f523615e9783db80ff
Template:Abbr/doc
10
533
826
2025-07-13T17:12:28Z
Sharparam
284703
wikitext
text/x-wiki
== Examples ==
=== [[Template:Tooltip]] ===
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> → {{Tooltip|text|tooltip title}}
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> → {{Tooltip|text "with" quotes|tooltip "with" quotes}}
7e8e0dc4e38c09167b11915c2ddced76bbfe4ae4
Template:Tooltip
10
529
818
2025-07-13T17:13:16Z
Sharparam
284703
Fix quote handling
wikitext
text/x-wiki
<templatestyles src="Template:Tooltip/styles.css" /><includeonly><span class="tooltip tooltip-dotted" title="{{#replace:{{{2}}}|"|"}}">{{{1}}}</span></includeonly><noinclude>
{{Documentation|Template:Abbr/doc}}
</noinclude>
02939f9a947fe3904add1355d50d42b05211f8b9
Template:DamageRange/doc
10
528
816
2025-07-13T17:53:55Z
Sharparam
284703
Add example with decimals
wikitext
text/x-wiki
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|10|20}}</syntaxhighlight> → {{DamageRange|10|20}}
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|1|2}}</syntaxhighlight> → {{DamageRange|1|2}}
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|69|75|type=sharp}}</syntaxhighlight> → {{DamageRange|69|75|type=sharp}}
a5a6c8376c27ec92e876a4bf84571a621dfedbac
Template:Navbox/Items
10
285
311
2025-07-13T19:43:24Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = Items
| group1 = Weapons
| list1 = {{Navbox/Weapons|child}}
}}
cedb0068e5810aa53fc1e276616ba855068c2e86
Template:Infobox/Ability/doc
10
460
684
2025-07-13T21:55:40Z
Sharparam
284703
wikitext
text/x-wiki
== Example ==
{{Infobox/Ability
|image=SuperTux star-1.png
|title=Shoot Star
|Description=Shoots a star.
|Cost=50
|Cooldown=12
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Ability
|image=SuperTux star-1.png
|title=Shoot Star
|Description=Shoots a star.
|Cost=50
|Cooldown=12
}}
</syntaxhighlight>
c5af8361e58c9662fafe1e9ae1dfbc09ff0dedf9
Module:Track listing/configuration
828
409
578
2025-07-15T00:30:16Z
Sharparam
284703
Initial page
Scribunto
text/plain
return {
show_warnings = false,
input_error_category = 'Track listings with input errors',
collapsed_parameter_category = 'Track listings that use the collapsed parameter ',
deprecated_parameter_category = 'Track listings with deprecated parameters',
track_field_names = {
number = true,
title = true,
note = true,
length = true,
lyrics = true,
music = true,
writer = true,
extra = true,
},
track_listing_field_names = {
width = true,
headline = true,
all_writing = true,
all_lyrics = true,
all_music = true,
extra_column = true,
total_length = true,
title_width = true,
writing_width = true,
lyrics_width = true,
music_width = true,
extra_width = true,
category = true,
},
deprecated_track_listing_field_names = {
writing_credits = true,
lyrics_credits = true,
music_credits = true,
},
leading_0_in_hours = "Invalid time '%s' (times in format 'h:mm:ss' cannot start with zero)",
leading_0_in_minutes = "Invalid time '%s' (times in format 'mm:ss' cannot start with zero)",
not_a_time = "Invalid time '%s' (times must be in a format of 'm:ss', 'mm:ss' or 'h:mm:ss')",
more_than_60_minutes = "Invalid track length '%s' (if hours are specified, the number of minutes must be less than 60)",
more_than_60_seconds = "Invalid track length '%s' (number of seconds must be less than 60)",
tracks_written = 'All tracks are written by %s',
lyrics_written_music_composed = 'All lyrics are written by $1; all music is composed by $2',
lyrics_written = 'All lyrics are written by %s',
music_composed = 'All music is composed by %s',
track_listing_error = '<strong class="error">Track listing error: %s</strong>',
deprecated_collapsed = 'Deprecated collapsed parameter in use.',
title = 'Title',
number = 'Number',
number_abbr = 'No.',
track_listing = 'Track listing',
writer = 'Writer(s)',
lyrics = 'Lyrics',
music = 'Music',
extra = '{{{extra_column}}}',
length = 'Length',
blank_cell = ' ',
track_title = '"%s"',
untitled = 'Untitled',
note = ' (%s)',
track_id = 'track%d',
number_terminated = '%d.',
total_length = 'Total length:'
}
5fcb26176f1458c5fdb9b1ba7af4cafc73cbd05a
Module:Track listing/styles.css
828
414
588
2025-07-15T00:30:51Z
Sharparam
284703
Initial page
sanitized-css
text/css
/* {{pp|small=y}} */
.tracklist {
border-spacing: 0;
}
/* set on all rows we can set the total length row to transparent */
.tracklist tr {
background-color: var(--background-color-base, #fff);
}
.tracklist tr:nth-child(2n-1) {
background-color: var(--background-color-neutral-subtle, #f8f9fa);
}
.tracklist caption {
text-align: left;
font-weight: bold;
}
.tracklist td,
.tracklist th[scope="row"] {
vertical-align: top;
}
.tracklist th[scope="col"] {
text-align: left;
background-color: var(--background-color-neutral, #eaecf0);
}
.tracklist th.tracklist-length-header,
.tracklist th.tracklist-number-header,
.tracklist th[scope="row"],
.tracklist-length,
.tracklist-total-length td {
padding-right: 10px;
text-align: right;
}
.tracklist th[scope="row"] {
font-weight: normal;
}
.tracklist-number-header {
width: 2em;
padding-left: 10px;
}
.tracklist-length-header {
width: 4em;
}
.tracklist tr.tracklist-total-length {
background-color: transparent;
}
.tracklist .tracklist-total-length th {
padding: 0;
font-weight: bold;
}
.tracklist-total-length th > span {
float: right;
padding: 0 10px;
background-color: var(--background-color-neutral, #eaecf0);
}
.tracklist-total-length td {
background-color: var(--background-color-neutral, #eaecf0);
font-weight: bold;
padding: 0 10px 0 0;
}
bc12ba45209a6a001e4bfaed9bda7f8aff5d3334
Module:Track listing
828
408
576
2025-07-15T00:31:18Z
Sharparam
284703
Initial page
Scribunto
text/plain
local yesno = require('Module:Yesno')
local checkType = require('libraryUtil').checkType
local cfg = mw.loadData('Module:Track listing/configuration')
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
-- Add a mixin to a class.
local function addMixin(class, mixin)
for k, v in pairs(mixin) do
if k ~= 'init' then
class[k] = v
end
end
end
--------------------------------------------------------------------------------
-- Validation mixin
--------------------------------------------------------------------------------
local Validation = {}
function Validation.init(self)
self.warnings = {}
self.categories = {}
end
function Validation:addWarning(msg, category)
table.insert(self.warnings, msg)
table.insert(self.categories, category)
end
function Validation:addCategory(category)
table.insert(self.categories, category)
end
function Validation:getWarnings()
return self.warnings
end
function Validation:getCategories()
return self.categories
end
-- Validate a track length. If a track length is invalid, a warning is added.
-- A type error is raised if the length is not of type string or nil.
function Validation:validateLength(length)
checkType('validateLength', 1, length, 'string', true)
if length == nil then
-- Do nothing if no length specified
return nil
end
local hours, minutes, seconds
-- Try to match times like "1:23:45".
hours, minutes, seconds = length:match('^(%d+):(%d%d):(%d%d)$')
if hours and hours:sub(1, 1) == '0' then
-- Disallow times like "0:12:34"
self:addWarning(
string.format(cfg.leading_0_in_hours, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
if not seconds then
-- The previous attempt didn't match. Try to match times like "1:23".
minutes, seconds = length:match('^(%d?%d):(%d%d)$')
if minutes and minutes:find('^0%d$') then
-- Special case to disallow lengths like "01:23". This check has to
-- be here so that lengths like "1:01:23" are still allowed.
self:addWarning(
string.format(cfg.leading_0_in_minutes, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
end
-- Add a warning and return if we did not find a match.
if not seconds then
self:addWarning(
string.format(cfg.not_a_time, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
-- Check that the minutes are less than 60 if we have an hours field.
if hours and tonumber(minutes) >= 60 then
self:addWarning(
string.format(cfg.more_than_60_minutes, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
-- Check that the seconds are less than 60
if tonumber(seconds) >= 60 then
self:addWarning(
string.format(cfg.more_than_60_seconds, mw.text.nowiki(length)),
cfg.input_error_category
)
end
return nil
end
--------------------------------------------------------------------------------
-- Track class
--------------------------------------------------------------------------------
local Track = {}
Track.__index = Track
addMixin(Track, Validation)
Track.fields = cfg.track_field_names
Track.cellMethods = {
number = 'makeNumberCell',
title = 'makeTitleCell',
writer = 'makeWriterCell',
lyrics = 'makeLyricsCell',
music = 'makeMusicCell',
extra = 'makeExtraCell',
length = 'makeLengthCell',
}
function Track.new(data)
local self = setmetatable({}, Track)
Validation.init(self)
for field in pairs(Track.fields) do
self[field] = data[field]
end
self.number = assert(tonumber(self.number))
self:validateLength(self.length)
return self
end
function Track:getLyricsCredit()
return self.lyrics
end
function Track:getMusicCredit()
return self.music
end
function Track:getWriterCredit()
return self.writer
end
function Track:getExtraField()
return self.extra
end
-- Note: called with single dot syntax
function Track.makeSimpleCell(wikitext)
return mw.html.create('td')
:wikitext(wikitext or cfg.blank_cell)
end
function Track:makeNumberCell()
return mw.html.create('th')
:attr('id', string.format(cfg.track_id, self.number))
:attr('scope', 'row')
:wikitext(string.format(cfg.number_terminated, self.number))
end
function Track:makeTitleCell()
local titleCell = mw.html.create('td')
titleCell:wikitext(
self.title and string.format(cfg.track_title, self.title) or cfg.untitled
)
if self.note then
titleCell:wikitext(string.format(cfg.note, self.note))
end
return titleCell
end
function Track:makeWriterCell()
return Track.makeSimpleCell(self.writer)
end
function Track:makeLyricsCell()
return Track.makeSimpleCell(self.lyrics)
end
function Track:makeMusicCell()
return Track.makeSimpleCell(self.music)
end
function Track:makeExtraCell()
return Track.makeSimpleCell(self.extra)
end
function Track:makeLengthCell()
return mw.html.create('td')
:addClass('tracklist-length')
:wikitext(self.length or cfg.blank_cell)
end
function Track:exportRow(columns)
local columns = columns or {}
local row = mw.html.create('tr')
for i, column in ipairs(columns) do
local method = Track.cellMethods[column]
if method then
row:node(self[method](self))
end
end
return row
end
--------------------------------------------------------------------------------
-- TrackListing class
--------------------------------------------------------------------------------
local TrackListing = {}
TrackListing.__index = TrackListing
addMixin(TrackListing, Validation)
TrackListing.fields = cfg.track_listing_field_names
TrackListing.deprecatedFields = cfg.deprecated_track_listing_field_names
function TrackListing.new(data)
local self = setmetatable({}, TrackListing)
Validation.init(self)
-- Check for deprecated arguments
for deprecatedField in pairs(TrackListing.deprecatedFields) do
if data[deprecatedField] then
self:addCategory(cfg.deprecated_parameter_category)
break
end
end
-- Validate total length
if data.total_length then
self:validateLength(data.total_length)
end
-- Add properties
for field in pairs(TrackListing.fields) do
self[field] = data[field]
end
-- Evaluate boolean properties
self.showCategories = yesno(self.category) ~= false
self.category = nil
-- Make track objects
self.tracks = {}
for i, trackData in ipairs(data.tracks or {}) do
table.insert(self.tracks, Track.new(trackData))
end
-- Find which of the optional columns we have.
-- We could just check every column for every track object, but that would
-- be no fun^H^H^H^H^H^H inefficient, so we use four different strategies
-- to try and check only as many columns and track objects as necessary.
do
local optionalColumns = {}
local columnMethods = {
lyrics = 'getLyricsCredit',
music = 'getMusicCredit',
writer = 'getWriterCredit',
extra = 'getExtraField',
}
local doneWriterCheck = false
for i, trackObj in ipairs(self.tracks) do
for column, method in pairs(columnMethods) do
if trackObj[method](trackObj) then
optionalColumns[column] = true
columnMethods[column] = nil
end
end
if not doneWriterCheck and optionalColumns.writer then
doneWriterCheck = true
optionalColumns.lyrics = nil
optionalColumns.music = nil
columnMethods.lyrics = nil
columnMethods.music = nil
end
if not next(columnMethods) then
break
end
end
self.optionalColumns = optionalColumns
end
return self
end
--------------------------------------------------------------------------------
-- Function for automatic punctuation for parameters:
-- all_writing, all_lyrics, all_music
-- Punctuation defaults to '.' unless ':' or '.' already exist
-- Automatic punctuation limited to parameter values not containing parser tags
-- i.e. <ref>Text</ref>, <nowiki></nowiki>, etc.
--------------------------------------------------------------------------------
function fullstop(a)
if a ~= mw.text.killMarkers(mw.getCurrentFrame():preprocess(a)) or
a:sub(-1,-1) == ":" or
a:sub(-1,-1) == "." then
return a
else
return a .. '.'
end
end
function TrackListing:makeIntro()
if self.all_writing then
return string.format(cfg.tracks_written, fullstop(self.all_writing))
elseif self.all_lyrics and self.all_music then
return mw.message.newRawMessage(
cfg.lyrics_written_music_composed,
self.all_lyrics,
fullstop(self.all_music)
):plain()
elseif self.all_lyrics then
return string.format(cfg.lyrics_written, fullstop(self.all_lyrics))
elseif self.all_music then
return string.format(cfg.music_composed, fullstop(self.all_music))
else
return nil
end
end
function TrackListing:renderTrackingCategories()
if not self.showCategories or mw.title.getCurrentTitle().namespace ~= 0 then
return ''
end
local ret = ''
local function addCategory(cat)
ret = ret .. string.format('[[Category:%s]]', cat)
end
for i, category in ipairs(self:getCategories()) do
addCategory(category)
end
for i, track in ipairs(self.tracks) do
for j, category in ipairs(track:getCategories()) do
addCategory(category)
end
end
return ret
end
function TrackListing:renderWarnings()
if not cfg.show_warnings then
return ''
end
local ret = {}
local function addWarning(msg)
table.insert(ret, string.format(cfg.track_listing_error, msg))
end
for i, warning in ipairs(self:getWarnings()) do
addWarning(warning)
end
for i, track in ipairs(self.tracks) do
for j, warning in ipairs(track:getWarnings()) do
addWarning(warning)
end
end
return table.concat(ret, '<br>')
end
function TrackListing:__tostring()
-- Root of the output
local root = mw.html.create('div')
:addClass('track-listing')
local intro = self:makeIntro()
if intro then
root:tag('p')
:wikitext(intro)
:done()
end
-- Start of track listing table
local tableRoot = mw.html.create('table')
tableRoot
:addClass('tracklist')
-- Overall table width
if self.width then
tableRoot
:css('width', self.width)
end
-- Header row
if self.headline then
tableRoot:tag('caption')
:wikitext(self.headline or cfg.track_listing)
end
-- Headers
local headerRow = tableRoot:tag('tr')
---- Track number
headerRow
:tag('th')
:addClass('tracklist-number-header')
:attr('scope', 'col')
:tag('abbr')
:attr('title', cfg.number)
:wikitext(cfg.number_abbr)
-- Find columns to output
local columns = {'number', 'title'}
if self.optionalColumns.writer then
columns[#columns + 1] = 'writer'
else
if self.optionalColumns.lyrics then
columns[#columns + 1] = 'lyrics'
end
if self.optionalColumns.music then
columns[#columns + 1] = 'music'
end
end
if self.optionalColumns.extra then
columns[#columns + 1] = 'extra'
end
columns[#columns + 1] = 'length'
-- Find column width
local nColumns = #columns
local nOptionalColumns = nColumns - 3
local titleColumnWidth = 100
if nColumns >= 5 then
titleColumnWidth = 40
elseif nColumns >= 4 then
titleColumnWidth = 60
end
local optionalColumnWidth = ((100 - titleColumnWidth) / nOptionalColumns) .. '%'
titleColumnWidth = titleColumnWidth .. '%'
---- Title column
headerRow:tag('th')
:attr('scope', 'col')
:css('width', self.title_width or titleColumnWidth)
:wikitext(cfg.title)
---- Optional headers: writer, lyrics, music, and extra
local function addOptionalHeader(field, headerText, width)
if self.optionalColumns[field] then
headerRow:tag('th')
:attr('scope', 'col')
:css('width', width or optionalColumnWidth)
:wikitext(headerText)
end
end
addOptionalHeader('writer', cfg.writer, self.writing_width)
addOptionalHeader('lyrics', cfg.lyrics, self.lyrics_width)
addOptionalHeader('music', cfg.music, self.music_width)
addOptionalHeader(
'extra',
self.extra_column or cfg.extra,
self.extra_width
)
---- Track length
headerRow:tag('th')
:addClass('tracklist-length-header')
:attr('scope', 'col')
:wikitext(cfg.length)
-- Tracks
for i, track in ipairs(self.tracks) do
tableRoot:node(track:exportRow(columns))
end
-- Total length
if self.total_length then
tableRoot
:tag('tr')
:addClass('tracklist-total-length')
:tag('th')
:attr('colspan', nColumns - 1)
:attr('scope', 'row')
:tag('span')
:wikitext(cfg.total_length)
:done()
:done()
:tag('td')
:wikitext(self.total_length)
end
root:node(tableRoot)
-- Warnings and tracking categories
root:wikitext(self:renderWarnings())
root:wikitext(self:renderTrackingCategories())
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Track listing/styles.css' }
} .. tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._main(args)
-- Process numerical args so that we can iterate through them.
local data, tracks = {}, {}
for k, v in pairs(args) do
if type(k) == 'string' then
local prefix, num = k:match('^(%D.-)(%d+)$')
if prefix and Track.fields[prefix] and (num == '0' or num:sub(1, 1) ~= '0') then
-- Allow numbers like 0, 1, 2 ..., but not 00, 01, 02...,
-- 000, 001, 002... etc.
num = tonumber(num)
tracks[num] = tracks[num] or {}
tracks[num][prefix] = v
else
data[k] = v
end
end
end
data.tracks = (function (t)
-- Compress sparse array
local ret = {}
for num, trackData in pairs(t) do
trackData.number = num
table.insert(ret, trackData)
end
table.sort(ret, function (t1, t2)
return t1.number < t2.number
end)
return ret
end)(tracks)
return tostring(TrackListing.new(data))
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Track listing'
})
return p._main(args)
end
return p
ba53211a0ca356f872c9a88324fd2a6a9e8ff30a
Template:Track listing
10
407
574
2025-07-15T00:32:29Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
{{#invoke:Track listing|main}}<noinclude>
{{documentation}}
</noinclude>
bef48fe7b046d2e4f4a2ed058a47e1ec3b30ed00
Bleak Faith: Forsaken Original Soundtrack
0
413
586
2025-07-15T01:49:10Z
Sharparam
284703
Fix input error
wikitext
text/x-wiki
The '''{{PAGENAME}}''' is a collection of songs that play throughout {{BFF}}. It is composed by [[Martel]] and [[Rade Vukčević]].
The soundtrack contains 44 tracks across all three discs with a combined total runtime of {{Duration|3:30:00|display=three and a half hours}}.
== Songs ==
<!--
// Generated using the following script on the Apple Music page:
(function() {
const discs = document.querySelectorAll('.section--disc');
console.debug(discs);
for (const disc of discs) {
const header = disc.querySelector('.disc-header h2.title').textContent;
const songs = disc.querySelectorAll('.songs-list .songs-list-row');
let total_length = 0;
const songData = Array.from(songs).map(s => {
const no = s.querySelector('.songs-list-row__song-index .songs-list-row__column-data').textContent;
const title = s.querySelector('.songs-list-row__song-name').textContent;
const length = s.querySelector('.songs-list-row__length').textContent;
const [mins, secs] = length.split(':').map(l => Number(l));
total_length += mins * 60 + secs;
return `| title${no} = ${title}\n| length${no} = ${length}`;
});
const tracks = songData.join("\n\n");
const tot_hors = Math.floor(total_length / 60 / 60);
const tot_mins = Math.floor((total_length - tot_hors * 60 * 60) / 60);
const tot_secs = total_length % 60;
const entry = `{{Track listing\n| headline = ${header}\n| total_length = ${tot_hors}:${tot_mins}:${tot_secs}\n\n${tracks}\n}}`;
console.info(entry);
}
})();
-->
{{Track listing
| headline = Disc 1
| total_length = 1:49:26
| title1 = Premonitions
| length1 = 3:19
| title2 = The Monastery
| length2 = 8:22
| title3 = Oathsworn
| length3 = 4:25
| title4 = The Imperial Siege
| length4 = 3:25
| title5 = Concrete Sea
| length5 = 4:32
| title6 = Sky Towers
| length6 = 9:23
| title7 = Downpour
| length7 = 9:12
| title8 = The Serdars
| length8 = 8:59
| title9 = The Inquisition
| length9 = 5:31
| title10 = The Valley
| length10 = 3:34
| title11 = The Trisagion
| length11 = 2:12
| title12 = Cloaca Maxima
| length12 = 3:15
| title13 = The Call of the Void
| length13 = 7:45
| title14 = The Machinarium
| length14 = 11:36
| title15 = A Bitter Evening
| length15 = 3:58
| title16 = Dreamlight
| length16 = 7:32
| title17 = The Instinct
| length17 = 2:27
| title18 = Recycled
| length18 = 3:00
| title19 = Domus Aurea
| length19 = 6:59
}}
{{Track listing
| headline = Disc 2
| total_length = 48:46
| title1 = Aurelian
| length1 = 5:31
| title2 = Vangelian
| length2 = 4:13
| title3 = Machinebirth
| length3 = 4:52
| title4 = Melanion
| length4 = 6:15
| title5 = Oberon
| length5 = 5:10
| title6 = Serapian
| length6 = 5:35
| title7 = Limitless
| length7 = 4:54
| title8 = The Fade
| length8 = 2:42
| title9 = Wandering
| length9 = 4:50
| title10 = Machinedream
| length10 = 4:44
}}
{{Track listing
| headline = Disc 3
| total_length = 52:11
| title1 = The Mountain Wreath
| length1 = 2:21
| title2 = Destiny
| length2 = 8:45
| title3 = Saberstorm
| length3 = 2:59
| title4 = Yaroslav's Rebellion
| length4 = 5:09
| title5 = The Nightmare (Menu Theme)
| length5 = 2:27
| title6 = Konrad the Traitor
| length6 = 2:49
| title7 = Yuliya
| length7 = 2:53
| title8 = Nemesis
| length8 = 3:04
| title9 = Belisarius
| length9 = 3:18
| title10 = Aberrant Knight
| length10 = 3:02
| title11 = Nurgei
| length11 = 3:15
| title12 = Wormlord
| length12 = 3:53
| title13 = Wyvern's Lament
| length13 = 3:52
| title14 = Doppelganger
| length14 = 2:22
| title15 = Baryak
| length15 = 2:02
}}
== External links ==
* [https://open.spotify.com/album/1cORrZ4GAVDbMvbEbvEL4q Spotify]
* [https://music.apple.com/ua/album/bleak-faith-original-soundtrack/1678680781 Apple Music]
* [https://martelvladimiroff.bandcamp.com/album/bleak-faith-forsaken Bandcamp]
d8060222851027ad9a4b2724ead306d2de16f292
Blade Dash
0
575
911
2025-07-15T20:18:43Z
Sharparam
284703
Fix image
wikitext
text/x-wiki
{{Infobox/Ability
| image = OrientalDash.png
| title = Blade Dash
| Cost = 45
| Cooldown = 15
| Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone.
}}
'''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
d8d63bcf9e2ab9e7610a637cbfae9e493d98a50d
Whirlwind Strike
0
576
913
2025-07-15T20:20:57Z
Sharparam
284703
Created page with "{{Infobox/Ability | image = OrientalSpin.png | title = Whirlwind Strike | Cost = 75 | Cooldown = 25 | Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone. }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}"
wikitext
text/x-wiki
{{Infobox/Ability
| image = OrientalSpin.png
| title = Whirlwind Strike
| Cost = 75
| Cooldown = 25
| Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone.
}}
'''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
e6c1e11c6f18f8785af475d924c7d62d672fe3b3
Dual Wields
0
474
712
2025-07-15T20:31:49Z
Sharparam
284703
Sharparam moved page [[Dual Wields]] to [[Dual Wield]]: Misspelled title: Called "Dual Wield" in-game
wikitext
text/x-wiki
#REDIRECT [[Dual Wield]]
f2856295451ab1cd2a686e19d6b0fbaa265f1d98
Template:Navbox/Equipment
10
437
634
2025-07-15T21:22:10Z
Sharparam
284703
Add more equipment
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Equipment
| title = [[Equipment]]
| group1 = [[Weapons]]
| list1 = {{Navbox/Weapons|child}}
| group2 = [[Armor]]
| list2 = {{Navbox/Armor|child}}
| group3 = [[Amulets]]
| list3 = {{Navbox/Amulets|child}}
| group4 = [[Rings]]
| list4 = {{Navbox/Rings|child}}
| group5 = [[Capes]]
| list5 = {{Navbox/Capes|child}}
}}
4e9b09f139c8eefe809a3e0918f7584ff16eb363
Template:Navbox/Items
10
285
312
311
2025-07-15T21:44:42Z
Sharparam
284703
Add some missing categories
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = Items
| group1 = [[Anomalous crystals]]
| list1 = {{Navbox/Anomalous crystals|child}}
| group2 = [[Consumables]]
| list2 = {{Navbox/Consumables|child}}
| group3 = [[Equipment]]
| list3 = {{Navbox/Equipment|child}}
}}
a411861b5bf4a6d8ba1b5a05f0287d3802aecd95
313
312
2025-07-15T22:49:03Z
Sharparam
284703
Add link to items page
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = [[Anomalous crystals]]
| list1 = {{Navbox/Anomalous crystals|child}}
| group2 = [[Consumables]]
| list2 = {{Navbox/Consumables|child}}
| group3 = [[Equipment]]
| list3 = {{Navbox/Equipment|child}}
}}
ca3cdc023f216bb4caa76a9db8f95fb5602e929f
314
313
2025-07-16T02:49:01Z
Sharparam
284703
Add crafting items section
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = [[Anomalous crystals]]
| list1 = {{Navbox/Anomalous crystals|child}}
| group2 = [[Consumables]]
| list2 = {{Navbox/Consumables|child}}
| group3 = [[Equipment]]
| list3 = {{Navbox/Equipment|child}}
| group4 = [[Crafting]]
| list4 = {{Navbox/Crafting items|child}}
}}
bf2478c6b03d574c41156fec247613edf994dde1
315
314
2025-07-16T02:56:59Z
Sharparam
284703
Fix materials group
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = [[Anomalous crystals]]
| list1 = {{Navbox/Anomalous crystals|child}}
| group2 = [[Consumables]]
| list2 = {{Navbox/Consumables|child}}
| group3 = [[Equipment]]
| list3 = {{Navbox/Equipment|child}}
| group4 = [[Materials]]
| list4 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
57fc6de198843d9c4942092a4ee85caca6ff4037
316
315
2025-07-16T04:05:59Z
Sharparam
284703
Add some essential items
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = Essential
| list1 =
* [[Mobius Blade]]
* [[Old Key]]
* [[Scanner]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
3a6eb5fa278020754af0321a425464a6b8536c19
Equipment
0
467
698
2025-07-15T22:48:30Z
Sharparam
284703
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] that the player can wear.
{{Navbox/Equipment}}
c2de744eb63e9dbba3e8fff73404a00624386c66
Items
0
416
594
2025-07-15T22:49:50Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
'''{{PAGENAME}}''' come in various forms, from [[equipment]] that can be worn by the player, to [[consumables]] that can be used for various effects.
{{Navbox/Items}}
f9e1d38d5ce67ef854c74e6280c1d93d64ed929f
Citadel Warrior Chest
0
481
726
2025-07-15T23:06:59Z
Sharparam
284703
Add set name
wikitext
text/x-wiki
{{Infobox/Armor
| image = Citadel Warrior Chest.png
| title = {{PAGENAME}}
| Type = Chestguard
| Weight = Medium
| Set = Citadel Warrior
| Mk2_Sharp = 984
| Mk2_Blunt = 1296
| Mk2_Technomancy = 719
}}
{{Navbox/Armor}}
2d3a3133daf3387abf5d098ec92e1514330b81d4
Category:Chestguards
14
471
706
2025-07-15T23:12:42Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
[[Category:Armor]]
8dbf198b5dcaa87a18100850cc78880444b773ad
Template:Infobox/Armor set/doc
10
456
676
2025-07-15T23:32:11Z
Sharparam
284703
Fix wrong template used in example
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for an armor set",
"params": {
"image": {
"label": "Armor set image",
"description": "Name of the file used as the image for the armor set, should be at least 300 pixels wide.",
"required": true,
"example": "Cool armor set.png",
"type": "wiki-file-name"
},
"Weight": {
"label": "Armor set weight",
"description": "The weight class of the armor set.",
"required": true,
"example": "Light",
"type": "string"
},
"Helmet": {
"label": "Helmet piece",
"description": "The armor used for the helmet slot.",
"required": true,
"example": "Cool Helmet",
"type": "wiki-page-name"
},
"Pauldrons": {
"label": "Pauldrons piece",
"description": "The armor used for the pauldrons slot.",
"required": true,
"example": "Cool Pauldrons",
"type": "wiki-page-name"
},
"Chestguard": {
"label": "Chestguard piece",
"description": "The armor used for the chestguard slot.",
"required": true,
"example": "Cool Chestguard",
"type": "wiki-page-name"
},
"Legguard": {
"label": "Legguard piece",
"description": "The armor used for the legguard slot.",
"required": true,
"example": "Cool Legguard",
"type": "wiki-page-name"
},
"Gauntlets": {
"label": "Gauntlets piece",
"description": "The armor used for the gauntlets slot.",
"required": true,
"example": "Cool Gauntlets",
"type": "wiki-page-name"
},
"Mk1_Sharp": {
"label": "Mk 1 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Blunt": {
"label": "Mk 1 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Technomancy": {
"label": "Mk 1 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Sharp": {
"label": "Mk 2 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Blunt": {
"label": "Mk 2 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Technomancy": {
"label": "Mk 2 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Sharp": {
"label": "Mk 3 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Blunt": {
"label": "Mk 3 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Technomancy": {
"label": "Mk 3 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Sharp": {
"label": "Mk 4 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Blunt": {
"label": "Mk 4 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Technomancy": {
"label": "Mk 4 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Sharp": {
"label": "Mk 5 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Blunt": {
"label": "Mk 5 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Technomancy": {
"label": "Mk 5 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Armor set
| image = Awesome set.png
| title = Awesome set
| Weight = Heavy
| Helmet = Awesome Helmet
| Pauldrons = Awesome Pauldrons
| Chestguard = Awesome Chestguard
| Legguard = Awesome Legguard
| Gauntlets = Awesome Gauntlets
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Armor set
| image = Awesome set.png
| title = Awesome set
| Weight = Heavy
| Helmet = Awesome Helmet
| Pauldrons = Awesome Pauldrons
| Chestguard = Awesome Chestguard
| Legguard = Awesome Legguard
| Gauntlets = Awesome Gauntlets
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
</syntaxhighlight>
0b9b19ca76ed3cf82ad6c4644f7d39ea57f56907
Citadel Warrior
0
484
732
2025-07-15T23:34:49Z
Sharparam
284703
Remove redundant category entry
wikitext
text/x-wiki
{{Infobox/Armor set
| image = Citadel Warrior.png
| title = {{PAGENAME}}
| Weight = Medium
| Helmet = Citadel Warrior Helmet
| Pauldrons = Citadel Warrior Shoulders
| Chestguard = Citadel Warrior Chest
| Legguard = Citadel Warrior Legguards
| Gauntlets = Citadel Warrior Gauntlets
}}
'''{{PAGENAME}}''' is an [[armor set]] in {{BFF}}.
== Pieces ==
* [[Citadel Warrior Helmet]]
* [[Citadel Warrior Shoulders]]
* [[Citadel Warrior Chest]]
* [[Citadel Warrior Legguards]]
* [[Citadel Warrior Gauntlets]]
== See also ==
* [[Citadel Defender]] – Heavy variant with higher defense ratings.
{{Navbox/Armor}}
e1f48b76a2706b1879b8a99de8adffee44fc8785
Dual wield
0
473
710
2025-07-16T01:35:42Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
#REDIRECT [[Dual Wield]]
f2856295451ab1cd2a686e19d6b0fbaa265f1d98
Perk
0
746
1152
2025-07-16T01:36:24Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
#REDIRECT [[Perks]]
22eac196aff02ba31a4bced80e80fcfdc8051202
Perks
0
747
1154
2025-07-16T01:37:30Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
'''{{PAGENAME}}''' are powerful passive upgrades in {{BFF}}. The player can have up to four active perks at one time.
{{Navbox/Perks}}
26af41c73ec1c4e20599336d60d88a8378c8c6ab
Dual Wield Mastery
0
743
1146
2025-07-16T01:41:58Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
[[File:Dual_Wield_Mastery.png|thumb]]
'''{{PAGENAME}}''' is a [[perk]] in {{BFF}}. It improves proficiency with [[dual wield]] [[weapons]].
== Effect ==
Offhand weapons now deal 60% of their damage instead of 35%.
== Upgrades ==
* Critical Chance increases by 1% with each combo point while dual wielding.
* While dual wielding, you do not consume any stamina for melee attacks if at 15 or above combo points.
{{Navbox/Perks}}
[[Category:Perks]]
78e20c9ebd95bf46994bc694995631a11d79d8b6
Dual Wield
0
472
708
2025-07-16T02:01:29Z
Sharparam
284703
Add link to weapons page
wikitext
text/x-wiki
{{Stub}}
'''{{PAGENAME}}''' is a [[Weapons|weapon]] type in {{BFF}}.
== List of Dual Wields ==
{{#cargo_query:table=Weapons
|fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5)
|where=type='Dual Wield'
|format=table
}}
[[Category:Dual Wields]]
6c2224d2e50f2da2b16a52ca04227ca57d27bbc8
Template:Navbox/Consumables
10
286
324
2025-07-16T02:08:19Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Greater Restorative Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Restorative Fluid]]
}}
068b364b9f72ace337b6eda9b1fad98cea7c7265
325
324
2025-07-16T02:10:01Z
Sharparam
284703
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Greater Restorative Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Restorative Fluid]]
}}
6b145de4128c95947cf01cfb2105da562d651fcc
326
325
2025-07-16T03:01:52Z
Sharparam
284703
Add missing consumables
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| group1 = Fluids
| list1 =
* [[Greater Ionization Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Restorative Fluid]]
| group2 = Concoctions
| list2 =
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Fluxshield Concoction]]
* [[Jaeger's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Dreadguard's Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Technomancer's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Forsaken Concoction]]
* [[Concoction: Health Regen]]
* [[Concoction: Flux Regen]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Agility]]
* [[Concoction: Constitution]]
* [[Concoction: Intelligence]]
* [[Concoction: All Attributes]]
}}
ce72b9ce75fe8de2da765ca2df5313636d5374d5
327
326
2025-07-16T03:03:30Z
Sharparam
284703
Add missing consumables
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Basilisk Hack]]
| group2 = Fluids
| list2 =
* [[Greater Ionization Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Restorative Fluid]]
| group3 = Concoctions
| list3 =
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Fluxshield Concoction]]
* [[Jaeger's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Dreadguard's Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Technomancer's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Forsaken Concoction]]
* [[Concoction: Health Regen]]
* [[Concoction: Flux Regen]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Agility]]
* [[Concoction: Constitution]]
* [[Concoction: Intelligence]]
* [[Concoction: All Attributes]]
* [[Experience Concoction]]
* [[Mystery Concoction]]
}}
f6d2786b1121af8c872d30d7b61e7d07d561e8cf
328
327
2025-07-16T03:03:55Z
Sharparam
284703
Add template category
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Basilisk Hack]]
| group2 = Fluids
| list2 =
* [[Greater Ionization Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Restorative Fluid]]
| group3 = Concoctions
| list3 =
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Fluxshield Concoction]]
* [[Jaeger's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Dreadguard's Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Technomancer's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Forsaken Concoction]]
* [[Concoction: Health Regen]]
* [[Concoction: Flux Regen]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Agility]]
* [[Concoction: Constitution]]
* [[Concoction: Intelligence]]
* [[Concoction: All Attributes]]
* [[Experience Concoction]]
* [[Mystery Concoction]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
29b982f060212718a4387efef495e9ad1b455ba9
329
328
2025-07-16T03:07:10Z
Sharparam
284703
Add more missing consumables
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
| group2 = Fluids
| list2 =
* [[Greater Ionization Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Regenerative Fluid]]
* [[Restorative Fluid]]
| group3 = Concoctions
| list3 =
* [[Diver's Lungs Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Fluxshield Concoction]]
* [[Jaeger's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Dreadguard's Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Technomancer's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Forsaken Concoction]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Health Regen]]
* [[Concoction: Flux Regen]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Agility]]
* [[Concoction: Constitution]]
* [[Concoction: Intelligence]]
* [[Concoction: All Attributes]]
* [[Concoction: Zealot's Tears]]
* [[Experience Concoction]]
* [[Mystery Concoction]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
e9736a1ea6833ecda5952ac6a85bce948c9cf19a
Consumables
0
428
618
2025-07-16T02:10:59Z
Sharparam
284703
Initial page
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[Items|item]] that the player can use to heal themselves, restore resources, or gain various buffs.
{{Navbox/Consumables}}
d9a89e867297dd4ee6e2667cdb541b327cdc74e4
NPC
0
367
496
2025-07-16T02:34:31Z
Sharparam
284703
Redirected page to [[NPCs]]
wikitext
text/x-wiki
#REDIRECT [[NPCs]]
0c78678b45694b9a9f67883eca2a30eaa6ea5607
Materials
0
431
624
2025-07-16T02:55:24Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items. {{Navbox/Materials}}"
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items.
{{Navbox/Materials}}
16c02de5636f61c53bd16cf7e1d04625cb9646e2
Template:Infobox/Cape/doc
10
463
690
2025-07-16T03:13:35Z
Sharparam
284703
Created page with "== Examples == {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} <syntaxhighlight lang="wikitext"> {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} </syntaxhighlight>"
wikitext
text/x-wiki
== Examples ==
{{Infobox/Cape
| image = Cool cape.png
| title = Cool cape
| Effect1 = +50 coolness
| Effect2 = -1s cooldowns
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Cape
| image = Cool cape.png
| title = Cool cape
| Effect1 = +50 coolness
| Effect2 = -1s cooldowns
}}
</syntaxhighlight>
90d89e60cc634d47fd7681de76278937e16255fc
Template:Navbox/Capes
10
287
331
2025-07-16T03:15:32Z
Sharparam
284703
Created page with "{{Navbox | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude>"
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Capes
| title = [[Capes]]
| list1 =
* [[Agile Cape]]
* [[Fur Cape]]
* [[Ronin Scarf]]
* [[Sentinel Overcoat]]
* [[Spectre Scarf]]
* [[Tattered Cape]]
* [[Traveler Cape]]
* [[Wanderer Cape]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
0d84fc50e23693f75a69a43dd191d9913b09c6bd
332
331
2025-07-16T03:15:49Z
Sharparam
284703
Add missing param passthrough
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Capes
| title = [[Capes]]
| list1 =
* [[Agile Cape]]
* [[Fur Cape]]
* [[Ronin Scarf]]
* [[Sentinel Overcoat]]
* [[Spectre Scarf]]
* [[Tattered Cape]]
* [[Traveler Cape]]
* [[Wanderer Cape]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
b29e7b93ce7ebeee0420b0126beba25917db3c9f
Wanderer Cape
0
512
787
2025-07-16T03:18:07Z
Sharparam
284703
Created page with "{{Infobox/Cape | title = {{PAGENAME}} | image = Wanderer Cape.png | Effect1 = -0.5 second delay before stamina starts to regenerate. }} '''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn in {{BFF}}. {{Navbox/Capes}}"
wikitext
text/x-wiki
{{Infobox/Cape
| title = {{PAGENAME}}
| image = Wanderer Cape.png
| Effect1 = -0.5 second delay before stamina starts to regenerate.
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn in {{BFF}}.
{{Navbox/Capes}}
1f5137f1dafe59cd4ffe5c3b254751901918d15e
Capes
0
443
651
2025-07-16T03:19:24Z
Sharparam
284703
Fix grammar
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] the player can wear to gain various bonus stats or effects.
{{Navbox/Capes}}
e68b383acdf3f302a6ce54944a3b34f545506c55
Template:Infobox/Ability
10
459
682
2025-07-16T03:20:32Z
Sharparam
284703
Add template category
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=ability
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info,Description
|Basic Info=Cost,Cooldown
|Cost_label=Flux cost
|Cooldown={{#if:{{{Cooldown|}}}|{{{Cooldown}}} seconds}}
|Description_nolabel=yes
|Description_isdata=yes
}}{{#if:{{NAMESPACE}}||[[Category:Abilities]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
c1ad1894018a724cf6235cea17b860aa85344fed
Template:Infobox/Armor set
10
455
674
2025-07-16T03:21:07Z
Sharparam
284703
Add template category
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor-set
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Pieces, Stats
|Basic Info=Weight
|Pieces=Helmet,Pauldrons,Chestguard,Legguard,Gauntlets
|Helmet={{#if:{{{Helmet|}}}|[[{{{Helmet}}}]]}}
|Pauldrons={{#if:{{{Pauldrons|}}}|[[{{{Pauldrons}}}]]}}
|Chestguard={{#if:{{{Chestguard|}}}|[[{{{Chestguard}}}]]}}
|Legguard={{#if:{{{Legguard|}}}|[[{{{Legguard}}}]]}}
|Gauntlets={{#if:{{{Gauntlets|}}}|[[{{{Gauntlets}}}]]}}
|tabs=
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||[[Category:Armor sets]]}}</includeonly><noinclude>
{{Documentation}}[[Category:Infobox templates]]</noinclude>
d0b44e9f72dec247f40dfa79c3541b37ed9c3937
Template:Infobox/Cape
10
462
688
2025-07-16T03:21:20Z
Sharparam
284703
Add template category
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=cape
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Effects
|Effects=Effect1,Effect2,Effect3
|Effect1_nolabel=yes
|Effect2_nolabel=yes
|Effect3_nolabel=yes
}}{{#if:{{NAMESPACE}}||[[Category:Capes]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
1957e3d416bf10a10bad93e51f649ad4f1768848
Template:Navbox/Anomalous crystals
10
288
337
2025-07-16T03:24:08Z
Sharparam
284703
Created page with "{{Navbox | template = Navbox/Anomalous crystals | title = [[Anomalous crystals]] | list1= * [[Lesser Anomalous Crystal]] * [[Anomalous Crystal]] * [[Greater Anomalous Crystal]] }}<noinclude>[[Category:Navigation templates]]</noinclude>"
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Anomalous crystals
| title = [[Anomalous crystals]]
| list1=
* [[Lesser Anomalous Crystal]]
* [[Anomalous Crystal]]
* [[Greater Anomalous Crystal]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
6702c38b572ae6caefc04acd4b08e219bf9a5d68
338
337
2025-07-16T03:24:22Z
Sharparam
284703
Add missing param passthrough
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Anomalous crystals
| title = [[Anomalous crystals]]
| list1=
* [[Lesser Anomalous Crystal]]
* [[Anomalous Crystal]]
* [[Greater Anomalous Crystal]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
ebedb2789af69363588ddf5553b8868dcbf7005d
Lore
0
371
504
2025-07-16T03:47:22Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' can be found as text on [[items]], various [[data logs]] and [[documents]], and [[NPC]] dialogue in {{BFF}}. == Data logs == {{Main|Data logs}} == Documents == {{Main|Documents}} {{Navbox/Lore}} [[Category:Lore]]"
wikitext
text/x-wiki
'''{{PAGENAME}}''' can be found as text on [[items]], various [[data logs]] and [[documents]], and [[NPC]] dialogue in {{BFF}}.
== Data logs ==
{{Main|Data logs}}
== Documents ==
{{Main|Documents}}
{{Navbox/Lore}}
[[Category:Lore]]
3efab73936854b174032435bb0c6f8b77736139d
Template:Navbox/Lore
10
289
340
2025-07-16T03:50:26Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Lore | title = [[Lore]] | group1 = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * The..."
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Lore
| title = [[Lore]]
| group1 = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
| group2 = [[Documents]]
| list2 =
}}<noinclude>[[Category:Navigation templates]]</noinclude>
1db288cb2f5c6f51241b5be78a1ec242687b398b
341
340
2025-07-16T03:51:13Z
Sharparam
284703
Add documents
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Lore
| title = [[Lore]]
| group1 = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
| group2 = [[Documents]]
| list2 =
* [[Konrad's War Log]]
* [[Helena's Diary Fragment]]
* [[Hellicar's Maxims]]
* [[Guiscard's Manifest]]
* [[Untitled Log]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
753896515d0e262801ebc6f6c76b02000f959d56
342
341
2025-07-16T03:51:45Z
Sharparam
284703
Move data logs to own navbox
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Lore
| title = [[Lore]]
| group1 = [[Data logs]]
| list1 = {{Navbox/Data logs|child}}
| group2 = [[Documents]]
| list2 =
* [[Konrad's War Log]]
* [[Helena's Diary Fragment]]
* [[Hellicar's Maxims]]
* [[Guiscard's Manifest]]
* [[Untitled Log]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
35a5da538ee72dc5a83dbbb27fd8f38e54f93c7c
343
342
2025-07-16T03:53:21Z
Sharparam
284703
Move documents to own navbox
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Lore
| title = [[Lore]]
| group1 = [[Data logs]]
| list1 = {{Navbox/Data logs|child}}
| group2 = [[Documents]]
| list2 = {{Navbox/Documents|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
cc386cacfb50aa464ec9e6065463991e75c6ef65
Template:Navbox/Data logs
10
290
345
2025-07-16T03:52:43Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<..."
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
a835cd772b8a5f1437f310d8490931607791fc25
Template:Navbox/Documents
10
291
368
2025-07-16T03:53:56Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Documents | title = [[Documents]] | list1 = * [[Konrad's War Log]] * [[Helena's Diary Fragment]] * [[Hellicar's Maxims]] * [[Guiscard's Manifest]] * [[Untitled Log]] }}<noinclude>[[Category:Navigation templates]]</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Documents
| title = [[Documents]]
| list1 =
* [[Konrad's War Log]]
* [[Helena's Diary Fragment]]
* [[Hellicar's Maxims]]
* [[Guiscard's Manifest]]
* [[Untitled Log]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
4859742a1634980b598ee96ab98cf1b44828e159
Monastery Impression
0
370
502
2025-07-16T03:56:10Z
Sharparam
284703
Fix casing
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found at [[Monastery|the Monastery]] in {{BFF}}.
== Overview ==
{{Quote
| Venturing into the anomalous zone at the edge of this crumbling colony, I was enveloped by a world devoid of sense, dominated by the cold, relentless sprawl of concrete and rebar. Rusted metal carcasses of buildings stood as grim monuments to a forgotten era, their skeletal frames interwoven with the vestiges of ancient technology and tangled cables that snaked across the ground like decaying veins. The omnipresent drone of [[Omnistructure|the structure]] reverberated through the air, a constant reminder of its oppressive presence – here, louder than anywhere before. As I picked my way through the debris, I could sense the weight of the past pressing in, the technological remnants whispering secrets of a world that once thrived but now lay silent and corroded.
}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
5d6199c92d0ebf1baedb5890d3776274eadefaef
Documents
0
373
508
2025-07-16T03:58:18Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}. == Overview == Documents are typically found as drops from [[enemies]]. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]]"
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}.
== Overview ==
Documents are typically found as drops from [[enemies]].
{{Navbox/Documents}}
[[Category:Lore]]
[[Category:Documents]]
3305c6ccf580021e8513f612ab7919e6863f1f47
Data logs
0
372
506
2025-07-16T03:59:46Z
Sharparam
284703
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}.
== Overview ==
Data logs are uncovered by interacting at certain specific points in the game world. To locate these points, use of the [[Scanner]] is recommended.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
0b268f9f4958f98eba1f00ec6c06edbba3c10826
Template:Infobox/Item/doc
10
464
692
2025-07-16T04:02:44Z
Sharparam
284703
Created page with "== Examples == {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} <syntaxhighlight lang="wikitext"> {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} </syntaxhighlight>"
wikitext
text/x-wiki
== Examples ==
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| Description = This item will do something fancy when you use it!
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| Description = This item will do something fancy when you use it!
}}
</syntaxhighlight>
9a956a5275f4ed54d4ffea9d646a5229cadc93a6
Template:Reflist/styles.css
10
616
969
2025-07-16T05:41:40Z
Sharparam
284703
Copied from [[mediawiki:Template:Reflist/styles.css]]
sanitized-css
text/css
.reflist {
list-style-type: decimal;
margin-bottom: 0.5em;
}
@media screen {
.reflist {
font-size: 0.9em; /* Make default font smaller only on screens. */
}
}
.reflist .references {
font-size: 1em; /* Reset font size when nested in reflist. */
list-style-type: inherit; /* Enable custom list-style types. */
margin-bottom: 0; /* Avoid double margin when nested in reflist. */
}
.reflist-columns {
margin-top: 0.3em; /* Reset top margin for column-embedded lists. */
}
.reflist-columns ol {
margin-top: 0;
}
.reflist-columns li {
break-inside: avoid-column; /* Avoid elements breaking between columns. */
}
.reflist-upper-alpha {
list-style-type: upper-alpha;
}
.reflist-upper-roman {
list-style-type: upper-roman;
}
.reflist-lower-alpha {
list-style-type: lower-alpha;
}
.reflist-lower-greek {
list-style-type: lower-greek;
}
.reflist-lower-roman {
list-style-type: lower-roman;
}
e2f766e5d4d3ee66aca32f6714fef1bc97648e0a
Template:Notelist
10
612
961
2025-07-16T05:42:49Z
Sharparam
284703
Copied from [[mediawiki:Template:Notelist]]
wikitext
text/x-wiki
{{safesubst<noinclude />:Reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst<noinclude />:#switch:{{{group|}}}
| note
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group|}}}
| #default = lower-alpha
}}}}{{safesubst<noinclude />:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | notes | refs }}<noinclude>
{{Documentation}}</noinclude>
94f17b894235ff18c73072096f5940cdbcc5b719
Template:Note
10
615
967
2025-07-16T05:49:15Z
Sharparam
284703
Copied from [[mediawiki:Template:Efn]]
wikitext
text/x-wiki
<includeonly>{{#if:{{{name|}}}
|{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|name={{{name|}}}|group={{#switch: {{{group|}}}
| note
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group|}}}
| #default = lower-alpha
}}
}}
|{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|group={{#switch: {{{group|}}}
| note
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group|}}}
| #default = lower-alpha
}}
}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
6ed4e5c148014b92a23bd51d16f3180881bb876c
Template:Ref
10
617
971
2025-07-16T05:52:58Z
Sharparam
284703
Copied from [[wikipedia:Template:Refn]]
wikitext
text/x-wiki
<includeonly>{{#if:{{{follow|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}|follow={{{follow|}}}}}|{{#if:{{{name|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|name={{{name|}}}|group={{{group|}}}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
9fd4ba12eab57eadfed1197d60df81947547d276
MediaWiki:Cite link label group-lower-alpha
8
618
973
2025-07-16T05:56:10Z
Sharparam
284703
Copied from [[wikipedia:MediaWiki:Cite link label group-lower-alpha]]
wikitext
text/x-wiki
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz aaa aab aac aad aae aaf aag aah aai aaj aak aal aam aan aao aap aaq aar aas aat aau aav aaw aax aay aaz aba abb abc abd abe abf abg abh abi abj abk abl abm abn abo abp abq abr abs abt abu abv abw abx aby abz aca acb acc acd ace acf acg ach aci acj ack acl acm acn aco acp acq acr acs act acu acv acw acx acy acz ada adb adc add ade adf adg adh adi adj adk adl adm adn ado adp adq adr ads adt adu adv adw adx ady adz aea aeb aec aed aee aef aeg aeh aei aej aek ael aem aen aeo aep aeq aer aes aet aeu aev aew aex aey aez afa afb afc afd afe aff afg afh afi afj afk afl afm afn afo afp afq afr afs aft afu afv afw afx afy afz aga agb agc agd age agf agg agh agi agj agk agl agm agn ago agp agq agr ags agt agu agv agw agx agy agz aha ahb ahc ahd ahe ahf ahg ahh ahi ahj ahk ahl ahm ahn aho ahp ahq ahr ahs aht ahu ahv ahw ahx ahy ahz aia aib aic aid aie aif aig aih aii aij aik ail aim ain aio aip aiq air ais ait aiu aiv aiw aix aiy aiz aja ajb ajc ajd aje ajf ajg ajh aji ajj ajk ajl ajm ajn ajo ajp ajq ajr ajs ajt aju ajv ajw ajx ajy ajz aka akb akc akd ake akf akg akh aki akj akk akl akm akn ako akp akq akr aks akt aku akv akw akx aky akz ala alb alc ald ale alf alg alh ali alj alk all alm aln alo alp alq alr als alt alu alv alw alx aly alz ama amb amc amd ame amf amg amh ami amj amk aml amm amn amo amp amq amr ams amt amu amv amw amx amy amz ana anb anc and ane anf ang anh ani anj ank anl anm ann ano anp anq anr ans ant anu anv anw anx any anz aoa aob aoc aod aoe aof aog aoh aoi aoj aok aol aom aon aoo aop aoq aor aos aot aou aov aow aox aoy aoz apa apb apc apd ape apf apg aph api apj apk apl apm apn apo app apq apr aps apt apu apv apw apx apy apz aqa aqb aqc aqd aqe aqf aqg aqh aqi aqj aqk aql aqm aqn aqo aqp aqq aqr aqs aqt aqu aqv aqw aqx aqy aqz ara arb arc ard are arf arg arh ari arj ark arl arm arn aro arp arq arr ars art aru arv arw arx ary arz asa asb asc asd ase asf asg ash asi asj ask asl asm asn aso asp asq asr ass ast asu asv asw asx asy asz ata atb atc atd ate atf atg ath ati atj atk atl atm atn ato atp atq atr ats att atu atv atw atx aty atz aua aub auc aud aue auf aug auh aui auj auk aul aum aun auo aup auq aur aus aut auu auv auw aux auy auz ava avb avc avd ave avf avg avh avi avj avk avl avm avn avo avp avq avr avs avt avu avv avw avx avy avz awa awb awc awd awe awf awg awh awi awj awk awl awm awn awo awp awq awr aws awt awu awv aww awx awy awz axa axb axc axd axe axf axg axh axi axj axk axl axm axn axo axp axq axr axs axt axu axv axw axx axy axz aya ayb ayc ayd aye ayf ayg ayh ayi ayj ayk ayl aym ayn ayo ayp ayq ayr ays ayt ayu ayv ayw ayx ayy ayz aza azb azc azd aze azf azg azh azi azj azk azl azm azn azo azp azq azr azs azt azu azv azw azx azy azz
b49c822b47338613f0c10a02bd4f6a2a6735e324
Untitled Log
0
369
500
2025-07-16T05:56:29Z
Sharparam
284703
Use note templates
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[lore]] [[Documents|document]] that can be found in {{BFF}}.
== Overview ==
There are multiple untitled logs in the game, each with their own text.
{{Quote
|I remember waking in a pile of lifeless bodies. Not only lifeless though. Expressionless. Frozen visages.
}}
{{Quote
| Like waking from a dream about dreaming, everything is a haze. A dark ominous haze. I've seen death, pain, and torture. I hear a voice. Once in a while I see the voice beckon, like a ripple in water – before I can make form of the image. I am gone too.
}}
{{Quote
| I have no mouth, and I know nobody would hear me scream.{{note|Likely a reference to [[wikipedia:I Have No Mouth, and I Must Scream|I Have No Mouth, and I Must Scream]].}}
}}
{{Quote
| No matter where my mind wanders, there is an oppressive red mist crushing the reaches of my imagination. Try as I might, there seems to be no escape. No escape. Only a journey deeper. Farther.. but what awaits at the innermost depths. I suppose the [[Omnistructure]] makes room beyond sense.. beyond time.
}}
== Notes ==
{{notelist}}
{{Navbox/Documents}}
[[Category:Lore]]
[[Category:Documents]]
472bf3de6dbca52f57c3f288b12ad3650a51f3b6
Template:Reflist
10
613
963
2025-07-16T08:32:37Z
Sharparam
284703
Protected "[[Template:Reflist]]": Stable template ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<templatestyles src="Reflist/styles.css" /><div class="reflist<!--
-->{{#if:{{{1|}}}{{{colwidth|}}}| reflist-columns references-column-width}} {{#switch:{{{liststyle|{{{group|}}}}}}
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = reflist-{{{liststyle|{{{group}}}}}}
}}" <!-- End class, start style -->{{#if:{{{1|}}}
| {{#iferror:{{#ifexpr: {{{1|1}}} > 1 }} |style="column-width: {{{1}}};"}}
| {{#if: {{{colwidth|}}}|style="column-width: {{{colwidth}}};"}}
}}>
{{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}</div>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}<noinclude>
{{Documentation}}</noinclude>
5865246773ff390ed5700866ea2396d78a81b01f
Template:Navbox/Capes
10
287
333
332
2025-07-16T18:35:43Z
Sharparam
284703
Add [[Folk Cape]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Capes
| title = [[Capes]]
| list1 =
* [[Agile Cape]]
* [[Folk Cape]]
* [[Fur Cape]]
* [[Ronin Scarf]]
* [[Sentinel Overcoat]]
* [[Spectre Scarf]]
* [[Tattered Cape]]
* [[Traveler Cape]]
* [[Wanderer Cape]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
d08fd75315ebac94e72678f90276c13a3506783a
334
333
2025-07-21T02:15:24Z
Sharparam
284703
Add [[Corrupted Cape]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Capes
| title = [[Capes]]
| list1 =
* [[Agile Cape]]
* [[Corrupted Cape]]
* [[Folk Cape]]
* [[Fur Cape]]
* [[Ronin Scarf]]
* [[Sentinel Overcoat]]
* [[Spectre Scarf]]
* [[Tattered Cape]]
* [[Traveler Cape]]
* [[Wanderer Cape]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
9f0729072622507472ffd1be806417db23ffe410
335
334
2025-07-21T04:04:55Z
Sharparam
284703
Add [[Techpriest Cape]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Capes
| title = [[Capes]]
| list1 =
* [[Agile Cape]]
* [[Corrupted Cape]]
* [[Folk Cape]]
* [[Fur Cape]]
* [[Ronin Scarf]]
* [[Sentinel Overcoat]]
* [[Spectre Scarf]]
* [[Tattered Cape]]
* [[Techpriest Cape]]
* [[Traveler Cape]]
* [[Wanderer Cape]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
25d3fe6cdc6b4cce6fe483d3b4b7218599b53b34
Dust Sea
0
375
512
2025-07-16T18:55:34Z
Sharparam
284703
Created page with "The '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | At the base of the sprawling mining facility, a deep mist blankets the ground, leading out to a vast, desolate desert. This desert's sand is a choking mix of dust and residue from the countless constructions and creations towering above. The air is perilous to breathe, laden with fine particles that can invade the lungs. Scattered across this wasteland are th..."
wikitext
text/x-wiki
The '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
| At the base of the sprawling mining facility, a deep mist blankets the ground, leading out to a vast, desolate desert. This desert's sand is a choking mix of dust and residue from the countless constructions and creations towering above. The air is perilous to breathe, laden with fine particles that can invade the lungs. Scattered across this wasteland are the carcasses of long-forgotten machinery and the ruins of old structures. The architecture of these relics hints at a bygone era, a dark age marked by more primitive technology. This eerie landscape tells a silent tale of a past civilization, now buried beneath the relentless sands of time.
}}
== Location ==
{{coords|-4062|-2272|5797}}
Can be found at the top of a broken down tower in [[Deluge|the Deluge]] area, just past the [[Folk Cape]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left. Continue forward until reaching the big tower, climb it to the top and you will find the data log at the edge of the tower (use [[Scanner|the Scanner]] to see it more easily).
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
90fdcaf4874fbb945c79bf4bf3df130f8ba25db5
Template:Navbox/Data logs
10
290
346
345
2025-07-16T18:55:55Z
Sharparam
284703
Add [[Dust Sea]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
214a4da82294ef39e752b290dbf6e8bbe5cab06f
347
346
2025-07-16T20:02:58Z
Sharparam
284703
Add [[Psychosis]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
2365608ea721de33b646b2deff88698eeb4f9b89
348
347
2025-07-21T04:12:14Z
Sharparam
284703
Add [[Night Horror]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
ab06e89cfbb84fd1c6a88bd34ce62082702c1f11
349
348
2025-07-21T05:37:47Z
Sharparam
284703
Add [[The Banshee]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
8d4aa14493f7ae826b561ab952726806ac2be395
Folk Cape
0
513
789
2025-07-16T18:58:28Z
Sharparam
284703
Improve location description
wikitext
text/x-wiki
{{Infobox/Cape
| image = Folk Cape.png
| title = {{PAGENAME}}
| Effect1 = -20% Technocasting speed
| Effect2 = +10% [[Technomancy]] penetration
| Effect3 = +50 Max [[flux]] points
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn by the player to gain certain effects.
== Location ==
{{coords|-3979|-2143|5796}}
At the top of a broken down tower in [[Deluge|the Deluge]] area, in front of [[Dust Sea|the Dust Sea]] [[Data logs|data log]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left, then continue until you enter the big tower. Climb the tower to the top and you'll find the item on the ground at the top of the last set of stairs.
{{Navbox/Capes}}
ced1f8221d9ad9bf30775a81e257aa3efb4d12dd
Crude Helmet
0
489
742
2025-07-16T19:06:23Z
Sharparam
284703
Created page with "{{Infobox/Armor | image = Crude Helmet.png | title = {{PAGENAME}} | Type = Helmet | Weight = Medium | Mk2_Sharp = 516 | Mk2_Blunt = 600 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}. == Location == {{coords|-3538|-6027|5477}} Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and fo..."
wikitext
text/x-wiki
{{Infobox/Armor
| image = Crude Helmet.png
| title = {{PAGENAME}}
| Type = Helmet
| Weight = Medium
| Mk2_Sharp = 516
| Mk2_Blunt = 600
| Mk2_Technomancy = 336
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}.
== Location ==
{{coords|-3538|-6027|5477}}
Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and follow the wall until you see a a corpse on a ledge holding the item.
{{Navbox/Armor}}
4327414a895ebc5fd2ac98909457618e6423b0f3
Template:Navbox/Rings
10
292
370
2025-07-16T19:11:48Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] }}<noinclude>[[Category:Navigation templates]]</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
7e4970f06f67401009bd01cbb3fb3b4f7a0a3720
Rings
0
442
649
2025-07-16T19:12:25Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' are a type of [[equipment]] that can be worn by the player to gain certain effects. {{Navbox/Rings}} [[Category:Rings]]"
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] that can be worn by the player to gain certain effects.
{{Navbox/Rings}}
[[Category:Rings]]
7adf2438732889de3ab3158748516564e3c337cb
Ring of Burning Desire
0
519
801
2025-07-16T19:13:11Z
Sharparam
284703
remove "the" from "the Diver"
wikitext
text/x-wiki
{{Infobox/Ring
| image = Ring of Burning Desire.png
| title = {{PAGENAME}}
| Effect1 = +20% chance to inflict [[heat]] [[status effect]].
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] that can be found in {{BFF}}.
== Acquisition ==
Drops from [[Diver]] [[enemies]] in [[Deluge|the Deluge]] area.
{{Navbox/Rings}}
e25c13f86a914c3c38145e3c207d7ca4d045bcf0
Gingko Leaves
0
433
628
2025-07-16T19:23:24Z
Sharparam
284703
Add note on acquisition
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]].
== Acquisition ==
Drops from several enemies in the game, as well as found on the ground in certain locations.
== Locations ==
{| class="wikitable"
! Amount !! Area !! Description !! Coordinates
|-
| 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}}
|}
{{Navbox/Materials}}
[[Category:Materials]]
0fbff16a09a73af85c8ed1146f701144d7062005
Template:Weapons/CargoDeclare
10
448
660
2025-07-16T19:36:02Z
Sharparam
284703
Add support for Mk 0
wikitext
text/x-wiki
{{#cargo_declare:_table=Weapons
|name=String
|type=String
|speed=String
|damageType=String
|damageMk0Min=Integer
|damageMk0Max=Integer
|damageMk1Min=Integer
|damageMk1Max=Integer
|damageMk2Min=Integer
|damageMk2Max=Integer
|damageMk3Min=Integer
|damageMk3Max=Integer
|damageMk4Min=Integer
|damageMk4Max=Integer
|damageMk5Min=Integer
|damageMk5Max=Integer
}}
058226c206cdffeac8dd6c20fbd40d7a4b81f948
Template:Weapons/CargoStore
10
449
662
2025-07-16T19:36:27Z
Sharparam
284703
Add support for Mk 0
wikitext
text/x-wiki
<includeonly>{{#cargo_store:_table=Weapons
|name={{{name|}}}
|type={{{type|}}}
|speed={{{speed|}}}
|damageType={{{damageType|}}}
|damageMk0Min={{{damageMk0Min|}}}
|damageMk0Max={{{damageMk0Max|}}}
|damageMk1Min={{{damageMk1Min|}}}
|damageMk1Max={{{damageMk1Max|}}}
|damageMk2Min={{{damageMk2Min|}}}
|damageMk2Max={{{damageMk2Max|}}}
|damageMk3Min={{{damageMk3Min|}}}
|damageMk3Max={{{damageMk3Max|}}}
|damageMk4Min={{{damageMk4Min|}}}
|damageMk4Max={{{damageMk4Max|}}}
|damageMk5Min={{{damageMk5Min|}}}
|damageMk5Max={{{damageMk5Max|}}}
}}</includeonly><noinclude>{{#cargo_attach:table=Weapons}}</noinclude>
f0f50597b71007312dd924dfdbdaec0c577db10f
Divine Blessing
0
577
915
2025-07-16T19:42:01Z
Sharparam
284703
Created page with "{{Infobox/Ability | image = Divine Blessing.png | title = {{PAGENAME}} | Cost = 125 | Cooldown = 30 | Description = Restore 30% of your total [[HP]] and deal damage to all nearby [[Plague|plagued]] [[enemies]]. }} '''{{PAGENAME}}''' is a [[Weapons|weapon]] [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}"
wikitext
text/x-wiki
{{Infobox/Ability
| image = Divine Blessing.png
| title = {{PAGENAME}}
| Cost = 125
| Cooldown = 30
| Description = Restore 30% of your total [[HP]] and deal damage to all nearby [[Plague|plagued]] [[enemies]].
}}
'''{{PAGENAME}}''' is a [[Weapons|weapon]] [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
552de679ebb2751ab76780e73c8c534074b51109
Template:Navbox/Items
10
285
317
316
2025-07-16T19:44:12Z
Sharparam
284703
Add [[Ability Splinter]]
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = Essential
| list1 =
* [[Ability Splinter]]
* [[Mobius Blade]]
* [[Old Key]]
* [[Scanner]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
2673f0c1725f34950c7425ee96a8c3a415a40efc
318
317
2025-07-21T04:25:24Z
Sharparam
284703
Add [[Handler Echo]]
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = Essential
| list1 =
* [[Ability Splinter]]
* [[Handler Echo]]
* [[Mobius Blade]]
* [[Old Key]]
* [[Scanner]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
0448d19159189da48bb14a046071effd62b3ef4d
Category:Essential items
14
418
598
2025-07-16T19:47:01Z
Sharparam
284703
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Category:Upgrade items
14
419
600
2025-07-16T19:56:59Z
Sharparam
284703
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Psychosis
0
376
514
2025-07-16T20:02:38Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |I've repeated the Completeness Protocol over 40 times now to no avail. No training can prepare a mind for this. All sense and reason are gone. The mental fortitude required to hold a coherent thought for longer than a heartbeat is soul-crushing. It feels like I am existing from one moment to the next. Picking up the remnants of déjà vu after déjà vu… }..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}.
== Overview ==
{{Quote
|I've repeated the Completeness Protocol over 40 times now to no avail. No training can prepare a mind for this. All sense and reason are gone. The mental fortitude required to hold a coherent thought for longer than a heartbeat is soul-crushing. It feels like I am existing from one moment to the next. Picking up the remnants of déjà vu after déjà vu…
}}
== Location ==
{{coords|-5130|-1039|5616}}
Found in [[Deluge|the Deluge]] area, near one of the [[Upgrade Splinter|upgrade splinters]] in the first big rectangular structure with pillars, near the first red lightpole. Use [[Scanner|the Scanner]] to more easily find the data log.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
b4998452a6a35bf04aeb60ea5d8c95c3edf9e497
Anomalous crystals
0
427
616
2025-07-16T20:18:17Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties. == Overview == There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''. Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, cau..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties.
== Overview ==
There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''.
Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, causing it to be lost forever.
{{Navbox/Items}}
[[Category:Anomalous crystals]]
5cef9dfbb687f0e77132dcb7450a11e973b25b95
Scanner
0
374
510
2025-07-16T20:22:09Z
Sharparam
284703
Add more info
wikitext
text/x-wiki
{{Infobox/Item
| image = Scanner.png
| title = {{PAGENAME}}
| Description = Captures and interprets data across hidden and abstract dimensions, revealing information that transcends conventional spatial and temporal limits, providing a comprehensive view of both visible and imperceptible phenomena.
}}
The '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Overview ==
Activating the item scans the area around the player, revealing important interactables like [[data logs]] and ladders.
{{Navbox/Items}}
[[Category:Essential items]]
[[Category:Lore]]
72e26e842e217333080947ca9fd96dff00b2be1e
One-handed weapons
0
496
756
2025-07-16T20:32:03Z
Sharparam
284703
Add weapon list
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[Weapons|weapon]] in {{BFF}} that come in two variants: [[sharp]] and [[blunt]].
== List of one-handed weapons ==
{{#cargo_query:table=Weapons
|fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5)
|where=type='one-handed'
|format=table
}}
{{Navbox/Weapons}}
[[Category:One-handed weapons]]
db05c537c888c3ecd32676dae4cbd9e3b79033c3
Weapons
0
465
694
2025-07-16T20:33:26Z
Sharparam
284703
Add Mk 0 damage column
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] in {{BFF}} used to engage in melee combat with [[enemies]].
== Upgrading ==
Weapons can be upgraded all the way to Mk 5 by speaking to [[The Handler]] and giving her the requisite materials.
Upgrading a weapon increases its damage as well as allowing you to embed more crystals into it to improve its properties further. Some weapons will also unlock passive bonuses or abilities when they are upgraded.
== List of weapons ==
{{#cargo_query:table=Weapons
|fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5)
|format=table
}}
{{Navbox/Weapons}}
627eeadeab2f527ee330ed3f5b806dcef85b45e8
Template:Infobox/Shield/doc
10
458
680
2025-07-21T00:03:40Z
Sharparam
284703
Created page with "== Examples == {{Infobox/Shield | image = Test shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} <synt..."
wikitext
text/x-wiki
== Examples ==
{{Infobox/Shield
| image = Test shield.png
| title = Test Shield
| Weight = Light
| Abilities = Shield Bash
| Mk0_Sharp = 10
| Mk0_Blunt = 10
| Mk0_Technomancy = 10
| Mk1_Sharp = 20
| Mk1_Blunt = 20
| Mk1_Technomancy = 20
| Mk2_Sharp = 30
| Mk2_Blunt = 30
| Mk2_Technomancy = 30
| Mk3_Sharp = 40
| Mk3_Blunt = 40
| Mk3_Technomancy = 40
| Mk4_Sharp = 50
| Mk4_Blunt = 50
| Mk4_Technomancy = 50
| Mk5_Sharp = 60
| Mk5_Blunt = 60
| Mk5_Technomancy = 60
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Shield
| image = Test shield.png
| title = Test Shield
| Weight = Light
| Abilities = Shield Bash
| Mk0_Sharp = 10
| Mk0_Blunt = 10
| Mk0_Technomancy = 10
| Mk1_Sharp = 20
| Mk1_Blunt = 20
| Mk1_Technomancy = 20
| Mk2_Sharp = 30
| Mk2_Blunt = 30
| Mk2_Technomancy = 30
| Mk3_Sharp = 40
| Mk3_Blunt = 40
| Mk3_Technomancy = 40
| Mk4_Sharp = 50
| Mk4_Blunt = 50
| Mk4_Technomancy = 50
| Mk5_Sharp = 60
| Mk5_Blunt = 60
| Mk5_Technomancy = 60
}}
</syntaxhighlight>
f660f4831abeb203edfc85fcc8225afbe28becd3
Wooden Shield
0
754
1168
2025-07-21T00:05:33Z
Sharparam
284703
Add details
wikitext
text/x-wiki
{{Infobox/Shield
| image = Wooden Shield.png
| title = {{PAGENAME}}
| Weight = Light
| Mk0_Sharp = 52.8
| Mk0_Blunt = 46.8
| Mk0_Technomancy = 7.2
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
{{Navbox/Shields}}
a25cde7cfde39f917e98c499b4c23d236886a94f
Template:Infobox/Shield
10
457
678
2025-07-21T00:10:28Z
Sharparam
284703
Add placeholders for Mk values
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=shield
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Weight,Passives,Abilities
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{#if:{{{Mk0_Sharp|}}}|{{{Mk0_Sharp}}}%|???}}
|Mk0_Blunt={{#if:{{{Mk0_Blunt|}}}|{{{Mk0_Blunt}}}%|???}}
|Mk0_Technomancy={{#if:{{{Mk0_Technomancy|}}}|{{{Mk0_Technomancy}}}%|???}}
|Mk1_Sharp={{#if:{{{Mk1_Sharp|}}}|{{{Mk1_Sharp}}}%|???}}
|Mk1_Blunt={{#if:{{{Mk1_Blunt|}}}|{{{Mk1_Blunt}}}%|???}}
|Mk1_Technomancy={{#if:{{{Mk1_Technomancy|}}}|{{{Mk1_Technomancy}}}%|???}}
|Mk2_Sharp={{#if:{{{Mk2_Sharp|}}}|{{{Mk2_Sharp}}}%|???}}
|Mk2_Blunt={{#if:{{{Mk2_Blunt|}}}|{{{Mk2_Blunt}}}%|???}}
|Mk2_Technomancy={{#if:{{{Mk2_Technomancy|}}}|{{{Mk2_Technomancy}}}%|???}}
|Mk3_Sharp={{#if:{{{Mk3_Sharp|}}}|{{{Mk3_Sharp}}}%|???}}
|Mk3_Blunt={{#if:{{{Mk3_Blunt|}}}|{{{Mk3_Blunt}}}%|???}}
|Mk3_Technomancy={{#if:{{{Mk3_Technomancy|}}}|{{{Mk3_Technomancy}}}%|???}}
|Mk4_Sharp={{#if:{{{Mk4_Sharp|}}}|{{{Mk4_Sharp}}}%|???}}
|Mk4_Blunt={{#if:{{{Mk4_Blunt|}}}|{{{Mk4_Blunt}}}%|???}}
|Mk4_Technomancy={{#if:{{{Mk4_Technomancy|}}}|{{{Mk4_Technomancy}}}%|???}}
|Mk5_Sharp={{#if:{{{Mk5_Sharp|}}}|{{{Mk5_Sharp}}}%|???}}
|Mk5_Blunt={{#if:{{{Mk5_Blunt|}}}|{{{Mk5_Blunt}}}%|???}}
|Mk5_Technomancy={{#if:{{{Mk5_Technomancy|}}}|{{{Mk5_Technomancy}}}%|???}}
}}{{#if:{{NAMESPACE}}||[[Category:Shields]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
879802ba38814822053b519e3543784bf8a6ee64
Shields
0
445
655
2025-07-21T01:31:34Z
Sharparam
284703
Add brief description
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] that can be used to protect the player against incoming [[damage]].
{{Navbox/Shields}}
[[Category:Shields]]
1e7147da72fc96843c2350072a5e579292f4c0ac
Fisherman
0
541
842
2025-07-21T01:43:20Z
Sharparam
284703
Add drop
wikitext
text/x-wiki
The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location.
== Drops ==
* [[Diver's Lungs Concoction]]
* [[Fractal Fungus]]
* [[Gingko Leaves]]
* [[Lesser Anomalous Crystal]]
* [[Lesser Restorative Fluid]]
* [[Ring of Burning Desire]]
* [[Sludge]]
* [[Upgrade Splinter]]
[[Category:Enemies]]
854a2903c300d816cf3a65b85c7bee9c7c9aeb6e
Librarian Overcoat
0
482
728
2025-07-21T01:55:58Z
Sharparam
284703
Created page with "{{Infobox/Armor | image = Librarian Overcoat.png | title = {{PAGENAME}} | Type = Chestguard | Set = Librarian | Weight = Light | Mk1_Sharp = 660 | Mk1_Blunt = 744 | Mk1_Technomancy = 1009 }} == Location == Dropped by "Librarian" enemies in [[Deluge|the Deluge]]? {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| image = Librarian Overcoat.png
| title = {{PAGENAME}}
| Type = Chestguard
| Set = Librarian
| Weight = Light
| Mk1_Sharp = 660
| Mk1_Blunt = 744
| Mk1_Technomancy = 1009
}}
== Location ==
Dropped by "Librarian" enemies in [[Deluge|the Deluge]]?
{{Navbox/Armor}}
ae4dc71e0b3fd31a0a4477632675eea80c6965d8
Librarian Trousers
0
488
740
2025-07-21T02:10:16Z
Sharparam
284703
Created page with "{{Infobox/Armor | image = Librarian Trousers.png | title = {{PAGENAME}} | Type = Legguard | Weight = Light | Set = Librarian | Mk1_Sharp = 456 | Mk1_Blunt = 516 | Mk1_Technomancy = 696 }} {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| image = Librarian Trousers.png
| title = {{PAGENAME}}
| Type = Legguard
| Weight = Light
| Set = Librarian
| Mk1_Sharp = 456
| Mk1_Blunt = 516
| Mk1_Technomancy = 696
}}
{{Navbox/Armor}}
1d0c2fa9e238497ee92524a75f41846d76113cd8
Improved Diver's Lungs Concoction
0
744
1148
2025-07-21T02:20:25Z
Sharparam
284703
Created page with "== Recipe == Obtained by defeating the many-legged creature in [[Deluge]]."
wikitext
text/x-wiki
== Recipe ==
Obtained by defeating the many-legged creature in [[Deluge]].
a1b23855f2d6d50d291ff7ec5da567ce7c83641d
Corrupted Cape
0
514
791
2025-07-21T02:27:42Z
Sharparam
284703
wikitext
text/x-wiki
{{Infobox/Cape
| image = Corrupted Cape.png
| title = {{PAGENAME}}
| Effect1 = +800 [[Sharp]] armor rating.
| Effect2 = +800 [[Blunt]] armor rating.
| Effect3 = +800 [[Technomancy]] armor rating.
}}
== Location ==
Dropped by the bigger knight guys ("Corrupted"?) wearing halberts in [[Deluge]].
{{Navbox/Capes}}
85092d24492b81865456f0c2ec6b4b43f2e6c927
Corrupted Cuirass
0
483
730
2025-07-21T02:28:57Z
Sharparam
284703
Created page with "{{Infobox/Armor | image = Corrupted Cuirass.png | title = {{PAGENAME}} | Type = Chestguard | Weight = Heavy | Mk2_Sharp = 1728 | Mk2_Blunt = 1488 | Mk2_Technomancy = 174 }} {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| image = Corrupted Cuirass.png
| title = {{PAGENAME}}
| Type = Chestguard
| Weight = Heavy
| Mk2_Sharp = 1728
| Mk2_Blunt = 1488
| Mk2_Technomancy = 174
}}
{{Navbox/Armor}}
183dddf62f3fe9d1345ac172c6970d381d73782b
Template:Armor/CargoDeclare
10
447
658
2025-07-21T02:30:31Z
Sharparam
284703
Add Mk 0
wikitext
text/x-wiki
{{#cargo_declare:_table=Armor
|name=String
|setname=String
|type=String
|weight=String
|sharpMk0=Integer
|bluntMk0=Integer
|technomancyMk0=Integer
|sharpMk1=Integer
|bluntMk1=Integer
|technomancyMk1=Integer
|sharpMk2=Integer
|bluntMk2=Integer
|technomancyMk2=Integer
|sharpMk3=Integer
|bluntMk3=Integer
|technomancyMk3=Integer
|sharpMk4=Integer
|bluntMk4=Integer
|technomancyMk4=Integer
|sharpMk5=Integer
|bluntMk5=Integer
|technomancyMk5=Integer
}}
338fa661fc066d90571ae8a2a2f747cb2c0d8f4f
Template:Armor/CargoStore
10
450
664
2025-07-21T02:31:15Z
Sharparam
284703
Add Mk 0
wikitext
text/x-wiki
<includeonly>{{#cargo_store:_table=Armor
|name={{{name|}}}
|setname={{{setname|}}}
|type={{{type|}}}
|weight={{{weight|}}}
|sharpMk0={{{sharpMk0|}}}
|bluntMk0={{{bluntMk0|}}}
|technomancyMk0={{{technomancyMk0|}}}
|sharpMk1={{{sharpMk1|}}}
|bluntMk1={{{bluntMk1|}}}
|technomancyMk1={{{technomancyMk1|}}}
|sharpMk2={{{sharpMk2|}}}
|bluntMk2={{{bluntMk2|}}}
|technomancyMk2={{{technomancyMk2|}}}
|sharpMk3={{{sharpMk3|}}}
|bluntMk3={{{bluntMk3|}}}
|technomancyMk3={{{technomancyMk3|}}}
|sharpMk4={{{sharpMk4|}}}
|bluntMk4={{{bluntMk4|}}}
|technomancyMk4={{{technomancyMk4|}}}
|sharpMk5={{{sharpMk5|}}}
|bluntMk5={{{bluntMk5|}}}
|technomancyMk5={{{technomancyMk5|}}}
}}</includeonly><noinclude>{{#cargo_attach:table=Armor}}</noinclude>
333780ac478dc35967062b394838e177b662daa9
Ring of Serpent
0
748
1156
2025-07-21T03:12:56Z
Sharparam
284703
Created page with "{{Infobox/Ring | image = Ring of Serpent.png | title = {{PAGENAME}} | Passives = [[Swift Reflexes]] | Effect1 = +2 [[Agility]] }} == Location == Near one of the underwater red lights in [[Deluge]]. {{Navbox/Rings}}"
wikitext
text/x-wiki
{{Infobox/Ring
| image = Ring of Serpent.png
| title = {{PAGENAME}}
| Passives = [[Swift Reflexes]]
| Effect1 = +2 [[Agility]]
}}
== Location ==
Near one of the underwater red lights in [[Deluge]].
{{Navbox/Rings}}
66cfb985c30744dba393ecfef89461918d2773f8
Techpriest Cape
0
515
793
2025-07-21T04:01:06Z
Sharparam
284703
Created page with "{{Infobox/Cape | image = Techpriest Cape | title = {{PAGENAME}} | Effect1 = +50 Max [[flux]] points. | Effect2 = +150 [[Flux]] leech rating. }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player. == Location == {{coords|-4527|8973|9614}} Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will b..."
wikitext
text/x-wiki
{{Infobox/Cape
| image = Techpriest Cape
| title = {{PAGENAME}}
| Effect1 = +50 Max [[flux]] points.
| Effect2 = +150 [[Flux]] leech rating.
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player.
== Location ==
{{coords|-4527|8973|9614}}
Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left.
== Trivia ==
* "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]].
{{Navbox/Capes}}
a7524062d33903459d69f5c7ae482dff8f0536c9
Tall Military Shield
0
751
1162
2025-07-21T04:07:58Z
Sharparam
284703
Created page with "{{Infobox/Shield | image = Tall Military Shield.png | title = {{PAGENAME}} | Weight = Heavy | Abilities = [[Improvised Fortification]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 66.5 | Mk2_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] that can be equipped by the player. It is the tall version of [[Military Shield|the Military Shield]]. == Location == {{coords|-4043|1327|1056}} Found in [[Asylum]]. After climbing a set of stars inside the first building after..."
wikitext
text/x-wiki
{{Infobox/Shield
| image = Tall Military Shield.png
| title = {{PAGENAME}}
| Weight = Heavy
| Abilities = [[Improvised Fortification]]
| Mk2_Sharp = 59.5
| Mk2_Blunt = 66.5
| Mk2_Technomancy = 52.5
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] that can be equipped by the player. It is the tall version of [[Military Shield|the Military Shield]].
== Location ==
{{coords|-4043|1327|1056}}
Found in [[Asylum]]. After climbing a set of stars inside the first building after the courtyard, the item is at the top on one of the catwalks.
{{Navbox/Shields}}
181aab1accc7978058774e9cab9eea6c94c3154c
Night Horror
0
377
516
2025-07-21T04:17:19Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote |In the tower of [[Asylum|the asylum]], a chilling and unearthly wail reverbates through the walls—a sound that can only be described as the cry of a banshee. The eerie, mournful shrieks cut through the silence, hinting at a presence both agonizing and spectral. Among the abominations and horrors that define this place, one patient remains, but..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}.
== Overview ==
{{Quote
|In the tower of [[Asylum|the asylum]], a chilling and unearthly wail reverbates through the walls—a sound that can only be described as the cry of a banshee. The eerie, mournful shrieks cut through the silence, hinting at a presence both agonizing and spectral. Among the abominations and horrors that define this place, one patient remains, but it's difficult to truly say they have survived. This lone individual, if they can still be called such, exists in a state that blurs the line between life and death, their being a twisted echo of humanity amidst the torment. The banshee's cries seem to emanate from this tormented soul, a haunting reminder of the asylum's dark legacy and the incomprehensible suffering endured within its dark halls.
}}
== Location ==
{{coords|-3811|1199|9172}}
Found in [[Asylum|the Asylum]]. Located below a staircase after leaving the first building. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
fc7ee13e9ef0e02cd4a7722f0e91cb2e83028519
Sentinel
0
485
734
2025-07-21T04:43:45Z
Sharparam
284703
Created page with "{{Infobox/Armor set | image = Sentinel.png | title = {{PAGENAME}} | Helmet = Sentinel Helmet | Chestguard = Sentinel Chest | Legguard = Sentinel Legguard | Gauntlets = Sentinel Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] that can be found in {{BFF}}. == Location == {{coords|-3634|1305|9617}} The full set can be found on a corpse in [[Asylum|the Asylum]]. After reaching the top of the small spiral staircase, continue through the long corridor and ge..."
wikitext
text/x-wiki
{{Infobox/Armor set
| image = Sentinel.png
| title = {{PAGENAME}}
| Helmet = Sentinel Helmet
| Chestguard = Sentinel Chest
| Legguard = Sentinel Legguard
| Gauntlets = Sentinel Gauntlets
}}
'''{{PAGENAME}}''' is an [[Armor sets|armor set]] that can be found in {{BFF}}.
== Location ==
{{coords|-3634|1305|9617}}
The full set can be found on a corpse in [[Asylum|the Asylum]]. After reaching the top of the small spiral staircase, continue through the long corridor and get to the bottom of the next room. Walk through the doorway and hug the left wall to reach an area behind a wall with a corpse sitting in a corner holding the armor set and the [[Daggers]].
{{Navbox/Armor}}
c383d5b5ea00cce79216ed8915d5810d12cb993f
Armor
0
466
696
2025-07-21T04:47:25Z
Sharparam
284703
wikitext
text/x-wiki
'''{{PAGENAME}}''' is protective [[equipment]] that can be worn to increase defensive stats.
== List of armor ==
{{#cargo_query:table=Armor
|fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, weight=Weight
|format=table
}}
{{Navbox/Armor}}
9bd135cf1860c6152460f40d36e8fe2636fd7ef3
The Banshee
0
378
518
2025-07-21T05:37:26Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote | The banshee's movements, dancing through [[Asylum|the asylum's]] decaying tower, are unsettingly precise, as if they were once part of a carefully honed combat style. Each anguished gesture and frenzied motion mirrors advanced fighting techniques, reminiscent of those taught at the highest levels of military training. The eerie choreography sugg..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}.
== Overview ==
{{Quote
| The banshee's movements, dancing through [[Asylum|the asylum's]] decaying tower, are unsettingly precise, as if they were once part of a carefully honed combat style. Each anguished gesture and frenzied motion mirrors advanced fighting techniques, reminiscent of those taught at the highest levels of military training. The eerie choreography suggests that the creature's wails are not merely cries of torment, but the remnants of a brutal experiment aimed at forging a living weapon. The movements, though now distorted and ghostly, hint at a once-formed discipline, twisted into a nightmarish mockery of the intended martial prowess. This spectral entity seems to embody the cruel ambition of those who sought to create a perfect instrument of war through unthinkable means.
}}
== Location ==
{{coords|-3943|1596|1532}}
Found in the center of a circular room, surrounded by chairs, in the big tower in [[Asylum|the asylum]]. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
0309dfabb2c1cb6950f037a68ebce98a2b67b20f
Template:Navbox/Items
10
285
319
318
2025-07-21T05:39:42Z
Sharparam
284703
Add [[Plagued Blood]]
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = Essential
| list1 =
* [[Ability Splinter]]
* [[Handler Echo]]
* [[Mobius Blade]]
* [[Old Key]]
* [[Plagued Blood]]
* [[Scanner]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
b40f200532197c3923fcf2ffd79cb383740795bb
320
319
2025-07-23T01:17:51Z
Sharparam
284703
Add homunculus mirage and perk essence
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = Essential
| list1 =
* [[Ability Splinter]]
* [[Handler Echo]]
* [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]])
* [[Mobius Blade]]
* [[Old Key]]
* [[Perk Essence]] ([[Unstable Perk Essence|Unstable]])
* [[Plagued Blood]]
* [[Scanner]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
ddfce34a1183f816fb726793fbaee33e3e626bae
321
320
2025-07-23T04:06:46Z
Sharparam
284703
Add upgrade items
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = Essential
| list1 =
* [[Ability Splinter]]
* [[Handler Echo]]
* [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]])
* [[Mobius Blade]]
* [[Old Key]]
* [[Perk Essence]] ([[Unstable Perk Essence|Unstable]])
* [[Plagued Blood]]
* [[Scanner]]
| group1.1 = [[Upgrade items|Upgrade]]
| list1.1 =
* [[Upgrade Splinter]]
* [[Upgrade Module]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
5d993314d5a6d93f05f9e71fae3e58357d179daf
Skullface Helmet
0
490
744
2025-07-21T05:47:59Z
Sharparam
284703
Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Skullface Helmet.png | Type = Helmet | Weight = Light | Passives = [[Volatile Illusions]] | Mk5_Sharp = 692 | Mk5_Blunt = 692 | Mk5_Technomancy = 928 }} == Location == {{coords|-4063|1564|1686}} After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet. {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Skullface Helmet.png
| Type = Helmet
| Weight = Light
| Passives = [[Volatile Illusions]]
| Mk5_Sharp = 692
| Mk5_Blunt = 692
| Mk5_Technomancy = 928
}}
== Location ==
{{coords|-4063|1564|1686}}
After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet.
{{Navbox/Armor}}
06db38be9569d6ea522dedf56d2264708ad17817
Vengeance
0
486
736
2025-07-21T05:51:00Z
Sharparam
284703
Created page with "{{Infobox/Armor set | title = {{PAGENAME}} | image = Vengeance.png | Helmet = Vengeance Helmet | Chestguard = Vengeance Cuirass | Legguard = Vengeance Legs | Gauntlets = Vengeance Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] found in {{BFF}}. == Location == {{coords|-3925|1676|9471}} Found on a corpse in the shortcut area leading to the big tower. {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor set
| title = {{PAGENAME}}
| image = Vengeance.png
| Helmet = Vengeance Helmet
| Chestguard = Vengeance Cuirass
| Legguard = Vengeance Legs
| Gauntlets = Vengeance Gauntlets
}}
'''{{PAGENAME}}''' is an [[Armor sets|armor set]] found in {{BFF}}.
== Location ==
{{coords|-3925|1676|9471}}
Found on a corpse in the shortcut area leading to the big tower.
{{Navbox/Armor}}
37e805d19347a1c48db878ae9dc7e86a5905fb7b
Hellicar's Maxims
0
379
520
2025-07-21T06:09:02Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}. == Acquisition == Drops from [[enemies]] in the game. * Asylum enemy with cape and sword+shield. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]]"
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}.
== Acquisition ==
Drops from [[enemies]] in the game.
* Asylum enemy with cape and sword+shield.
{{Navbox/Documents}}
[[Category:Lore]]
[[Category:Documents]]
9e54fe19f15f8d8dce8dd560ec5bc7a0f7a98dab
Category:Bosses
14
540
840
2025-07-21T06:25:38Z
Sharparam
284703
Created page with "[[Category:Enemies]]"
wikitext
text/x-wiki
[[Category:Enemies]]
d3da306a1b523dea15853a2b661da0200bf2f201
Enemies
0
537
834
2025-07-21T06:26:56Z
Sharparam
284703
Created page with "{{Navbox/Enemies}}"
wikitext
text/x-wiki
{{Navbox/Enemies}}
833889e0d1b529dbf02a0a7b4ded350913eaaadd
Bosses
0
539
838
2025-07-21T06:28:40Z
Sharparam
284703
wikitext
text/x-wiki
'''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated.
{{Navbox/Bosses}}
0c3e8dc2475799e24d9fb25b0d80bf435d40e02a
Template:Infobox/Boss
10
461
686
2025-07-21T06:50:54Z
Sharparam
284703
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind = boss
| sep=,
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| title = {{{title|{{PAGENAME}}}}}
| sections = Basic Info, Stats
| Stats = HP, SharpResist, BluntResist, TechnomancyResist
| SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance
| BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance
| TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance
| SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}}
| BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}}
| TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}}
}}{{#if:{{NAMESPACE}}||[[Category:Bosses]]}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]
</noinclude>
64710a105198d7712f12bdaeab6e515bd71f2fe8
Template:Navbox/Data logs
10
290
350
349
2025-07-21T16:25:33Z
Sharparam
284703
Add [[Shadows in the Courtyard]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
f20790d1177712318ffb0c575d91690d98c09f19
351
350
2025-07-23T01:24:56Z
Sharparam
284703
Add [[Inhabitants]] and note on ordering
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
8805c049301dbd9643cf641fef2da91d8afdfbf0
352
351
2025-07-23T04:47:22Z
Sharparam
284703
Add [[Serpentine Visions]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
8e02ca819e48ceaeec301d132d06e960ed6923a9
353
352
2025-07-23T06:03:21Z
Sharparam
284703
Add [[Shifting Sands]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
b969662647d22a6cc9072e811cb3f2f163b91464
354
353
2025-07-23T09:35:40Z
Sharparam
284703
Add [[Call of the Void]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
125ee0dcc36ec7294986a579187b61c57ec19bd5
355
354
2025-07-23T10:15:56Z
Sharparam
284703
Add [[Umbral City]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
7c563198274471604afdcb166842cd0df6f210b0
356
355
2025-07-23T10:25:33Z
Sharparam
284703
Add [[Intercepted Transmission]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
ebf1841010ec3a6aa0d5dc427bd59a5986403681
357
356
2025-07-23T13:05:10Z
Sharparam
284703
Add [[Desert Dream]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
1496e77efafb4db0cbdd7f82f39fcdf8abf52d0f
Shadows in the Courtyard
0
380
522
2025-07-21T16:32:22Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
| There's a radial pattern in [[Blok 6147|this Blok]]. A heavily pedestrian zone. The people living here must have had a rather communal spirit. I can't tell if it's just my mind, but I can hear the echoes of children shouting. The ring of a school bell. The creek of a rusty gate opening and closing in a morning ritual. I imagine some of the views here are rather stunning.
}}
== Location ==
{{coords|-1016|-3857|2319}}
Found in [[Blok 6147]], on a round balcony overlooking the central hub.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
3ea9546e3cf140db20981b41b9f9f6e2f674c210
Module:Check for unknown parameters
828
614
965
2025-07-22T11:58:12Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and trim(s) ~= ''
end
function p.check (frame)
local args = frame.args
local pargs = frame:getParent().args
local ignoreblank = isnotempty(frame.args['ignoreblank'])
local checkpos = isnotempty(frame.args['checkpositional'])
local knownargs = {}
local unknown = frame.args['unknown'] or 'Found _VALUE_, '
local preview = frame.args['preview']
local res = {}
local regexps = {}
local comments = {}
local commentstr = ''
local ispreview = frame:preprocess( "{{REVISIONID}}" ) == "" and 1 or 0
-- create the list of known args, regular expressions, and the return string
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
if isnotempty(preview) then
preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>'
elseif preview == nil then
preview = unknown
end
if ispreview == 1 then
unknown = preview
ignoreblank = false
end
-- adds one result to the output tables
local function addresult(k)
if k == '' then
-- Fix odd bug for | = which gets stripped to the empty string and
-- breaks category links
k = ' '
end
local r = unknown:gsub('_VALUE_', k)
table.insert(res, r)
table.insert(comments, '"' .. k .. '"')
end
-- loop over the parent args, and make sure they are on the list
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for i, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
k = mw.ustring.gsub(k, '[^%w%-_ ]', '?')
addresult(k)
end
elseif checkpos and
type(k) == 'number' and
knownargs[tostring(k)] == nil and
( not ignoreblank or isnotempty(v) )
then
addresult(k)
end
end
if #comments > 0 then
commentstr = '<!-- Module:Check for unknown parameters results: ' ..
table.concat(comments, ', ') .. '-->'
end
return table.concat(res) .. commentstr
end
return p
90cb45a6cbe02f0d73cbfdec8233df899b000e3d
Agility
0
711
1088
2025-07-22T13:14:28Z
Sharparam
284703
Add missing category
wikitext
text/x-wiki
'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects stats related to critical chance, stamina, speed, and boss resistance to arrows.
== Overview ==
Critical chance and melee swing speed both have a hard cap at 100. The hard caps for other stats can be seen in the table when their increment amount drops to zero.
<!--<div class="noresize">-->
{| class="wikitable hover-highlight mw-collapsible mw-collapsed sortable sticky-header-multi" style="text-align: right;"
|-
! class="unsortable" scope="col" rowspan="2" | Agility
! class="unsortable" scope="col" rowspan="2" | Crit chance
! class="unsortable" scope="col" rowspan="2" | Stamina
! class="unsortable" scope="col" rowspan="2" | Stam delay
! class="unsortable" scope="col" rowspan="2" | Move speed
! class="unsortable" scope="col" rowspan="2" | Melee swing speed
! class="unsortable" scope="col" rowspan="2" | Range wep draw spd pen
! class="unsortable" scope="col" rowspan="2" | Boss arrow res reduction
! class="unsortable" scope="col" colspan="7" | Increments
|-
! class="unsortable" scope="col" | Crit chance
! class="unsortable" scope="col" | Stamina
! class="unsortable" scope="col" | Stam delay
! class="unsortable" scope="col" | Move speed
! class="unsortable" scope="col" | Melee swing speed
! class="unsortable" scope="col" | Range wep draw spd pen
! class="unsortable" scope="col" | Boss arrow res reduction
|-
| 0 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 25.00% || 0% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 0.00% || 0%
|-
| 1 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 23.89% || 1% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 2 || 0.25% || 105 || 1.90 || 100.00% || 100.0% || 22.78% || 2% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 3 || 0.50% || 105 || 1.90 || 100.00% || 100.0% || 21.67% || 3% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 4 || 0.75% || 105 || 1.90 || 100.00% || 100.0% || 20.56% || 4% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 5 || 1.00% || 105 || 1.90 || 100.00% || 100.0% || 19.45% || 5% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 6 || 1.50% || 107 || 1.89 || 100.00% || 100.0% || 18.34% || 6% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 7 || 2.00% || 109 || 1.88 || 100.00% || 100.0% || 17.23% || 7% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 8 || 2.50% || 111 || 1.87 || 100.00% || 100.0% || 16.12% || 8% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 9 || 3.00% || 113 || 1.86 || 100.00% || 100.0% || 15.01% || 9% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 10 || 3.50% || 115 || 1.85 || 100.00% || 100.0% || 13.90% || 10% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 11 || 4.10% || 117 || 1.84 || 100.00% || 100.0% || 12.79% || 11% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 12 || 4.70% || 119 || 1.83 || 100.00% || 100.0% || 11.68% || 12% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 13 || 5.30% || 121 || 1.82 || 100.00% || 100.0% || 10.57% || 13% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 14 || 5.90% || 123 || 1.81 || 100.00% || 100.0% || 9.46% || 14% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 15 || 6.50% || 125 || 1.80 || 100.00% || 100.0% || 8.35% || 15% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 16 || 9.07% || 127 || 1.79 || 100.17% || 100.5% || 7.24% || 16% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 17 || 11.64% || 129 || 1.78 || 100.34% || 101.0% || 6.13% || 17% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 18 || 14.21% || 131 || 1.77 || 100.51% || 101.5% || 5.02% || 18% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 19 || 16.78% || 133 || 1.76 || 100.68% || 102.0% || 3.91% || 19% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 20 || 19.35% || 135 || 1.75 || 100.85% || 102.5% || 2.80% || 20% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 21 || 21.92% || 137 || 1.74 || 101.02% || 103.0% || 1.69% || 21% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 22 || 24.49% || 139 || 1.73 || 101.19% || 103.5% || 0.58% || 22% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 23 || 27.06% || 141 || 1.72 || 101.36% || 104.0% || -0.53% || 23% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 24 || 29.63% || 143 || 1.71 || 101.53% || 104.5% || -1.64% || 24% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 25 || 32.20% || 145 || 1.70 || 101.70% || 105.0% || -2.75% || 25% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 26 || 34.77% || 147 || 1.69 || 101.87% || 105.5% || -3.86% || 26% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 27 || 37.34% || 149 || 1.68 || 102.04% || 106.0% || -4.97% || 27% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 28 || 39.91% || 151 || 1.67 || 102.21% || 106.5% || -6.08% || 28% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 29 || 42.48% || 153 || 1.66 || 102.38% || 107.0% || -7.19% || 29% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 30 || 45.05% || 155 || 1.65 || 102.55% || 107.5% || -8.30% || 30% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 31 || 46.05% || 157 || 1.64 || 102.72% || 108.0% || -9.41% || 31% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 32 || 47.05% || 159 || 1.63 || 102.89% || 108.5% || -10.52% || 32% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 33 || 48.05% || 161 || 1.62 || 103.06% || 109.0% || -11.63% || 33% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 34 || 49.05% || 163 || 1.61 || 103.23% || 109.5% || -12.74% || 34% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 35 || 50.05% || 165 || 1.60 || 103.40% || 110.0% || -13.85% || 35% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 36 || 51.05% || 167 || 1.59 || 103.57% || 110.5% || -14.96% || 36% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 37 || 52.05% || 169 || 1.58 || 103.74% || 111.0% || -16.07% || 37% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 38 || 53.05% || 171 || 1.57 || 103.91% || 111.5% || -17.18% || 38% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 39 || 54.05% || 173 || 1.56 || 104.08% || 112.0% || -18.29% || 39% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 40 || 55.05% || 175 || 1.55 || 104.25% || 112.5% || -19.40% || 40% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 41 || 56.05% || 177 || 1.54 || 104.42% || 113.0% || -20.51% || 41% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 42 || 57.05% || 179 || 1.53 || 104.59% || 113.5% || -21.62% || 42% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 43 || 58.05% || 181 || 1.52 || 104.76% || 114.0% || -22.73% || 43% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 44 || 59.05% || 183 || 1.51 || 104.93% || 114.5% || -23.84% || 44% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 45 || 60.05% || 185 || 1.50 || 105.10% || 115.0% || -24.95% || 45% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 46 || 61.05% || 186 || 1.50 || 105.24% || 115.5% || -24.95% || 46% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 47 || 62.05% || 187 || 1.50 || 105.38% || 116.0% || -24.95% || 47% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 48 || 63.05% || 188 || 1.50 || 105.52% || 116.5% || -24.95% || 48% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 49 || 64.05% || 189 || 1.50 || 105.66% || 117.0% || -24.95% || 49% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 50 || 65.05% || 190 || 1.50 || 105.80% || 117.5% || -24.95% || 50% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 51 || 65.45% || 191 || 1.50 || 105.94% || 117.7% || -24.95% || 51% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 52 || 65.85% || 192 || 1.50 || 106.08% || 117.9% || -24.95% || 52% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 53 || 66.25% || 193 || 1.50 || 106.22% || 118.1% || -24.95% || 53% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 54 || 66.65% || 194 || 1.50 || 106.36% || 118.3% || -24.95% || 54% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 55 || 67.05% || 195 || 1.50 || 106.50% || 118.5% || -24.95% || 55% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 56 || 67.45% || 196 || 1.50 || 106.64% || 118.7% || -24.95% || 56% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 57 || 67.85% || 197 || 1.50 || 106.78% || 118.9% || -24.95% || 57% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 58 || 68.25% || 198 || 1.50 || 106.92% || 119.1% || -24.95% || 58% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 59 || 68.65% || 199 || 1.50 || 107.06% || 119.3% || -24.95% || 59% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 60 || 69.05% || 200 || 1.50 || 107.20% || 119.5% || -24.95% || 60% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 61 || 69.45% || 201 || 1.50 || 107.34% || 119.7% || -24.95% || 61% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 62 || 69.85% || 202 || 1.50 || 107.48% || 119.9% || -24.95% || 62% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 63 || 70.25% || 203 || 1.50 || 107.62% || 120.1% || -24.95% || 63% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 64 || 70.65% || 204 || 1.50 || 107.76% || 120.3% || -24.95% || 64% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 65 || 71.05% || 205 || 1.50 || 107.90% || 120.5% || -24.95% || 65% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 66 || 71.45% || 206 || 1.50 || 108.04% || 120.7% || -24.95% || 66% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 67 || 71.85% || 207 || 1.50 || 108.18% || 120.9% || -24.95% || 67% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 68 || 72.25% || 208 || 1.50 || 108.32% || 121.1% || -24.95% || 68% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 69 || 72.65% || 209 || 1.50 || 108.46% || 121.3% || -24.95% || 69% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 70 || 73.05% || 210 || 1.50 || 108.60% || 121.5% || -24.95% || 70% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 71 || 73.45% || 211 || 1.50 || 108.74% || 121.7% || -24.95% || 71% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 72 || 73.85% || 212 || 1.50 || 108.88% || 121.9% || -24.95% || 72% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 73 || 74.25% || 213 || 1.50 || 109.02% || 122.1% || -24.95% || 73% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 74 || 74.65% || 214 || 1.50 || 109.16% || 122.3% || -24.95% || 74% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 75 || 75.05% || 215 || 1.50 || 109.30% || 122.5% || -24.95% || 75% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 76 || 75.25% || 216 || 1.50 || 109.44% || 122.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 77 || 75.45% || 217 || 1.50 || 109.58% || 122.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 78 || 75.65% || 218 || 1.50 || 109.72% || 122.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 79 || 75.85% || 219 || 1.50 || 109.86% || 122.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 80 || 76.05% || 220 || 1.50 || 110.00% || 123.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 81 || 76.25% || 221 || 1.50 || 110.00% || 123.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 82 || 76.45% || 222 || 1.50 || 110.00% || 123.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 83 || 76.65% || 223 || 1.50 || 110.00% || 123.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 84 || 76.85% || 224 || 1.50 || 110.00% || 123.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 85 || 77.05% || 225 || 1.50 || 110.00% || 123.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 86 || 77.25% || 226 || 1.50 || 110.00% || 123.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 87 || 77.45% || 227 || 1.50 || 110.00% || 123.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 88 || 77.65% || 228 || 1.50 || 110.00% || 123.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 89 || 77.85% || 229 || 1.50 || 110.00% || 123.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 90 || 78.05% || 230 || 1.50 || 110.00% || 124.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 91 || 78.25% || 231 || 1.50 || 110.00% || 124.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 92 || 78.45% || 232 || 1.50 || 110.00% || 124.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 93 || 78.65% || 233 || 1.50 || 110.00% || 124.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 94 || 78.85% || 234 || 1.50 || 110.00% || 124.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 95 || 79.05% || 235 || 1.50 || 110.00% || 124.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 96 || 79.25% || 236 || 1.50 || 110.00% || 124.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 97 || 79.45% || 237 || 1.50 || 110.00% || 124.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 98 || 79.65% || 238 || 1.50 || 110.00% || 124.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 99 || 79.85% || 239 || 1.50 || 110.00% || 124.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 100 || 80.05% || 240 || 1.50 || 110.00% || 125.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|}
<!--</div>-->
[[Category:Attributes]]
7a701b76e512860658a8b6ad71e4474cbf3409ce
Category:Attributes
14
708
1082
2025-07-22T13:14:41Z
Sharparam
284703
Created page with "[[Category:Game mechanics]]"
wikitext
text/x-wiki
[[Category:Game mechanics]]
f2739a7f6d15068b5f220f8cbb0a1aa293521862
Strength
0
710
1086
2025-07-22T13:16:16Z
Sharparam
284703
Improve table
wikitext
text/x-wiki
'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects weapon damage and max weight.
== Overview ==
Strength affects bonus weapon damage, as well as the max weight which affects encumbrance.
The gain to max weight is {{val|450|u=g}} for every attribute point until 45, which is the last to give the increment. Every additional level into strength after that will not increase max weight, so it has a hard cap of {{val|40.5|u=kg}}.
The gain to bonus weapon damage is always 10.8%, but going past 92 shows the total bonus damage as always being 1%. It is unclear if this is just a visual bug or if the bonus damage actually does drop down to 1%.
{| class="wikitable sortable hover-highlight sticky-header-multi mw-collapsible mw-collapsed" style="text-align: right;"
|-
! class="unsortable" scope="col" rowspan="2" | Strength
! class="unsortable" scope="col" rowspan="2" | +Weapon DMG
! class="unsortable" scope="col" rowspan="2" | Max weight (g)
! class="unsortable" scope="col" colspan="2" | Increments
|-
! class="unsortable" scope="col" | +Weapon DMG
! class="unsortable" scope="col" | Max weight (g)
|-
| 0 || 0.0% || {{fnum|20250}} || 0.0% || 0
|-
| 1 || 10.8% || {{fnum|20700}} || 10.8% || 450
|-
| 2 || 21.6% || {{fnum|21150}} || 10.8% || 450
|-
| 3 || 32.4% || {{fnum|21600}} || 10.8% || 450
|-
| 4 || 43.2% || {{fnum|22050}} || 10.8% || 450
|-
| 5 || 54.0% || {{fnum|22500}} || 10.8% || 450
|-
| 6 || 64.8% || {{fnum|22950}} || 10.8% || 450
|-
| 7 || 75.6% || {{fnum|23400}} || 10.8% || 450
|-
| 8 || 86.4% || {{fnum|23850}} || 10.8% || 450
|-
| 9 || 97.2% || {{fnum|24300}} || 10.8% || 450
|-
| 10 || 108.0% || {{fnum|24750}} || 10.8% || 450
|-
| 11 || 118.8% || {{fnum|25200}} || 10.8% || 450
|-
| 12 || 129.6% || {{fnum|25650}} || 10.8% || 450
|-
| 13 || 140.4% || {{fnum|26100}} || 10.8% || 450
|-
| 14 || 151.2% || {{fnum|26550}} || 10.8% || 450
|-
| 15 || 162.0% || {{fnum|27000}} || 10.8% || 450
|-
| 16 || 172.8% || {{fnum|27450}} || 10.8% || 450
|-
| 17 || 183.6% || {{fnum|27900}} || 10.8% || 450
|-
| 18 || 194.4% || {{fnum|28350}} || 10.8% || 450
|-
| 19 || 205.2% || {{fnum|28800}} || 10.8% || 450
|-
| 20 || 216.0% || {{fnum|29250}} || 10.8% || 450
|-
| 21 || 226.8% || {{fnum|29700}} || 10.8% || 450
|-
| 22 || 237.6% || {{fnum|30150}} || 10.8% || 450
|-
| 23 || 248.4% || {{fnum|30600}} || 10.8% || 450
|-
| 24 || 259.2% || {{fnum|31050}} || 10.8% || 450
|-
| 25 || 270.0% || {{fnum|31500}} || 10.8% || 450
|-
| 26 || 280.8% || {{fnum|31950}} || 10.8% || 450
|-
| 27 || 291.6% || {{fnum|32400}} || 10.8% || 450
|-
| 28 || 302.4% || {{fnum|32850}} || 10.8% || 450
|-
| 29 || 313.2% || {{fnum|33300}} || 10.8% || 450
|-
| 30 || 324.0% || {{fnum|33750}} || 10.8% || 450
|-
| 31 || 334.8% || {{fnum|34200}} || 10.8% || 450
|-
| 32 || 345.6% || {{fnum|34650}} || 10.8% || 450
|-
| 33 || 356.4% || {{fnum|35100}} || 10.8% || 450
|-
| 34 || 367.2% || {{fnum|35550}} || 10.8% || 450
|-
| 35 || 378.0% || {{fnum|36000}} || 10.8% || 450
|-
| 36 || 388.8% || {{fnum|36450}} || 10.8% || 450
|-
| 37 || 399.6% || {{fnum|36900}} || 10.8% || 450
|-
| 38 || 410.4% || {{fnum|37350}} || 10.8% || 450
|-
| 39 || 421.2% || {{fnum|37800}} || 10.8% || 450
|-
| 40 || 432.0% || {{fnum|38250}} || 10.8% || 450
|-
| 41 || 442.8% || {{fnum|38700}} || 10.8% || 450
|-
| 42 || 453.6% || {{fnum|39150}} || 10.8% || 450
|-
| 43 || 464.4% || {{fnum|39600}} || 10.8% || 450
|-
| 44 || 475.2% || {{fnum|40050}} || 10.8% || 450
|-
| 45 || 486.0% || {{fnum|40500}} || 10.8% || 450
|-
| 46 || 496.8% || {{fnum|40500}} || 10.8% || 0
|-
| 47 || 507.6% || {{fnum|40500}} || 10.8% || 0
|-
| 48 || 518.4% || {{fnum|40500}} || 10.8% || 0
|-
| 49 || 529.2% || {{fnum|40500}} || 10.8% || 0
|-
| 50 || 540.0% || {{fnum|40500}} || 10.8% || 0
|-
| 51 || 550.8% || {{fnum|40500}} || 10.8% || 0
|-
| 52 || 561.6% || {{fnum|40500}} || 10.8% || 0
|-
| 53 || 572.4% || {{fnum|40500}} || 10.8% || 0
|-
| 54 || 583.2% || {{fnum|40500}} || 10.8% || 0
|-
| 55 || 594.0% || {{fnum|40500}} || 10.8% || 0
|-
| 56 || 604.8% || {{fnum|40500}} || 10.8% || 0
|-
| 57 || 615.6% || {{fnum|40500}} || 10.8% || 0
|-
| 58 || 626.4% || {{fnum|40500}} || 10.8% || 0
|-
| 59 || 637.2% || {{fnum|40500}} || 10.8% || 0
|-
| 60 || 648.0% || {{fnum|40500}} || 10.8% || 0
|-
| 61 || 658.8% || {{fnum|40500}} || 10.8% || 0
|-
| 62 || 669.6% || {{fnum|40500}} || 10.8% || 0
|-
| 63 || 680.4% || {{fnum|40500}} || 10.8% || 0
|-
| 64 || 691.2% || {{fnum|40500}} || 10.8% || 0
|-
| 65 || 702.0% || {{fnum|40500}} || 10.8% || 0
|-
| 66 || 712.8% || {{fnum|40500}} || 10.8% || 0
|-
| 67 || 723.6% || {{fnum|40500}} || 10.8% || 0
|-
| 68 || 734.4% || {{fnum|40500}} || 10.8% || 0
|-
| 69 || 745.2% || {{fnum|40500}} || 10.8% || 0
|-
| 70 || 756.0% || {{fnum|40500}} || 10.8% || 0
|-
| 71 || 766.8% || {{fnum|40500}} || 10.8% || 0
|-
| 72 || 777.6% || {{fnum|40500}} || 10.8% || 0
|-
| 73 || 788.4% || {{fnum|40500}} || 10.8% || 0
|-
| 74 || 799.2% || {{fnum|40500}} || 10.8% || 0
|-
| 75 || 810.0% || {{fnum|40500}} || 10.8% || 0
|-
| 76 || 820.8% || {{fnum|40500}} || 10.8% || 0
|-
| 77 || 831.6% || {{fnum|40500}} || 10.8% || 0
|-
| 78 || 842.4% || {{fnum|40500}} || 10.8% || 0
|-
| 79 || 853.2% || {{fnum|40500}} || 10.8% || 0
|-
| 80 || 864.0% || {{fnum|40500}} || 10.8% || 0
|-
| 81 || 874.8% || {{fnum|40500}} || 10.8% || 0
|-
| 82 || 885.6% || {{fnum|40500}} || 10.8% || 0
|-
| 83 || 896.4% || {{fnum|40500}} || 10.8% || 0
|-
| 84 || 907.2% || {{fnum|40500}} || 10.8% || 0
|-
| 85 || 918.0% || {{fnum|40500}} || 10.8% || 0
|-
| 86 || 928.8% || {{fnum|40500}} || 10.8% || 0
|-
| 87 || 939.6% || {{fnum|40500}} || 10.8% || 0
|-
| 88 || 950.4% || {{fnum|40500}} || 10.8% || 0
|-
| 89 || 961.2% || {{fnum|40500}} || 10.8% || 0
|-
| 90 || 972.0% || {{fnum|40500}} || 10.8% || 0
|-
| 91 || 982.8% || {{fnum|40500}} || 10.8% || 0
|-
| 92 || 993.6% || {{fnum|40500}} || 10.8% || 0
|}
[[Category:Attributes]]
acf936b03bf018cd91d4c8f8790137535cf71c2d
Attributes
0
712
1090
2025-07-22T13:19:55Z
Sharparam
284703
Link to level
wikitext
text/x-wiki
'''{{PAGENAME}}''' determine the player's [[stats]].
== Overview ==
Each time the player [[Level|levels up]], they get two points to spend on one of the four attributes.
== Strength ==
{{main|Strength}}
== Agility ==
{{main|Agility}}
== Intelligence ==
{{main|Intelligence}}
== Constitution ==
{{main|Constitution}}
[[Category:Attributes]]
9e68b22348fa67fdf1237f31b0043c8996b44821
Blok 6174
0
741
1142
2025-07-23T00:15:54Z
Sharparam
284703
Redirected page to [[Blok 6147]]
wikitext
text/x-wiki
#REDIRECT [[Blok 6147]]
3ee370bab2292ee469f53ad5d06af212bbb3db85
Template:Infobox/Item
10
417
596
2025-07-23T00:44:01Z
Sharparam
284703
Use alternative method for description
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind=item
| sep=,
| image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections=DescriptionSection
| DescriptionSection=Description
| DescriptionSection_label=Description
| Description_nolabel=yes
}}{{#if:{{NAMESPACE}}||[[Category:Items]]}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]</noinclude>
5d4929aef36fffdaea5150152baf68fb562131a0
Silicon Visage
0
543
846
2025-07-23T00:59:56Z
Sharparam
284703
Created page with "{{Infobox/Boss | image = Silicon Visage.png | SharpResist = 15 | BluntResist = 16 | TechnomancyResist = 55 }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}. == Location == {{coords|9307|2902|1628}} (approximate) Located in [[Upper Blocks]]. == Drops == * [[Upgrade Module]] * [[Unstable Perk Essence]] {{Navbox/Bosses}}"
wikitext
text/x-wiki
{{Infobox/Boss
| image = Silicon Visage.png
| SharpResist = 15
| BluntResist = 16
| TechnomancyResist = 55
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}.
== Location ==
{{coords|9307|2902|1628}} (approximate)
Located in [[Upper Blocks]].
== Drops ==
* [[Upgrade Module]]
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
773d7fa0e470181a1ad1ada63a49044d0679caf7
Homunculus Mirage
0
423
608
2025-07-23T01:18:18Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
{{Infobox/Item
| tabs=Normal,Husk
| Normal_title = Homunculus Mirage
| Husk_title = Humunculus Mirage Husk
| images = [[File:Homunculus Mirage.png|300px]],[[File:Homunculus Mirage Husk.png|300px]]
| Normal_Description = The Homunculus triggers its ability only when your vital signs have ceased – reassembling your body on a molecular level elsewhere while keeping your consciousness intact, allowing for seamless and instantaneous relocation.
| Husk_Description = The husk of the Homunculus stores your current state and consciousness. Return at the Homunculus to combine the two again, allowing you to place the Homunculus elsewhere.
}}
{{Navbox/Items}}
[[Category:Essential items]]
8fb75994fa6cda97b1ebe8cfd760652188977f94
Inhabitants
0
381
524
2025-07-23T01:23:54Z
Sharparam
284703
Created page with "{{stub}} {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slo..."
wikitext
text/x-wiki
{{stub}}
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}.
== Overview ==
{{Quote
|The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force.
}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
1fac3c562d846adb7b3b2e5ab3eb4d386c14b532
Upgrade Module
0
425
612
2025-07-23T04:05:28Z
Sharparam
284703
Created page with "{{Infobox/Item | title = {{PAGENAME}} | image = Upgrade Module.png | Description = A rare artifact used in the process of upgrading gear. }} '''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5. {{Navbox/Items}} [[Category:Essential items]] [[Category:Upgrade items]]"
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Upgrade Module.png
| Description = A rare artifact used in the process of upgrading gear.
}}
'''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5.
{{Navbox/Items}}
[[Category:Essential items]]
[[Category:Upgrade items]]
f405ef0912d49ef39a269fb10d08d14c1e5322bb
Upgrade Splinter
0
432
626
2025-07-23T04:08:00Z
Sharparam
284703
wikitext
text/x-wiki
'''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3.
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}}
|}
{{Navbox/Items}}
[[Category:Upgrade items]]
b5014301a8a656873f94d981f8cd2ac3b7f1bbb7
Serpentine Visions
0
382
526
2025-07-23T04:47:01Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Among the towering spires of the city, there are whispers of a colossal sky serpent that drifts silently through the steel and concrete canyons. Though the serpent is said to be harmless, its sheer size and graceful, serpentine movements evoke both awe and trepidation. With scales that shimmer in hues matching the city's metallic sheen, the serpent weaves effortle..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Among the towering spires of the city, there are whispers of a colossal sky serpent that drifts silently through the steel and concrete canyons. Though the serpent is said to be harmless, its sheer size and graceful, serpentine movements evoke both awe and trepidation. With scales that shimmer in hues matching the city's metallic sheen, the serpent weaves effortlessly through the narrow gaps between the tower, its long, undulating body casting an imposing shadow over the pristine surfaces below. its presence, though non-threatening, is a constant reminder of the vastness and wildness that still lingers even in this meticulously engineered urban landscape. The serpent's slow, deliberate light adds a touch of majesty and enigma to the stark cityscape, making its silent passage through the towering structures a mesmerizing spectacle that commands both reverence and respect.
}}
== Location ==
{{coords|9922|-6769|1440}}
Found in [[Uranopolis]] on a ledge on one of the platforms reached by navigating the bridges. Use [[Scanner|the scanner]] to find it more easily.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
e002a14503e5a3d60e77f6a2a8484fc1381a05d3
Amulet of Arcane Protection
0
516
795
2025-07-23T05:23:22Z
Sharparam
284703
Created page with "{{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Arcane Protection.png | Passives = [[Techno-Defiance]] | Effect1 = +1500 [[Technomancy]] armor rating. }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|4158|-2902|1459}} Found near the top side of a shortcut ladder in [[Uranopolis]]. {{Navbox/Amulets}}"
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Amulet of Arcane Protection.png
| Passives = [[Techno-Defiance]]
| Effect1 = +1500 [[Technomancy]] armor rating.
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
== Location ==
{{coords|4158|-2902|1459}}
Found near the top side of a shortcut ladder in [[Uranopolis]].
{{Navbox/Amulets}}
18efef3d358787360eb91c39568ddbe8822cdf47
Amulets
0
444
653
2025-07-23T05:24:10Z
Sharparam
284703
Created page with "{{Navbox/Amulets}}"
wikitext
text/x-wiki
{{Navbox/Amulets}}
c49a050c320d9cc83e8ac20203557bb1adb26913
Template:Navbox/Rings
10
292
371
370
2025-07-23T05:38:00Z
Sharparam
284703
Add [[Ring of Casting Speed]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
* [[Ring of Casting Speed]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
22577f5f9b1a9c7ae8bcc3b8f4ebca96fa12d371
372
371
2025-07-23T11:32:02Z
Sharparam
284703
Add [[Ring of Rammstein]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
* [[Ring of Casting Speed]]
* [[Ring of Rammstein]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
1ca9d6b8b77cbd2e141c78a56821fba79d958916
Ring of Casting Speed
0
520
803
2025-07-23T05:40:02Z
Sharparam
284703
Add note on acquisition
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Casting Speed.png
| Effect1 = -10% attack power.
| Effect2 = +20% technocasting speed.
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Acquisition ==
Drops from a giant enemy in [[Uranopolis]], around {{coords|-1151|-4475|1453}}.
{{Navbox/Rings}}
46f3eb13e5516b422e23a89fb5ec0e0a924ed783
Shifting Sands
0
383
528
2025-07-23T06:07:44Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |There are unsettling rumors about a colossal worm with wings made of bones, said to inhabit a hidden realm. This serpentine creature is described as having a face that resembles a person frozen in a dream, an eerie visage that defies understanding. The worm is said to speak and whisper to anyone who dares enter its domain—or even to those who merely think about..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|There are unsettling rumors about a colossal worm with wings made of bones, said to inhabit a hidden realm. This serpentine creature is described as having a face that resembles a person frozen in a dream, an eerie visage that defies understanding. The worm is said to speak and whisper to anyone who dares enter its domain—or even to those who merely think about it. Its nature alludes to something of maker origin. Something capable of changing the structure.
}}
== Location ==
{{coords|-9400|7378|-1350}}
Found in [[Desert|the Desert]], near the big enemy with red eyes after crossing the bridge past the [[Homunculus]]. It is in front of a set of doors.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
b48a873694f25c03f22938908578b61c6b9c4912
Call of the Void
0
384
530
2025-07-23T09:40:14Z
Sharparam
284703
Add missing location info
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|The giant staircase looms before me, its sheer expanse a vertiginous marvel that seems to stretch endlessly downward into the void. Each step is a monstrous slab of cold, unfeeling metal, worn smooth by countless unknown feet. As I descend, the sense of vertigo intensifies, and the emptiness below grows ever more profound. The abyss at the base of the staircase seems to call out with an irresistible allure, a dark, seductive whisper that tugs at the edges of my mind. The staircase feels alive with this haunting invitation, a siren song of emptiness that beckons irresistibly into the darkness below.
}}
== Location ==
{{coords|1132|-8482|1965}}
Found in [[Ghost Town#Floor 13|Ghost Town (Floor 13)]]. Starting from the [[Homunculus]], head down the stairs. Head up the stairs behind the crying enemy at the bottom and the data log will be at the end of the walkway. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
6926f68eafdb547e25880491f97dcb505ad73b95
Amulet of Evasion
0
517
797
2025-07-23T10:01:14Z
Sharparam
284703
Created page with "{{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Evasion.png | Passives = [[Extended Evasion]] }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|1251|-8419|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right..."
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Amulet of Evasion.png
| Passives = [[Extended Evasion]]
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
== Location ==
{{coords|1251|-8419|551}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right, behind a building.
{{Navbox/Amulets}}
9e21e16f6b5f152489ca325ce8295f57ce37b702
Umbral City
0
385
532
2025-07-23T10:20:41Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |I stumbled through the mist-shrouded sector of the city, disoriented and weary, an unsettling chill gripped me. The residential area ahead was cloaked in an eerie, ghastly haze. Every step felt heavier, as if the very air was laden with the weight of forgotten despair. I descended further into the sector, my path leading me to a graveyard that lay at the bottom, s..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|I stumbled through the mist-shrouded sector of the city, disoriented and weary, an unsettling chill gripped me. The residential area ahead was cloaked in an eerie, ghastly haze. Every step felt heavier, as if the very air was laden with the weight of forgotten despair. I descended further into the sector, my path leading me to a graveyard that lay at the bottom, shrouded in the same pervasive mist. The gravestones, ancient and crumbling, stood like mournful sentinels in the ghostly fog. I could feel a strange, unsettling energy emanating from the ground, a spectral force that seemed to pulse through the halls around me. The sorrow and loss from the graveyard seeped into the very walls of this place, wrapping me in a shroud of grief. The haunting resonance of the graveyard's energy made every breath feel heavy, and the oppressive atmosphere left me with an unshakable sense of inescapable sorrow, as if the very essence of this forsaken place was reaching out to ensnare me.
}}
== Location ==
{{coords|1109|-9166|-1494}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], go through the doorway and take the right path, going down the stairs and following the corridors until you arrive at the subway. Go to the right and get to the end to find the data log in the corner. Use [[Scanner|the scanner]] to more easily find it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
f48b4c78d4059ac73cd01b56ac5efdc5e95bd143
Intercepted Transmission
0
386
534
2025-07-23T10:27:43Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |You won't get to see the fruits of your sacrifice, and only you will ever know the pain of your solitude. I'm sorry. I'll never forget you. }} == Location == {{coords|1908|-1765|-806}} In [[Blok 6147]]. After exiting the [[subway]], take that path that leads up and then walk down the stairs to find the data log in a corner. Use [[Scanner|the scanner]] to find it..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|You won't get to see the fruits of your sacrifice, and only you will ever know the pain of your solitude. I'm sorry. I'll never forget you.
}}
== Location ==
{{coords|1908|-1765|-806}}
In [[Blok 6147]]. After exiting the [[subway]], take that path that leads up and then walk down the stairs to find the data log in a corner. Use [[Scanner|the scanner]] to find it more easily.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
f7a214fac38ad015fc367e76f78b3c313073255d
Spiked Shield
0
750
1160
2025-07-23T10:38:31Z
Sharparam
284703
Created page with "{{Infobox/Shield | title = {{PAGENAME}} | image = Spiked Shield.png | Weight = Heavy | Passives = [[Spikes]] | Mk0_Sharp = 48.6 | Mk0_Blunt = 54.6 | Mk0_Technomancy = 49.8 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Acquisition == Dropped by [[Plagued Warden]]. {{Navbox/Shields}}"
wikitext
text/x-wiki
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Spiked Shield.png
| Weight = Heavy
| Passives = [[Spikes]]
| Mk0_Sharp = 48.6
| Mk0_Blunt = 54.6
| Mk0_Technomancy = 49.8
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== Acquisition ==
Dropped by [[Plagued Warden]].
{{Navbox/Shields}}
35d72a537a85e4efbf9cffb04c27d03f7ce129cf
Level
0
707
1080
2025-07-23T10:52:24Z
Sharparam
284703
Add more level data
wikitext
text/x-wiki
{{stub}}
'''{{PAGENAME}}''' is a measure of a player's experience.
== Overview ==
The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects.
The amount of experience points required to reach further levels will regularly increase, although not with every level.
Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2.
The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]].
{| class="wikitable sticky-header hover-highlight" style="text-align: right;"
|-
! scope="col" | Level
! scope="col" | EXP to next
! scope="col" | Cost increase
! scope="col" | Total EXP
|-
| 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}}
|-
| 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}}
|-
| 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}}
|-
| 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}}
|-
| 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}}
|-
| 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}}
|-
| 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}}
|-
| 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}}
|-
| 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}}
|-
| 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}}
|-
| 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}}
|-
| 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}}
|-
| 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}}
|-
| 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}}
|-
| 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}}
|-
| 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}}
|-
| 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}}
|-
| 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}}
|-
| 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}}
|-
| 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}}
|-
| 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}}
|-
| 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}}
|-
| 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}}
|-
| 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}}
|-
| 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}}
|-
| 25 || ??? || ??? || {{fnum|430950}}
|}
[[Category:Game mechanics]]
2d60aff79f3c19820de1c03f6ed887e247b40df6
Techpriest Helmet
0
491
746
2025-07-23T11:12:30Z
Sharparam
284703
Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Techpriest Helmet.png | Type = Helmet | Weight = Light | Passives = [[Minor Flux Regen]] | Mk5_Sharp = 722 | Mk5_Blunt = 722 | Mk5_Technomancy = 928 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1272|-8495|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the s..."
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Techpriest Helmet.png
| Type = Helmet
| Weight = Light
| Passives = [[Minor Flux Regen]]
| Mk5_Sharp = 722
| Mk5_Blunt = 722
| Mk5_Technomancy = 928
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|1272|-8495|551}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the stairs and take a narrow path on the right leading to a small area behind a building with the helmet in a corner.
{{Navbox/Armor}}
a7a7b23c199012fb916ce23130908fb2796a023c
Tech Shield
0
752
1164
2025-07-23T11:29:29Z
Sharparam
284703
Created page with "{{Infobox/Shield | title = {{PAGENAME}} | image = Tech Shield.png | Weight = Heavy | Abilities = [[Refraction]] | Mk2_Sharp = 42.7 | Mk2_Blunt = 47.6 | Mk2_Technomancy = 70 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{coords|1327|-9333|1892}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After reaching the outdoors area, head up the stairs and..."
wikitext
text/x-wiki
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Tech Shield.png
| Weight = Heavy
| Abilities = [[Refraction]]
| Mk2_Sharp = 42.7
| Mk2_Blunt = 47.6
| Mk2_Technomancy = 70
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== Location ==
{{coords|1327|-9333|1892}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After reaching the outdoors area, head up the stairs and take the left path. At the end is a cliff, climb it by standing near it and repeatedly tapping the jump button. Once on top of the cliff, go to the right and you'll see the corpse with the item against a cliff wall.
On the same corpse can also be found the [[Ring of Rammstein]].
{{Navbox/Shields}}
1e64b4aa14aac12ca5c32867c37f664acb36dedf
Ring of Rammstein
0
521
805
2025-07-23T11:31:46Z
Sharparam
284703
Created page with "{{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Rammstein.png | Passives = [[Momentum Strike]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{main|Tech Shield#Location}} This item is located on the same corpse as the [[Tech Shield]]. {{Navbox/Rings}}"
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Rammstein.png
| Passives = [[Momentum Strike]]
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Location ==
{{main|Tech Shield#Location}}
This item is located on the same corpse as the [[Tech Shield]].
{{Navbox/Rings}}
1bf2ae52125b19a63277c4ea076e1cf3f2107e6e
Ability Splinter
0
430
622
2025-07-23T11:39:08Z
Sharparam
284703
Add another splinter in ghost town floor 1
wikitext
text/x-wiki
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. It is used to equip and change [[abilities]].
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Deluge]] || Found near the [[Paladin Mace]]. Facing where the mace is, head left and slightly behind and look behind the large pillar to find the item. || {{coords|-4581|-7721|5575}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and keep right until you get to the room with a staircase going down. Before heading down the staircase, walk around it on its right and check the corner to find the item. || {{coords|1120|-7590|161}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the second right to get to the edge of the cliff with a bunch of graves. The item can be found near one of the graves. || {{coords|1321|-8034|190}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the left path to a cliff. Climb the cliff by repeatedly tapping the jump button. Once at the top, take the path leading down and follow it past a group of buildings (where the [[Soul Reaper]] can be found). Past the buildings are a set of graves with the item on top of one of them.
|}
{{Navbox/Items}}
[[Category:Essential items]]
7b6f4fe171581f79b13cd24ed99204aef452dab4
Deserts Respirator Helmet
0
492
748
2025-07-23T12:55:56Z
Sharparam
284703
Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Deserts Respirator Helmet.png | Type = helmet | Weight = Medium | Mk2_Sharp = 545 | Mk2_Blunt = 633 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1367|6630|-1395}} Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]]. {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Deserts Respirator Helmet.png
| Type = helmet
| Weight = Medium
| Mk2_Sharp = 545
| Mk2_Blunt = 633
| Mk2_Technomancy = 336
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|1367|6630|-1395}}
Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]].
{{Navbox/Armor}}
85a4c5a22cdde742f764acd2e76c15d11d03503d
Desert Dream
0
387
536
2025-07-23T13:07:11Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |According to the readings, this gateway offers a glimpse into a reality untouched by the distortions and chaos of [[The Anomaly|the anomaly]], a place where time and space unfolded in a different manner, free from the relentless upheaval that defines this place. The sand serpent's presence must be related. }} == Location == {{coords|1471|6344|-1395}} Found in th..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|According to the readings, this gateway offers a glimpse into a reality untouched by the distortions and chaos of [[The Anomaly|the anomaly]], a place where time and space unfolded in a different manner, free from the relentless upheaval that defines this place. The sand serpent's presence must be related.
}}
== Location ==
{{coords|1471|6344|-1395}}
Found in the [[Desert]]. It's located in front of the teleportation orb that leads to [[Desert Mirage]].
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
fb7777879af3c3d248160f4349e8cabe96b0e304
Template:Navbox/Rings
10
292
373
372
2025-07-23T14:04:35Z
Sharparam
284703
Add [[Ring of Exceeding Talent]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
* [[Ring of Casting Speed]]
* [[Ring of Exceeding Talent]]
* [[Ring of Rammstein]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
41ad293567046b38a2ccf209a3fa705c5e4a8431
374
373
2025-07-23T14:07:38Z
Sharparam
284703
Add more rings
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
* [[Ring of Casting Speed]]
* [[Ring of Rammstein]]
* [[Ring of Lesser Talent]]
* [[Ring of Talent]]
* [[Ring of Exceeding Talent]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
370f3235addc2ae182daa771a1fe2c1179b6433f
Ring of Exceeding Talent
0
522
807
2025-07-23T14:07:05Z
Sharparam
284703
Add notes on other ring versions
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Exceeding Talent.png
| Effect1 = +3 [[Strength]]
| Effect2 = +3 [[Agility]]
| Effect3 = +3 [[Constitution]]
| Effect4 = +3 [[Intelligence]]
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Location ==
{{coords|3720|1159|-1397}}
Located in the [[Desert]] on a toppled pillar in the area with Yaroslav's crew (same location as the [[Handler Echo]]).
== See also ==
* [[Ring of Lesser Talent]] – The weakest version of this ring.
* [[Ring of Talent]] – A weaker version of this ring.
{{Navbox/Rings}}
bcbe61aaf34441d0c94fadf4e2d02dbe42c66205
Saracen Shield
0
749
1158
2025-07-23T14:10:02Z
Sharparam
284703
Created page with "{{Infobox/Shield | title = {{PAGENAME}} | image = Saracen Shield.png | Weight = Heavy | Abilities = [[Regal Radiance]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 57.4 | Mk2_Technomancy = 69.3 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{cords|3760|1142|-1395}} Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield. {{Navbox/Shields}}"
wikitext
text/x-wiki
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Saracen Shield.png
| Weight = Heavy
| Abilities = [[Regal Radiance]]
| Mk2_Sharp = 59.5
| Mk2_Blunt = 57.4
| Mk2_Technomancy = 69.3
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== Location ==
{{cords|3760|1142|-1395}}
Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield.
{{Navbox/Shields}}
59fda45f4bdf41eba1f4a2bcf8c2764d16851685
Template:Navbox/Shields
10
440
640
2025-07-23T14:10:17Z
Sharparam
284703
Add [[Saracen Shield]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Shields
| title = [[Shields]]
| list1 =
* [[Flat Shield]]
* [[Kite Shield]]
* [[Military Shield]]
* [[Saracen Shield]]
* [[Spiked Shield]]
* [[Tall Military Shield]]
* [[Tech Shield]]
* [[Wooden Shield]]
}}
86b51292309060d7ff355bad7dc03a02f84ab69b
Wormlord
0
547
854
2025-07-23T15:10:54Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Wormlord.png
}}
'''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Overview ==
Defeating Wormlord is required to be able to access [[The Anomaly]].
== Location ==
{{coords|2550|-4122|-1198}} (approximate)
Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
aedb9551379ee1f1febb972b361a1b8ee9e1c3fd
Plagued Revenant
0
546
852
2025-07-23T15:49:07Z
Sharparam
284703
Add drops
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Plagued Revenant.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}.
== Location ==
{{coords|1432|-8866|199}} (approximate)
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After getting to the outdoors area, keep going straight until you get to the end, take a right and then left to get down to a cliff area. Go left and you'll see a mausoleum inside the cliff on the left with some graves in front of it. In front of the doors of this mausoleum is a helmet ({{coords|1409|-8884|190}}). Interacting with the helmet to attempt to take it will spawn the boss behind you.
== Drops ==
* [[Anastasia]]
* [[Plagued Revenant Helmet]]
== Trivia ==
* When dying to this boss, crying can be heard during the loading screen. This could either be intentional or a result of the nearby crying enemy respawning.
{{Navbox/Bosses}}
698530510328c2e5031366f6586a3eb9494a65e4
Plagued Revenant Helmet
0
493
750
2025-07-23T15:54:24Z
Sharparam
284703
Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Plagued Revenant Helmet.png | Type = Helmet | Weight = Medium | Mk5_Sharp = 883 | Mk5_Blunt = 1024 | Mk5_Technomancy = 540 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Plagued Revenant]]. {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Plagued Revenant Helmet.png
| Type = Helmet
| Weight = Medium
| Mk5_Sharp = 883
| Mk5_Blunt = 1024
| Mk5_Technomancy = 540
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Acquisition ==
Drops from [[Plagued Revenant]].
{{Navbox/Armor}}
dcf20306f52ebb49a60617476143ab6a73580f6b
Template:Navbox/Data logs
10
290
358
357
2025-07-23T16:10:07Z
Sharparam
284703
Add [[Heartbeat]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
3c6a050fdfdb7b63e99e373283ffefe800945ed9
359
358
2025-07-23T21:55:30Z
Sharparam
284703
Add [[Silent Streets]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Manta Rays]]
* [[The Structure]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
d07fb4d47edebed387a1692c9bb48a34db0f5a42
360
359
2025-07-23T22:03:53Z
Sharparam
284703
Add [[Statues]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[The Structure]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
4958d07a84a6bc62127f9a55e125eac5fdc500dd
361
360
2025-07-23T23:25:11Z
Sharparam
284703
Add more data logs
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[The Structure]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
a51dfbf017a3f2bb41892278e10183b069414667
Heartbeat
0
388
538
2025-07-23T16:14:07Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat feels like as word repeated until it loses meaning. Nothing endures here.
}}
== Location ==
{{coords|3326|-6471|-6573}}
Found in the [[Monastery#Lower|Monastery (Lower)]]. Starting at the [[Homunculus]], go forward until the end of the roof where the first enemy is, then take the left path that goes down several stairs. Continue into the hallway at the bottom and take a left, then go up the elevator. Go straight and you'll come to a platform with a staircase going up to the right. The data log is right before the staircase. Use [[Scanner|the scanner]] to more easily find it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data log]]
e6a4f885a6f4e9bd91ce07da3168957b45e7a308
Perk Essence
0
424
610
2025-07-23T16:34:38Z
Sharparam
284703
wikitext
text/x-wiki
{{Infobox/Item
| tabs = Stable,Unstable
| images = [[File:Perk Essence.png|300px]],[[File:Unstable Perk Essence.png|300px]]
| Stable_title = Perk Essence
| Unstable_title = Unstable Perk Essence
| Stable_Description = An artifact used in the process of embedding perks.
| Unstable_Description = Get to a checkpoint to turn it into a perk, on death goes back to it's [sic] original location.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] used to acquire [[perks]] or perk upgrades.
== Acquisition ==
The unstable variant drops from some [[bosses]] (excluding mini-bosses), bringing it to a [[homunculus]] without dying stabilises it. It has to be brought to a normal homunculus, not one spawned by the [[Homunculus Mirage]].
Dying on the way to a homunculus while the item is still in its unstable form will respawn it in the boss's arena, forcing the player to go back and pick it up again.
{{Navbox/Items}}
[[Category:Essential items]]
e1971e413ec50fbb2dc150383cacbe574eece1c5
Librarian Hood
0
494
752
2025-07-23T16:42:03Z
Sharparam
284703
Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Librarian Hood.png | Type = Helmet | Weight = Light | Set = Librarian | Mk1_Sharp = 371 | Mk1_Blunt = 371 | Mk1_Technomancy = 469 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Librarian (enemy)|librarian]] enemies. {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Librarian Hood.png
| Type = Helmet
| Weight = Light
| Set = Librarian
| Mk1_Sharp = 371
| Mk1_Blunt = 371
| Mk1_Technomancy = 469
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Acquisition ==
Drops from [[Librarian (enemy)|librarian]] enemies.
{{Navbox/Armor}}
524d688d52e40e59b69ca9f6a46e4f593a6fcdab
Librarian (armor set)
0
487
738
2025-07-23T16:43:16Z
Sharparam
284703
Fix names
wikitext
text/x-wiki
{{Infobox/Armor set
| image = Librarian.png
| title = Librarian
| Weight = Light
| Helmet = Librarian Hood
| Pauldrons = <!-- Librarian ??? -->
| Chestguard = Librarian Overcoat
| Legguard = Librarian Trousers
| Gauntlets = <!-- Librarian ??? -->
}}
'''Librarian''' is an [[armor set]] in {{BFF}}.
== Pieces ==
* [[Librarian Hood]]
<!-- * [[Librarian ???]] -->
* [[Librarian Overcoat]]
* [[Librarian Trousers]]
<!-- * [[Librarian ???]] -->
{{Navbox/Armor}}
ad355bf6137087d645f4fbb2ac96e384f57db8a8
Librarian
0
745
1150
2025-07-23T16:51:24Z
Sharparam
284703
Created page with "'''Librarian''' may refer to: == Common meanings == * [[Librarian (armor set)]], a light armor set * [[Librarian (enemy)]], the enemy in the [[Monastery]] == See also == * [[Librarian Hood]] * [[Librarian Overcoat]] * [[Librarian Trousers]] {{Disambiguation}}"
wikitext
text/x-wiki
'''Librarian''' may refer to:
== Common meanings ==
* [[Librarian (armor set)]], a light armor set
* [[Librarian (enemy)]], the enemy in the [[Monastery]]
== See also ==
* [[Librarian Hood]]
* [[Librarian Overcoat]]
* [[Librarian Trousers]]
{{Disambiguation}}
c7eb5b123cb7063d1af9038ba92b3013df3b5b50
Katanas
0
475
714
2025-07-23T21:02:24Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Katanas.png
| Type = Dual Wield
| Speed = Fast
| Damage type = Sharp
| Abilities = Blade Dash, Whirlwind Strike
| Mk3_Damage_min = 117
| Mk3_Damage_max = 130
| Mk4_Damage_min = 165
| Mk4_Damage_max = 183
| Mk5_Damage_min = 235
| Mk5_Damage_max = 261
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
Available as a drop from [[enemies]] in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]].
{{Navbox/Weapons}}
4ab46d81614502ef87bbdcd436c9621993e809bd
Anastasia
0
501
766
2025-07-23T21:03:19Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Anastasia.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Reanimate Dead, Silencing Reap
| Mk3_Damage_min = 364
| Mk3_Damage_max = 408
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Acquisition ==
Drops from [[Plagued Revenant]].
{{Navbox/Weapons}}
999c96e5d8b0e959b4174e16951f4d2f08e6598c
Arcane Bow
0
509
782
2025-07-23T21:11:05Z
Sharparam
284703
Fix template call (via JWB)
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Arcane Bow.png
| Type = Ranged
| Damage type = Sharp
| Speed = Fast
| Passives = Vermillion Judgment
| Abilities = Arrow Twister
| Mk2_Damage_min = 184
| Mk2_Damage_max = 197
| Mk3_Damage_min = 251
| Mk3_Damage_max = 267
| Mk4_Damage_min = 292
| Mk4_Damage_max = 312
| Mk5_Damage_min = 334
| Mk5_Damage_max = 356
}}
'''{{PAGENAME}}''' is a [[Bows|bow]] in {{BFF}}.
== Location ==
{{coords|1261|-8400|1563}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head into the path on the right before the big stairs. Take the ladder at the end getting up onto a building, and then the next one. The item will be in the corner of the roof on a corpse.
{{Navbox/Weapons}}
9ed7d6da9990d1b86ae941adf6cc8ea5f6b173fb
Blades of Atropos
0
480
724
2025-07-23T21:11:13Z
Sharparam
284703
Fix template call (via JWB)
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Blades of Atropos.png
| Type = Dual Wield
| Damage type = Sharp
| Speed = Fast
| Passives = Bloodthirst
| Abilities = Phase
| Mk0_Damage_min = 131
| Mk0_Damage_max = 145
| Mk1_Damage_min = 147
| Mk1_Damage_max = 164
| Mk2_Damage_min = 164
| Mk2_Damage_max = 182
| Mk3_Damage_min = 197
| Mk3_Damage_max = 218
| Mk4_Damage_min = 229
| Mk4_Damage_max = 255
| Mk5_Damage_min = 262
| Mk5_Damage_max = 291
}}
'''{{PAGENAME}}''' are a [[Dual Wields|dual wield]] weapon in {{BFF}}.
== Location ==
{{coords|2778|-6115|-1198}}
Found in [[Desert Mirage]]. Just down the stairs from the [[Homunculus]].
{{Navbox/Weapons}}
52da0a005c0bcb26cb17a6ee2da89b32c687e4ea
Paladin Mace
0
497
758
2025-07-23T21:11:38Z
Sharparam
284703
Fix template call (via JWB)
wikitext
text/x-wiki
{{Infobox/Weapon
| image = Paladin Mace.png
| title = {{PAGENAME}}
| Type = one-handed
| Damage type = Blunt
| Speed = Fast
| Abilities = Divine Blessing
| Mk0_Damage_min = 76
| Mk0_Damage_max = 83
| Mk1_Damage_min = 85
| Mk1_Damage_max = 93
| Mk2_Damage_min = 95
| Mk2_Damage_max = 104
}}
'''{{PAGENAME}}''' is a [[One-handed weapons|one-handed]] [[Weapons|weapon]] that can be found in {{BFF}}.
== Location ==
{{coords|-4879|-7530|5578}}
In [[Deluge|the Deluge]]. Located in a square hole in the wall inside the first rectangular structure with pillars after crossing a bridge. The [[Items|item]] can be seen straight ahead when crossing the bridge.
{{Navbox/Weapons}}
9ae9ef12f0012f7ee76e8b19eb462a731a31721f
Scimitar
0
498
760
2025-07-23T21:11:43Z
Sharparam
284703
Fix template call (via JWB)
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Scimitar.png
| Type = One-handed
| Damage type = Sharp
| Speed = Swift
| Abilities = Whiplash
| Mk2_Damage_min = 150
| Mk2_Damage_max = 163
}}
'''{{PAGENAME}}''' is a [[One-handed weapons|one-handed weapon]] in {{BFF}}.
== Location ==
{{coords|1713|7517|-1413}}
Located inside a building in the [[Desert]], after getting down on the bottom.
{{Navbox/Weapons}}
7da5444707df0750219ed6dda415a75ee3b04a8e
Asklepios
0
506
776
2025-07-23T21:13:46Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Asklepios.png
| Type = Staff
| Damage type = Technomancy
| Speed = Slow
| Abilities = Mending Light, Second Breath
| Mk3_Damage_min = 117
| Mk3_Damage_max = 120
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}.
== Acquisition ==
Dropped by big floating knights with blue lightsabers in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]].
{{Navbox/Weapons}}
19d3bc07174d18e309f111ea29df123b354aac8e
Crescent Axe
0
502
768
2025-07-23T21:14:14Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Crescent Axe.png
| Type = two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Expose Armor, Crescent Slash
| Mk2_Damage_min = 251
| Mk2_Damage_max = 271
}}
== Location ==
{{coords|-3932|1535|1532}}
Located in the room with [[The Banshee]] [[Data logs|data log]].
6ae8e711635fe9f28bf31f5f61c2b8a34e8e0452
Khopeshs
0
479
722
2025-07-23T21:14:57Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Khopeshs.png
| Type = Dual Wield
| Damage type = Sharp
| Speed = Fast
| Abilities = Dual Brutality, Bladestorm
| Mk0_Damage_min = 92
| Mk0_Damage_max = 102
| Mk1_Damage_min = 104
| Mk1_Damage_max = 115
| Mk2_Damage_min = 115
| Mk2_Damage_max = 128
| Mk3_Damage_min = 139
| Mk3_Damage_max = 154
}}
'''{{PAGENAME}}''' are a type of [[Dual Wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
Dropped by [[Plagued Nemesis]].
{{Navbox/Weapons}}
c8f5f702bd2d22af0adff4ad34825ffb25021210
Lacerators
0
477
718
2025-07-23T21:15:17Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Lacerators.png
| Type = Dual Wield
| Speed = Fast
| Damage type = Sharp
| Passives = Lacerate, Lifesteal
| Mk2_Damage_min = 97
| Mk2_Damage_max = 108
| Mk5_Damage_min = 235
| Mk5_Damage_max = 261
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
{{Navbox/Weapons}}
b1946670af3fe4f2bd09c0dfc86872b327a200a9
Nodachi
0
499
762
2025-07-23T21:15:34Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Nodachi.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Whirlwind, Tornado
| Mk3_Damage_min = 315
| Mk3_Damage_max = 344
| Mk4_Damage_min = 368
| Mk4_Damage_max = 402
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Acquisition ==
Dropped by [[Nurgei the Blademaster]].
{{Navbox/Weapons}}
86417f91f727b87f778da76948fb454da2e92744
Royal Claymore
0
503
770
2025-07-23T21:15:53Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Royal Claymore.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Claymore Swing, Sword Strike
| Mk3_Damage_min = 315
| Mk3_Damage_max = 344
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Location ==
{{coords|-9938|7939|-1340}}
Found in [[Desert|the Desert]]. Starting where the [[Shifting Sands]] data log can be found, climb up the stairs on either side and walk through the arch. The item can be seen across a gap. Do a jump while sprinting to cross the gap and reach the item.
{{Navbox/Weapons}}
d8f571fe32e600c12e02d6d3d5e06dac9e5df229
Soul Reaper
0
500
764
2025-07-23T21:16:16Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Soul Reaper.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Reap, Soul Storm
| Mk3_Damage_min = 322
| Mk3_Damage_max = 361
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Location ==
{{coords|1413|-9293|190}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. When reaching the outdoors area, head up the stairs and go left. Climb up the cliff by repeatedly tapping the jump button. Once at the top, head forward and follow the path that leads downwards. Eventually you will reach a group of buildings. In front of one of these is the weapon.
{{Navbox/Weapons}}
950b71e0fc9d4dbdefdb52a2c58ee43849dd7600
Twinblade
0
505
774
2025-07-23T21:16:32Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Twinblade.png
| Type = Twinblade
| Damage type = Sharp
| Speed = Swift
| Abilities = Blade Dance, Blade Flurry
| Mk3_Damage_min = 75
| Mk3_Damage_max = 78
}}
'''{{PAGENAME}}''' is a [[Twinblades|twinblade]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
Drops from [[enemies]] using the twinblade weapon.
{{Navbox/Weapons}}
f75786b2c8e5d234ef871b2f5c2e32b4924b1b6a
Greater Anomalous Crystal
0
420
602
2025-07-23T21:45:55Z
Sharparam
284703
Add Blok 6147 location and improve table
wikitext
text/x-wiki
'''{{PAGENAME}}''' is an [[Items|item]] found in {{BFF}}. It can be embedded into [[weapons]] or [[armor]] to improve their properties.
== Variants ==
There are several different variants of the crystal that all share the same name in-game, differing only by their visual appearance and the effects they give when embedded into [[equipment]].
They have received ad-hoc names on the wiki temporarily to be able to differentiate them. The names are assigned based on the item's appearance.
=== "Purple jagged" ===
* '''Effect in [[armor]]:''' +25 max [[flux]] points.
* '''Effect in [[weapons]]:''' +8% [[technomancy]] penetration.
=== "Orange shield" ===
* '''Effect in [[armor]]:''' +30% base weapon damage.
* '''Effect in [[weapons]]:''' +9% attack power.
=== "Ruby" ===
* '''Effect in [[armor]]:''' +75 max health points.
* '''Effect in [[weapons]]:''' +15% critical damage.
== Locations ==
{| class="wikitable sortable"
! scope="col" | Area
! scope="col" class="unsortable" | Description
! scope="col" class="unsortable" | Coordinates
! scope="col" | Variant
|-
| [[Blok 6147]] || For now, refer to a walkthrough video on Discord.[https://discord.com/channels/541778372997677056/1087019327712133140/1087020918221590608] || {{coords|-1155|-1340|2635}} || Orange shield
|-
| [[Deluge]] || Starting from the first [[homunculus]] in the area, climb the stairs (past [[The Handler]]) and enter the small tower inhabited by a [[Diver]] [[Enemies|enemy]]. Look over the edge and you'll see a rusty walkway circling the tower. Drop down onto the walkway and follow it to the right (the direction the enemy was facing) and keep following it to find a ladder going up. Climb the ladder and continue straight to notice a gap in the floor, jump the gap and continue forward to find the crystal. (Going down the gap leads to a post-process effect unlock ("Dramatic").) || {{coords|-3178|-1346|5700}} || Purple jagged
|-
| [[Uranopolis]] || Next to a tree near the giant enemy that drops [[Ring of Casting Speed]]. || {{coords|-2185|-4082|1473}} || Orange shield
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head up the big stairs and take the left path. At the end is a big cliff. Walk near the cliff and use the jump button repeatedly to climb to the top of the cliff. The item is on the edge of the cliff. || {{coords|1246|-8872|1517}} || Ruby
|}
{{Navbox/Items}}
[[Category:Items]]
[[Category:Anomalous crystals]]
f3dbb5471d067f2759e3b9ef743f9c6ebc7f3619
Silent Streets
0
389
540
2025-07-23T22:01:44Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Interaction between the city's inhabitants is minimal and strangely formal. They pass one another with vacant, almost resigned nods, their conversations reduced to whispers that blend seamlessly with the ambient hum of the city. The air is filled with a sense of inevitability, as if their routines are an attempt to impose a semblance of order on an environment tha..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Interaction between the city's inhabitants is minimal and strangely formal. They pass one another with vacant, almost resigned nods, their conversations reduced to whispers that blend seamlessly with the ambient hum of the city. The air is filled with a sense of inevitability, as if their routines are an attempt to impose a semblance of order on an environment that has long forsaken any true sense of purpose or coherence. In this dreamlike, consuming city, their lives are a reflection of the city's own tragic state—a relentless cycle of existence without progress, forever trapped in the shadow of their own lost potential.
}}
== Location ==
{{coords|1244|1057|1956}}
Found in [[Blok 6147]]. In an alley with a fire and nearby cargo box. It's in the area with multiple walkways at different heights with stairs between.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
d244a7077b0a0b4ba8290bdd23f999bdbf664d08
Statues
0
390
542
2025-07-23T22:13:13Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Often found in the narrow corridors and shadowy alcoves of the city, their bodies rigidly aligned as if caught in a perpetual moment of exhaustion. Some are positioned near the vast concrete walls, their outlines faintly illuminated by the dim, ambient light, creating haunting silhouettes against the cold surface. Their eyes vacant, reflecting the dim glow of the..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Often found in the narrow corridors and shadowy alcoves of the city, their bodies rigidly aligned as if caught in a perpetual moment of exhaustion. Some are positioned near the vast concrete walls, their outlines faintly illuminated by the dim, ambient light, creating haunting silhouettes against the cold surface. Their eyes vacant, reflecting the dim glow of the city in a fixed, lifeless gaze.
}}
== Location ==
{{coords|1424|1365|3124}}
Located in [[Blok 6147]] at the end of one of the walkways with stairs between them.
[[File:Statues_location.jpg|thumb|left|Location of the data log.|alt=Screenshot showing the location of the data log.]]
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
afc40155102345cb921361ea566916b295ded7c5
Eris
0
495
754
2025-07-23T22:31:35Z
Sharparam
284703
Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Eris.png | Type = Helmet | Weight = Light | Passives = Flux Efficiency | Mk5_Sharp = 730 | Mk5_Blunt = 730 | Mk5_Technomancy = 939 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|2860|-4261|1423}} Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars. {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Eris.png
| Type = Helmet
| Weight = Light
| Passives = Flux Efficiency
| Mk5_Sharp = 730
| Mk5_Blunt = 730
| Mk5_Technomancy = 939
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|2860|-4261|1423}}
Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars.
{{Navbox/Armor}}
3716b6c0ca03c71f6dc10ebb3357cb49aa6862ef
Template:Infobox/Armor
10
453
670
2025-07-23T22:34:12Z
Sharparam
284703
Add support for passives
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Weight,Set,Passives
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| helmet = [[Helmet]]
| pauldrons = [[Pauldrons]]
| chestguard = [[Chestguard]]
| legguard = [[Legguard]]
| gauntlet = [[Gauntlet]]
| #default = {{{Type}}}
}}}}
|Set={{#if:{{{Set|}}}|[[{{{Set}}}]]}}
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \!
| token = @@@@
| pattern = [[@@@@]]
| intro = \{\{hlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{{Mk0_Sharp|???}}}
|Mk0_Blunt={{{Mk0_Blunt|???}}}
|Mk0_Technomancy={{{Mk0_Technomancy|???}}}
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| helmet = [[Category:Helmets]]
| pauldrons = [[Category:Pauldrons]]
| chestguard = [[Category:Chestguards]]
| legguard = [[Category:Legguards]]
| gauntlet = [[Category:Gauntlets]]
| #default = [[Category:Armor]]
}}{{Armor/CargoStore
|name={{{title|}}}
|setname={{{Set|}}}
|type={{{Type|}}}
|weight={{{Weight|}}}
|sharpMk0={{{Mk0_Sharp|}}}
|bluntMk0={{{Mk0_Blunt|}}}
|technomancyMk0={{{Mk0_Technomancy|}}}
|sharpMk1={{{Mk1_Sharp|}}}
|bluntMk1={{{Mk1_Blunt|}}}
|technomancyMk1={{{Mk1_Technomancy|}}}
|sharpMk2={{{Mk2_Sharp|}}}
|bluntMk2={{{Mk2_Blunt|}}}
|technomancyMk2={{{Mk2_Technomancy|}}}
|sharpMk3={{{Mk3_Sharp|}}}
|bluntMk3={{{Mk3_Blunt|}}}
|technomancyMk3={{{Mk3_Technomancy|}}}
|sharpMk4={{{Mk4_Sharp|}}}
|bluntMk4={{{Mk4_Blunt|}}}
|technomancyMk4={{{Mk4_Technomancy|}}}
|sharpMk5={{{Mk5_Sharp|}}}
|bluntMk5={{{Mk5_Blunt|}}}
|technomancyMk5={{{Mk5_Technomancy|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
b1b6719714f0e3277010b8ca8d5ecb76f9538378
Template:Infobox/Armor/doc
10
454
672
2025-07-23T22:35:47Z
Sharparam
284703
Update template data
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for armor",
"params": {
"image": {
"label": "Armor image",
"description": "Name of the file used as the image for the armor, should be at least 300 pixels wide.",
"required": true,
"example": "Cool armor.png",
"type": "wiki-file-name"
},
"Type": {
"label": "Armor type",
"description": "The type of armor.",
"required": true,
"example": "Helmet",
"type": "wiki-page-name"
},
"Weight": {
"label": "Armor weight",
"description": "The weight class of the armor.",
"required": true,
"example": "Light",
"type": "string"
},
"Set": {
"label": "Armor set",
"description": "Name of an armor set, if the piece is part of one.",
"required": false,
"example": "Cool set",
"type": "wiki-page-name"
},
"Passives": {
"label": "Passive effects",
"description": "Comma-separated list of passive effects",
"required": false,
"example": "Regen HP, Regen FX",
"type": "string"
},
"Mk1_Sharp": {
"label": "Mk 1 sharp rating",
"description": "Sharp defense rating at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Blunt": {
"label": "Mk 1 blunt rating",
"description": "Blunt defense rating at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Technomancy": {
"label": "Mk 1 technomancy rating",
"description": "Technomancy defense rating at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Sharp": {
"label": "Mk 2 sharp rating",
"description": "Sharp defense rating at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Blunt": {
"label": "Mk 2 blunt rating",
"description": "Blunt defense rating at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Technomancy": {
"label": "Mk 2 technomancy rating",
"description": "Technomancy defense rating at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Sharp": {
"label": "Mk 3 sharp rating",
"description": "Sharp defense rating at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Blunt": {
"label": "Mk 3 blunt rating",
"description": "Blunt defense rating at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Technomancy": {
"label": "Mk 3 technomancy rating",
"description": "Technomancy defense rating at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Sharp": {
"label": "Mk 4 sharp rating",
"description": "Sharp defense rating at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Blunt": {
"label": "Mk 4 blunt rating",
"description": "Blunt defense rating at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Technomancy": {
"label": "Mk 4 technomancy rating",
"description": "Technomancy defense rating at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Sharp": {
"label": "Mk 5 sharp rating",
"description": "Sharp defense rating at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Blunt": {
"label": "Mk 5 blunt rating",
"description": "Blunt defense rating at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Technomancy": {
"label": "Mk 5 technomancy rating",
"description": "Technomancy defense rating at Mk 5",
"required": true,
"example": "5",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Armor
| image = Helmet 2-1 SVG.svg
| title = Awesome helmet
| Type = Helmet
| Weight = Heavy
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Armor
| image = Helmet 2-1 SVG.svg
| title = Awesome helmet
| Type = Helmet
| Weight = Heavy
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
</syntaxhighlight>
03d97e9c6ffe6abdc853a4e886a5526e3ca4922d
Taskmaster
0
510
784
2025-07-23T23:20:45Z
Sharparam
284703
Created page with "{{Infobox/Weapon | title = {{PAGENAME}} | image = Taskmaster.png | Type = Ranged | Damage type = Sharp | Speed = Fast | Passives = Rapid Fire, Critical Strike | Mk2_Damage_min = 240 | Mk2_Damage_max = 256 }} '''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}. == Location == {{coord|4052|1265|-1412}} Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and..."
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Taskmaster.png
| Type = Ranged
| Damage type = Sharp
| Speed = Fast
| Passives = Rapid Fire, Critical Strike
| Mk2_Damage_min = 240
| Mk2_Damage_max = 256
}}
'''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}.
== Location ==
{{coord|4052|1265|-1412}}
Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and you'll see the bow resting against some run down brick arches.
{{Navbox/Weapons}}
dd37cc2a86e75e6fa9d8f0c27f5bfcb3c3a09e92
Unknown Limits
0
391
544
2025-07-23T23:28:39Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |From within, the boundary of the anomaly seems both infinite and elusive, with no clear beginning or end. It sprawls outwards in a chaotic, unpredictable manner, its influence warping space and time to create a disorienting and treacherous landscape. The sphere's growth is not linear but irregular, expanding and contracting as it incorporates elements from its sur..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|From within, the boundary of the anomaly seems both infinite and elusive, with no clear beginning or end. It sprawls outwards in a chaotic, unpredictable manner, its influence warping space and time to create a disorienting and treacherous landscape. The sphere's growth is not linear but irregular, expanding and contracting as it incorporates elements from its surroundings, twisting them into bizarre, unrecognizable forms.
}}
== Location ==
{{coords|4984|1575|-1420}}
Found in the [[Anomaly]]. When entering the area, it is the first thing you will come across as the cave opens up to the outdoors area. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
9c79704fa399a5c94c900c27d6cb8c39b760f58a
Template:Navbox/Items
10
285
322
321
2025-07-23T23:32:16Z
Sharparam
284703
Add link to essential items
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = [[Essential items|Essential]]
| list1 =
* [[Ability Splinter]]
* [[Handler Echo]]
* [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]])
* [[Mobius Blade]]
* [[Old Key]]
* [[Perk Essence]] ([[Unstable Perk Essence|Unstable]])
* [[Plagued Blood]]
* [[Scanner]]
| group1.1 = [[Upgrade items|Upgrade]]
| list1.1 =
* [[Upgrade Splinter]]
* [[Upgrade Module]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
7ddddd74185f43622c0032fb924e9ea4df3f2c1d
Template:Navbox/Locations
10
293
377
2025-07-24T16:38:41Z
Sharparam
284703
Created page with "<!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] * [[Blok 6147]] * [[Rain District]] * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] * [[Ghost Town]] * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude>"
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]]
* [[Blok 6147]]
* [[Rain District]]
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]]
* [[Ghost Town]]
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
a9919f8122c30db35e45bc7830af1bd611295ec1
378
377
2025-07-24T17:10:37Z
Sharparam
284703
Add links to sub-locations
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]])
* [[Blok 6147]]
* [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]])
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]])
* [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]])
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
91e37bd11620abbf81329f4ac0f61b9337538af4
Monastery
0
354
470
2025-07-24T16:59:38Z
Sharparam
284703
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Lower ==
[[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]]
{{Quote
| A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings
}}
{{clear}}
== Upper ==
[[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]]
{{Quote
| Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos.
}}
{{Navbox/Locations}}
[[Category:Locations]]
c45661f5fc6c65355deb9f8c90263eb72574a274
Uranopolis
0
352
466
2025-07-24T17:07:39Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
'''Uranopolis''' is a location in {{BFF}}.
== Sub-locations ==
Uranopolis consists of two sub-locations: Tower Complex and {{TODO}}.
=== Tower Complex ===
{{Main|Uranopolis/Tower Complex}}
[[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]]
The '''Tower Complex''' is the first sub-location encountered by the player.
{{clear}}
=== Lone Tower ===
[[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]]
The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here.
{{Navbox/Locations}}
[[Category:Locations]]
fc3e22f798adfdd04bd6befa151ccc23aa80ecd5
Locations
0
351
464
2025-07-24T17:08:00Z
Sharparam
284703
Created page with "{{Navbox/Locations}}"
wikitext
text/x-wiki
{{Navbox/Locations}}
980e15253d6e4f1418e9efa737c209de74f57252
Blok 6147
0
353
468
2025-07-24T17:25:02Z
Sharparam
284703
Add quote from relocation menu
wikitext
text/x-wiki
[[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history.
}}
== Trivia ==
* If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list.
{{Navbox/Locations}}
[[Category:Locations]]
bda6e533357582f201b31b2a208855d0bdc73471
Rain District
0
355
472
2025-07-24T17:29:27Z
Sharparam
284703
Fix link typo
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Sewers ==
[[File:Rain District (Sewers).png|thumb|The rain district sewers as depicted in the game's relocation menu.|alt=Artwork showing the sewers in the rain district.]]
{{Quote
| A maze of flooded tunnels with murky water that echoes the constant patter of rain from above, walls slick with moss and grime, and a stench of decay that ingles with the distant roar of rushing water and the occasional scurrying of unseen creatures.
}}
{{clear}}
== Center ==
[[File:Rain District (Center).png|thumb|The rain district center as depicted in the game's relocation menu.|alt=Artwork showing the center room in the rain district.]]
{{Quote
| A residential area lying in perpetual rain. Its dilapidated buildings stand silent and forlorn, windows shattered, rooftops caved in, walls rotting with mold. The relentless downpour
}}
{{Navbox/Locations}}
[[Category:Locations]]
411486cc02e286f1982f8922cb1e84ebe86d13e4
Deluge
0
356
474
2025-07-24T17:32:11Z
Sharparam
284703
Created page with "[[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting. }} {{Navbox/Locations}} [[Category:Locations]]"
wikitext
text/x-wiki
[[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting.
}}
{{Navbox/Locations}}
[[Category:Locations]]
693a79d49e7efc3474fef04a49a6ecfcf873ac1f
Asylum
0
357
476
2025-07-24T17:35:03Z
Sharparam
284703
Created page with "[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} {{Navbox/Locations}} Category:Loca..."
wikitext
text/x-wiki
[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls.
}}
{{Navbox/Locations}}
[[Category:Locations]]
37e0b512f0b81e8f301b3b2858e9d4da7562c26f
Upper Blocks
0
358
478
2025-07-24T17:37:37Z
Sharparam
284703
Created page with "[[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind sti..."
wikitext
text/x-wiki
[[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation.
}}
{{Navbox/Locations}}
[[Category:Locations]]
8eb05dbbf1b2eca301ec7824369953ecf59627e8
Ghost Town
0
359
480
2025-07-24T17:41:48Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Floor 13 == [[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]] {{Quote | Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past. }} {{clear}..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Floor 13 ==
[[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]]
{{Quote
| Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past.
}}
{{clear}}
== Floor 1 ==
[[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]]
{{Quote
| A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog.
}}
{{Navbox/Locations}}
[[Category:Locations]]
de022882ea75493bf878521b5de2b72ab78ee421
Machinarium
0
360
482
2025-07-24T17:44:46Z
Sharparam
284703
Created page with "[[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber cont..."
wikitext
text/x-wiki
[[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay.
}}
{{Navbox/Locations}}
[[Category:Locations]]
bdce97e055f63d9b564bb8af98884bb9353ec5db
Desert
0
361
484
2025-07-24T17:47:25Z
Sharparam
284703
Created page with "[[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally br..."
wikitext
text/x-wiki
[[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally broken by the distant echo of the city's hum.
}}
{{Navbox/Locations}}
[[Category:Locations]]
7a4e1dcb94c588a7cbdfa9c4abb1a9303a8d2d79
Desert Mirage
0
362
486
2025-07-24T17:49:33Z
Sharparam
284703
Created page with "[[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A desert from another time. }} {{Navbox/Locations}} [[Category:Locations]]"
wikitext
text/x-wiki
[[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A desert from another time.
}}
{{Navbox/Locations}}
[[Category:Locations]]
b77e5799a2dcb88ca21171824a322e70e1ceed2f
Anomaly (location)
0
363
488
2025-07-24T17:51:11Z
Sharparam
284703
Created page with "[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} {{Navbox/Locations}} [[Category:Locations]]"
wikitext
text/x-wiki
[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]]
The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still.
}}
{{Navbox/Locations}}
[[Category:Locations]]
a8fc6f2bc209173c6c2c5d3d178232dfb1ed8321
Template:Navbox/Data logs
10
290
362
361
2025-07-24T19:24:27Z
Sharparam
284703
Add [[The Grave Predicament]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[The Structure]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
82537fe78e3a074ce9313e77c8a0e10fbcd07289
363
362
2025-07-24T19:39:55Z
Sharparam
284703
Add [[Kaleidoscope of Dreams]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
d27f6dedb12199ea9906176abf11a31e884cfb4e
364
363
2025-07-24T20:35:41Z
Sharparam
284703
Add [[Vermillion]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Vermillion]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
61fdff8b80c1427da5886fa5b73c6c586e088a1d
365
364
2025-07-25T00:26:24Z
Sharparam
284703
Add [[A Broken Reality]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Vermillion]]
* [[A Broken Reality]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
1f8888031e5a5d1097cb7190e22eb472ab1ec16f
366
365
2025-07-26T16:46:43Z
Sharparam
284703
Add [[Understanding]]
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Vermillion]]
* [[A Broken Reality]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[Understanding]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
09b921cd27b38e22701e9064c302db0e3c8d90f3
The Grave Predicament
0
392
546
2025-07-24T19:29:54Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The Administration, a dominant force within this tangled system, exhibits a deeper grasp of [[Omnistructure|the Omnistructure's]] workings compared to other entities. However, its own nature is so enigmatic that it seems to be more an emergent symptom of [[Omnistructure|the Omnistructure]] than a genuine part of it. The Administration's methods and motivations are..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|The Administration, a dominant force within this tangled system, exhibits a deeper grasp of [[Omnistructure|the Omnistructure's]] workings compared to other entities. However, its own nature is so enigmatic that it seems to be more an emergent symptom of [[Omnistructure|the Omnistructure]] than a genuine part of it. The Administration's methods and motivations are as elusive as [[Omnistructure|the Omnistructure]] itself, blending seamlessly into the very fabric of the mysterious domain it governs within it. Its presence, while influential, only adds to the overall complexity of [[Omnistructure|the Omnistructure]], reinforcing the idea that understanding this colossal construct may forever remain an elusive, if not an impossible, pursuit. Nevertheless we must try. Our very survival hinges on our ability to adapt, and without understanding at the very least our immediate surroundings in this labyrinth, we have no room to elude the ever-pursuing peril that surrounds us.
}}
== Location ==
{{coords|4404|1793|-1412}}
Located on an edge overlooking the labyrinth in the [[Anomaly]] area, just after [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius']] boss arena. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
4a149e96e2d9c362546ae535afb986f4d6e1cb03
Blessed Crosier
0
508
780
2025-07-24T19:32:37Z
Sharparam
284703
Created page with "{{Infobox/Weapon | title = {{PAGENAME}} | image = Blessed Crosier.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Escape Velocity, Energy Burst | Mk3_Damage_min = 173 | Mk3_Damage_max = 177 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. == Acquisition == Dropped by [[Archinquisitor Belisarius (boss)]]. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Blessed Crosier.png
| Type = Staff
| Damage type = Technomancy
| Speed = Slow
| Abilities = Escape Velocity, Energy Burst
| Mk3_Damage_min = 173
| Mk3_Damage_max = 177
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}.
== Acquisition ==
Dropped by [[Archinquisitor Belisarius (boss)]].
{{Navbox/Weapons}}
d1d557ec6a9700fda1ee5579a6f5c4cf86cd912f
Kaleidoscope of Dreams
0
393
548
2025-07-24T19:42:40Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |[[Anomaly|The anomaly]] represents a profound and dangerous space-time phenomenon, its expanding radius a constant threat to the stability and integrity of the entire structure. Its presence is a reminder of the fragility of order in the face of an unrelenting, chaotic force that plagues [[Omnistructure|the Omnistructure]], erasing all that it touches. }} == Loca..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|[[Anomaly|The anomaly]] represents a profound and dangerous space-time phenomenon, its expanding radius a constant threat to the stability and integrity of the entire structure. Its presence is a reminder of the fragility of order in the face of an unrelenting, chaotic force that plagues [[Omnistructure|the Omnistructure]], erasing all that it touches.
}}
== Location ==
{{coords|5310|2116|-1450}}
Found in the [[Anomaly]] area, located right in front of the anomaly itself at the final part of the labyrinth.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
e9b3658c5073f52f9811e41c238dc70edd1b8e24
Template:Navbox/Locations
10
293
379
378
2025-07-24T19:50:02Z
Sharparam
284703
Add [[Unknown]]
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]])
* [[Blok 6147]]
* [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]])
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]])
* [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]])
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
* [[Unknown]]
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
707b7f5a5cdc0a7291104d9690755ad1acb0d8ea
380
379
2025-07-24T20:11:37Z
Sharparam
284703
Add [[Vermillion Fields]]
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]])
* [[Blok 6147]]
* [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]])
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]])
* [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]])
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
* [[Unknown]]
* [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]])
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
df2290162f33b6947a33876ca7a91148393a2506
381
380
2025-07-24T20:24:01Z
Sharparam
284703
Fix link to Unknown
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]])
* [[Blok 6147]]
* [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]])
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]])
* [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]])
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
* [[Unknown (location)|Unknown]]
* [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]])
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
fce3ea1b70826b4182d9c45e9139ae61473c389b
382
381
2025-07-25T00:58:26Z
Sharparam
284703
Add Vermillion Fields Temple sub-location
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]])
* [[Blok 6147]]
* [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]])
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]])
* [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]])
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
* [[Unknown (location)|Unknown]]
* [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]] · [[Vermillion Fields#Temple|Temple]])
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
7716644faea4dd5aee763d21d89daca0de53c69c
Unknown (location)
0
365
492
2025-07-24T20:21:48Z
Sharparam
284703
Created page with "{{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}} '''Unknown''' is a [[Locations|location]] in {{BFF}}. == Overview == As the Unknown cannot be relocated to, it has no artwork image and no in-game description. {{Navbox/Locations}} [[Category:Locations]]"
wikitext
text/x-wiki
{{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}}
'''Unknown''' is a [[Locations|location]] in {{BFF}}.
== Overview ==
As the Unknown cannot be relocated to, it has no artwork image and no in-game description.
{{Navbox/Locations}}
[[Category:Locations]]
351676f2dfc783d43a014b11a690031ea946e2b8
Unknown
0
366
494
2025-07-24T20:23:30Z
Sharparam
284703
Fix missing paren
wikitext
text/x-wiki
'''Unknown''' may refer to:
== Common meanings ==
* [[Unknown (location)]], the location with the platforming puzzles leading to an optional boss.
* [[Unknown (boss)]], the boss enemy that can be optionally fought in the location sharing its name.
{{Disambiguation}}
a972049d778c73207104b07ad235871c7a53466d
Unknown (boss)
0
549
858
2025-07-24T20:25:53Z
Sharparam
284703
Specify boss is optional
wikitext
text/x-wiki
{{About|the [[Bosses|boss]]|the [[Locations|location]]|Unknown (location)}}
{{Infobox/Boss
| title = Unknown
| image = Unknown (boss).png
}}
'''Unknown''' is an optional [[Bosses|boss]] in {{BFF}}.
== Overview ==
The Unknown resembles the player character in [[armor]], but uses its own [[Weapons|weapon]] instead of mirroring the player's. It does not drop its weapon on defeat.
Upon defeating the boss, the player is immediately transported to [[Vermillion Fields]].
== Location ==
Located at the end of the [[Unknown (location)|Unknown]], being the boss of the area.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
08cbc1e8f1d754f6cc8e5e04d59cc388bc187d8f
Archinquisitor Belisarius (boss)
0
548
856
2025-07-24T20:26:12Z
Sharparam
284703
Fix name
wikitext
text/x-wiki
{{About|the [[Bosses|boss]]|the [[NPC]]|Archinquisitor Belisarius}}
{{Infobox/Boss
| title = Archinquisitor Belisarius
| image = Archinquisitor Belisarius (boss).png
}}
'''Archinquisitor Belisarius''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Location ==
{{coords|4315|1734|-1413}} (approximate)
Found at the beginning of the [[Anomaly]] area.
== Drops ==
* [[Blessed Crosier]]
* [[Unstable Perk Essence]]
* [[Upgrade Module]]
== Quotes ==
=== Upon engaging him ===
{{Quote
|Well well… You made it through. As much as I hate to elevate your spiteful existence to the height of the truth… this is where we are now.
Ever since you've joined us, all you've done is fulfil the goals of the disgusting administration you work for.
The mundane pursuit of tasks is all you know… and this crusade against that apostate filth at the gate is just a backdrop to your performance.
Yet [[Anomaly|the anomaly]] is a blessing I will not let slip out of my hands… for it is instrumental in aiding the God-Emperor, noble is he and eternal, to finally transcend.
Nothing will stand in that path, I assure you. Not the Serdars, not [[Yaroslav]] and definitely not you – a dog that obeys by reflex instead of will.
Now… we both know you never quite die – so you'll at least find out what an eternity of pain is made of. Good thing you have no name – those make for the best martyrs.
}}
{{Navbox/Bosses}}
73a24d629934b27f74f10c58c9ab9e02ed3858bc
Vermillion
0
394
550
2025-07-24T20:47:54Z
Sharparam
284703
Improve location description
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|An omnipresent presence bathed everything in a deep vermillion{{note|"Vermillion" here refers to the color, although it might be more commonly spelled as "vermilion" (with only one L).}} hue. This color created an overwhelming sense of order. The vermillion presence exuded a serene yet unsettling stillness, embodying an ideal form of tranquility. It seemed to impose a perfect structure on the disarray around it, its calm nature hiding an underlying menace. The more you focused on the vermillion form, the more it became clear that this serenity was a guise, concealing a power that could shatter the delicate balance at play.
}}
== Location ==
{{coords|483|-4883|1752}}
Found in the [[Vermillion Fields]], on top of a balcony with a [[Vermillion Knight]] guarding it. Standing at the [[Homunculus]], face the direction of [[The Handler]] and the balcony can be seen behind her.
== See also ==
* [[Vermillion Fields]], for the endgame location
* [[Vermillion Knight]], for the enemy
== Notes ==
{{notelist}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
989e673b86ad80578a904518b93dcddaf305e173
A Broken Reality
0
395
552
2025-07-25T00:29:06Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The landscape is filled with soothing, warm tones that evoke a sense of perfect calm and harmony. Yet, despite the stunning serenity, there is an unshakable feeling of not being alone, a subtle but persistent awareness that something else is present. }} == Location == {{coords|2368|-5079|1225}} Found in [[Vermillion Fields]]. Start at the [[Homunculus]] and walk..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|The landscape is filled with soothing, warm tones that evoke a sense of perfect calm and harmony. Yet, despite the stunning serenity, there is an unshakable feeling of not being alone, a subtle but persistent awareness that something else is present.
}}
== Location ==
{{coords|2368|-5079|1225}}
Found in [[Vermillion Fields]]. Start at the [[Homunculus]] and walk to where the blue lightsaber knight is. Head outside from there and get to the edge. Take a left and follow the edge until you come to a balcony on the right with the data log. Use [[Scanner|the scanner]] to help you find it more easily.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
cb804aedc9c441989a2f08a03652278a42ce02a8
Vermillion Fields
0
364
490
2025-07-25T00:56:04Z
Sharparam
284703
Add temple location
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Overview ==
Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]].
== Plaza ==
[[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]]
{{Quote
|Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field.
}}
{{clear}}
== Temple ==
[[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]]
{{Quote
|Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes.
}}
{{Navbox/Locations}}
[[Category:Locations]]
71f1f17927909020242b8cf472a7e2f89199d643
Template:Navbox/Weapons
10
438
636
2025-07-25T01:14:14Z
Sharparam
284703
Add [[Valtiel]]
wikitext
text/x-wiki
<!-- Weapons must be listed in alphabetical order! -->
{{Navbox
| {{{1|}}}
| template = Navbox/Weapons
| title = [[Weapons]]
| group1 = [[One-handed weapons|One-handed]]
| list1 =
* [[Arming Sword]]
* [[Industrial Axe]]
* [[Industrial Mace]]
* [[Iron Pipe]]
* [[Longsword]]
* [[Machinist's Hammer]]
* [[Morning Star]]
* [[Paladin Mace]]
* [[Ratagan Sabre]]
* [[Scimitar]]
* [[Soul Breaker]]
* [[Tire Iron]]
* [[Torch]]
* [[Woodchopper]]
| group2 = [[Two-handed weapons|Two-handed]]
| list2 =
* [[Anastasia]]
* [[Claymore]]
* [[Faussart]]
* [[Halberd]]
* [[Mechanical Tenderizer]]
* [[Nodachi]]
* [[Royal Claymore]]
* [[Rusty Claymore]]
* [[Solaris]]
* [[Soul Reaper]]
* [[Valtiel]]
| group2.1 = [[Dual Wields]]
| list2.1 =
* [[Blades of Atropos]]
* [[Daggers]]
* [[Kamas]]
* [[Katanas]]
* [[Khopeshs]]
* [[Lacerators]]
| group2.2 = [[Twinblades]]
| list2.2 =
* [[Twinblade]]
| group2.3 = [[Greatweapons]]
| list2.3 =
* [[Armor Buster]]
* [[Divine Greataxe]]
* [[Eviscerator]]
* [[Greathammer]]
| group3 = [[Ranged weapons|Ranged]]
| group3.1 = [[Longbows]]
| list3.1 =
* [[Arcane Bow]]
* [[Longbow]]
* [[Taskmaster]]
* [[Winged bow]]
| group3.2 = [[Staves]]
| list3.2 =
* [[Asklepios]]
* [[Blessed Crosier]]
* [[Evolved Staff]]
* [[Mechanomad Staff]]
* [[Vermillion Staff]]
}}<noinclude>{{Documentation}}</noinclude>
441db50a6ddfe17d473822864f9d20f3a2af385f
Valtiel
0
504
772
2025-07-25T01:15:53Z
Sharparam
284703
Created page with "{{Infobox/Weapon | title = {{PAGENAME}} | image = Valtiel.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Syphon Life, Carnage | Mk3_Damage_min = 522 | Mk3_Damage_max = 562 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Drops from [[Vermillion Knight|Vermillion Knights]]. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Valtiel.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Syphon Life, Carnage
| Mk3_Damage_min = 522
| Mk3_Damage_max = 562
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Acquisition ==
Drops from [[Vermillion Knight|Vermillion Knights]].
{{Navbox/Weapons}}
cd2852971f9cc25db419ef806fb9c0960f845d16
Template:Navbox/Amulets
10
441
642
2025-07-25T03:48:01Z
Sharparam
284703
Add [[Tactician's Amulet]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Amulets
| title = [[Amulets]]
| list1 =
* [[Amulet of Arcane Protection]]
* [[Amulet of Evasion]]
* [[Tactician's Amulet]]
}}
52e610bdb0cd1e26a433d4a731efea2e044132e1
Tactician's Amulet
0
518
799
2025-07-25T03:49:52Z
Sharparam
284703
Created page with "{{Infobox/Amulet | title = {{PAGENAME}} | image = Tactician's Amulet.png | Effects = Removes invincibility frames | Passives = Vulnerable Dodge }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. {{Navbox/Amulets}}"
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Tactician's Amulet.png
| Effects = Removes invincibility frames
| Passives = Vulnerable Dodge
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
{{Navbox/Amulets}}
8032681e4f4e42a1fa5445d736a503ae40145d42
Plagued Warden
0
545
850
2025-07-26T15:59:31Z
Sharparam
284703
Add note on spawning
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Plagued Warden.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}.
== Location ==
{{coords|2395|-2410|529}} (approximate)
Located in [[Blok 6147]]. After getting off the [[subway]], take the path leading up and then take the stairs on the left. You will see a platform nearby with a spiked shield on the far end. Interacting with the shield spawns the boss, but doing so requires having the [[Plagued Blood]] item in your inventory.
== Drops ==
* [[Spiked Shield]] (only in NG (or if you don't yet have it?))
* [[Anomalous Fragment]] (only in [[NG+]] (or if you don't have the shield?))
{{Navbox/Bosses}}
5dfd44f48ae568136e010129ccbd00bbd7c71a55
Plagued Blood
0
422
606
2025-07-26T16:00:18Z
Sharparam
284703
Add usage
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Plagued Blood.png
| Description = Harvested from a burial site, this unsettling vial contains a sample of plagued blood belonging to a Revenant.
}}
== Location ==
{{coords|-3898|1671|1585}}
Located at the top of the big tower in [[Asylum|the asylum]], after climbing a staircase into a room with a bunch of empty bookshelves, look to your right to see the item on a table.
== Usage ==
Having this item in your inventory allows for spawning some optional bosses.
* [[Plagued Warden]]
* [[Plagued Revenant]]
{{Navbox/Items}}
[[Category:Essential items]]
1f8d91aaf3bd07906a2a403a6db0b8ae9ee60325
Understanding
0
396
554
2025-07-26T16:46:12Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | Hierarchies within various organizations reflect a fragmented understanding of the [[Omnistructure]]. These organizations, though structured, are plagued by slow progress and sporadic breakthroughs. Their efforts to decode and rebuild within this immense and confounding realm are hindered by the overwhelming scale and shifting nature of their environment }} == A..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
| Hierarchies within various organizations reflect a fragmented understanding of the [[Omnistructure]]. These organizations, though structured, are plagued by slow progress and sporadic breakthroughs. Their efforts to decode and rebuild within this immense and confounding realm are hindered by the overwhelming scale and shifting nature of their environment
}}
== Acquisition ==
Unlocked upon speaking to [[Inquisitor Commander Alexius]] for the first time.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
58629768126fce5c895113d20c5c3433807829d2
Template:Navbox/Rings
10
292
375
374
2025-07-26T16:49:00Z
Sharparam
284703
Add [[Ring of Hawk]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
* [[Ring of Casting Speed]]
* [[Ring of Hawk]]
* [[Ring of Rammstein]]
* [[Ring of Lesser Talent]]
* [[Ring of Talent]]
* [[Ring of Exceeding Talent]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
a26fb4e5bb5097e037bde34bbe50c7f6f0fd3453
Plagued Nemesis
0
542
844
2025-07-26T16:59:34Z
Sharparam
284703
Add drop
wikitext
text/x-wiki
{{Infobox/Boss
| image = Plagued Nemesis.png
| SharpResist = 32
| BluntResist = 2
| TechnomancyResist = 50
}}
'''{{PAGENAME}}''' is an optional [[boss]] [[Enemies|enemy]] in {{BFF}}.
== Location ==
Found at the top of the big tower in [[Asylum|the asylum]].
== Drops ==
* [[Khopeshs]]
* [[Unstable Perk Essence]]
* [[Upgrade Module]]
* [[Anomalous Fragment]] (Only in [[NG+]])
{{Navbox/Bosses}}
3ab22950bbea5ef8c5c7eecf9db701cacb0006a0
Anomalous Fragment
0
426
614
2025-07-26T17:52:32Z
Sharparam
284703
Update acquisition
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Anomalous Fragment.png
| Description = [[The Handler|Handler]] may convert it to a more useful form.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Acquisition ==
Drops from [[bosses]] in [[NG+]].
== Usage ==
Used to manufacture [[Greater Anomalous Crystal|Greater Anomalous Crystals]] at [[The Handler]].
[[Category:Essential items]]
7980e000ddcb82018f50487ce22ffa9df9abbde2
Nurgei the Blademaster
0
544
848
2025-07-26T17:52:58Z
Sharparam
284703
Add drop
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Nurgei the Blademaster.png
| SharpResist = 29
| BluntResist = 37
| TechnomancyResist = 57
}}
'''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}.
== Location ==
{{coords|1138|-9288|1571}} (approximate)
Found in [[Uranopolis#Lone Tower|Uranopolis (Lone Tower)]]. From the [[Homunculus]], walk across the long bridge lined with pillars and you will see him straight ahead in his boss arena.
== Drops ==
* [[Upgrade Module]]
* [[Nodachi]]
* [[Unstable Perk Essence]]
* [[Anomalous Fragment]] ([[NG+]])
{{Navbox/Bosses}}
1f8634a99af6d189e90d0e6283c284736ffbd4fe
Old Key
0
429
620
2025-07-26T18:04:43Z
Sharparam
284703
Created page with "{{Infobox/Item | title = {{PAGENAME}} | image = Old Key.png | Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]]. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Location == {{coords|19328.57|-41596.65|3.83}} Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up. == Usage == Unlocks the gate at the top of the [[Monastery]], found near t..."
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Old Key.png
| Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]].
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Location ==
{{coords|19328.57|-41596.65|3.83}}
Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up.
== Usage ==
Unlocks the gate at the top of the [[Monastery]], found near the entrance to [[Konrad the Traitor|Konrad the Traitor's]] boss arena (keep going past the entrance instead of entering it).
{{Navbox/Items}}
a6c6a09cf952e26c4386195a47267f9112b2ac5e
Konrad the Traitor
0
550
860
2025-07-26T18:04:55Z
Sharparam
284703
Created page with "{{Infobox/Boss | title = {{PAGENAME}} | image = Konrad the Traitor.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Overview == The boss is not mandatory for progression, as the [[Old Key]] can be looted off the ground behind him. However, skipping him means not having access to [[Homunculus Mirage]], as the husk drops from him (including in [[NG+]]). == Location == {{coords|18794.39|-40662.96|-15.20}} (approximate) Located at the top of the [..."
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Konrad the Traitor.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}.
== Overview ==
The boss is not mandatory for progression, as the [[Old Key]] can be looted off the ground behind him. However, skipping him means not having access to [[Homunculus Mirage]], as the husk drops from him (including in [[NG+]]).
== Location ==
{{coords|18794.39|-40662.96|-15.20}} (approximate)
Located at the top of the [[Monastery]], being the area's boss.
== Drops ==
* [[Homunculus Mirage Husk]]
* [[Handler Echo]]
* [[Anomalous Fragment]] ([[NG+]])
{{Navbox/Bosses}}
acd47fd792b54614f8d3d42a80fe9037a65997cc
Handler Echo
0
421
604
2025-07-26T18:05:14Z
Sharparam
284703
Add konrad drop
wikitext
text/x-wiki
{{Infobox/Item
| image = Handler Echo.png
| title = {{PAGENAME}}
| Description = An obscure residue used to supplement [[The Handler|the Handler's]] capabilities. [[The Handler]] can use this to upgrade [[equipment]] more effectively.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] used to level up [[The Handler]], in order to increase the max level equipment can be upgraded to.
== Usage ==
If the item is in your inventory, [[The Handler]] will automatically level up when you next interact with her. A message will also pop up in the bottom right corner of the screen informing you of the new synchronization level.
== Acquisition ==
* Drops from [[Konrad the Traitor]].
* Can drop from samurai enemies in [[Uranopolis]] (limited to one drop).
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Rain District]] || Up some stairs. || {{coords|-36697.35|-17753.66|12174.48}}
|-
| [[Asylum]] || In the spiral staircase with the shortcut door to the courtyard there is a floating ghost. Move through the ghost and the echo will be right behind it. || {{coords|-4225|6824|9253}}
|-
| [[Desert]] || In the big building after the sand worm, where Yaroslav's crew is. The echo is sitting on a toppled pillar. || {{coords|3720|1159|-1397}}
|}
{{Navbox/Items}}
[[Category:Essential items]]
8e39742af7d396a0340cfbf20893f0518504a05a
Kamas
0
476
716
2025-07-26T18:41:15Z
Sharparam
284703
Add damage for Mk 4 and 5
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Kamas.png
| Type = Dual Wield
| Speed = Swift
| Damage type = Sharp
| Passives = Powerful Decay
| Abilities = Bladestorm
| Mk3_Damage_min = 112
| Mk3_Damage_max = 130
| Mk4_Damage_min = 269
| Mk4_Damage_max = 313
| Mk5_Damage_min = 308
| Mk5_Damage_max = 358
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
{{Navbox/Weapons}}
80fd6cf0dc6a59c85d7b761b05ed0b0cb9908c27
Daggers
0
478
720
2025-07-26T21:54:12Z
Sharparam
284703
Add min mark
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Daggers.png
| Type = Dual Wield
| Speed = Swift
| Damage type = Sharp
| Abilities = Dual Brutality, Shadowstep
| Mk_min = 2
| Mk2_Damage_min = 106
| Mk2_Damage_max = 123
| Mk3_Damage_min = 135
| Mk3_Damage_max = 157
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Location ==
Located together with the [[sentinel]] [[Armor sets|armor set]] on a corpse in [[Asylum|the asylum]]. See [[Sentinel#Location]] for its location.
{{Navbox/Weapons}}
564b414d6a096a1107d0569379379434b1e1f48e
Template:Plainlist
10
535
830
2025-07-26T22:45:29Z
Sharparam
284703
Created page with "<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}| {{{1}}} </div>}}<noinclude></div> {{documentation}} </noinclude>"
wikitext
text/x-wiki
<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}|
{{{1}}}
</div>}}<noinclude></div>
{{documentation}}
</noinclude>
1f83cec6d8a2e5ba45342d554089a71b19afae80
Template:Plainlist/styles.css
10
536
832
2025-07-26T22:45:54Z
Sharparam
284703
sanitized-css
text/css
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
padding: 0; /* Reset Minerva default */
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
15a09febff47c3fa7ff01092a7cd381b44a14427
Template:Infobox/Weapon/doc
10
452
668
2025-07-27T03:00:01Z
Sharparam
284703
Add template data for mk 0
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for weapons",
"params": {
"title": {
"label": "Weapon name",
"description": "The name of the weapon",
"required": false,
"default": "{{PAGENAME}}",
"example": "Cool Sword",
"type": "string"
},
"image": {
"label": "Weapon image",
"description": "Name of the file used as the image for the weapon, should be at least 300 pixels wide.",
"required": true,
"example": "Cool weapon.png",
"type": "wiki-file-name"
},
"Type": {
"label": "Weapon type",
"description": "The type of the weapon.",
"required": true,
"example": "Dual Wields",
"type": "wiki-page-name"
},
"Speed": {
"label": "Weapon speed",
"description": "The speed category of the weapon.",
"required": true,
"example": "Fast",
"type": "string"
},
"Damage type": {
"label": "Weapon damage type",
"description": "The type of damage dealt by the weapon.",
"required": true,
"example": "Sharp",
"type": "wiki-page-name"
},
"Passives": {
"label": "Passive properties",
"description": "Any passive properties the weapon has, comma separated",
"required": false,
"example": "Health Regen, Flux Regen",
"type": "string"
},
"Abilities": {
"label": "Active abilities",
"description": "Active abilities that can be used when the weapon is equipped, comma separated",
"required": false,
"example": "Blade Dance",
"type": "string"
},
"Mk_min": {
"label": "Minimum mark level",
"description": "The initial mark level of the weapon",
"required": false,
"default": "0",
"example": "3",
"type": "number"
},
"Mk0_Damage_min": {
"label": "Min. damage at Mk. 0",
"description": "Minimum damage the weapon deals at Mk. 0",
"required": true,
"example": "5",
"type": "number"
},
"Mk0_Damage_max": {
"label": "Max. damage at Mk. 0",
"description": "Maximum damage the weapon deals at Mk. 0",
"required": true,
"example": "8",
"type": "number"
},
"Mk1_Damage_min": {
"label": "Min. damage at Mk. 1",
"description": "Minimum damage the weapon deals at Mk. 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Damage_max": {
"label": "Max. damage at Mk. 1",
"description": "Maximum damage the weapon deals at Mk. 1",
"required": true,
"example": "8",
"type": "number"
},
"Mk2_Damage_min": {
"label": "Min. damage at Mk. 2",
"description": "Minimum damage the weapon deals at Mk. 2",
"required": true,
"example": "10",
"type": "number"
},
"Mk2_Damage_max": {
"label": "Max. damage at Mk. 2",
"description": "Maximum damage the weapon deals at Mk. 2",
"required": true,
"example": "15",
"type": "number"
},
"Mk3_Damage_min": {
"label": "Min. damage at Mk. 3",
"description": "Minimum damage the weapon deals at Mk. 3",
"required": true,
"example": "20",
"type": "number"
},
"Mk3_Damage_max": {
"label": "Max. damage at Mk. 3",
"description": "Maximum damage the weapon deals at Mk. 3",
"required": true,
"example": "25",
"type": "number"
},
"Mk4_Damage_min": {
"label": "Min. damage at Mk. 4",
"description": "Minimum damage the weapon deals at Mk. 4",
"required": true,
"example": "30",
"type": "number"
},
"Mk4_Damage_max": {
"label": "Max. damage at Mk. 4",
"description": "Maximum damage the weapon deals at Mk. 4",
"required": true,
"example": "40",
"type": "number"
},
"Mk5_Damage_min": {
"label": "Min. damage at Mk. 5",
"description": "Minimum damage the weapon deals at Mk. 5",
"required": true,
"example": "50",
"type": "number"
},
"Mk5_Damage_max": {
"label": "Max. damage at Mk. 5",
"description": "Maximum damage the weapon deals at Mk. 5",
"required": true,
"example": "60",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Weapon
| title = Cool Sword
| image = Sword_01.svg
| Type = Dual Wields
| Speed = Fast
| Damage type = Sharp
| Passives = Infinite regen,Stuff,Cool
| Abilities = Blade Dance
| Mk_min = 1
| Mk1_Damage_min = 1
| Mk1_Damage_max = 2
| Mk2_Damage_min = 4
| Mk2_Damage_max = 6
| Mk3_Damage_min = 10
| Mk3_Damage_max = 12
| Mk4_Damage_min = 20
| Mk4_Damage_max = 25
| Mk5_Damage_min = 50
| Mk5_Damage_max = 60
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Weapon
| title = Cool Sword
| image = Sword_01.svg
| Type = Dual Wields
| Speed = Fast
| Damage type = Sharp
| Passives = Infinite regen
| Abilities = Blade Dance
| Mk_min = 1
| Mk1_Damage_min = 1
| Mk1_Damage_max = 2
| Mk2_Damage_min = 4
| Mk2_Damage_max = 6
| Mk3_Damage_min = 10
| Mk3_Damage_max = 12
| Mk4_Damage_min = 20
| Mk4_Damage_max = 25
| Mk5_Damage_min = 50
| Mk5_Damage_max = 60
}}
</syntaxhighlight>
03d55ce17e93a95147326d083a21a60c735a4602
NPCs
0
368
498
2025-07-27T19:31:51Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
'''Non-player characters (NPC)''' are characters in {{BFF}} that can aid the player, provide services, or be spoken to in order to learn more about the world.
== Notable NPCs ==
* [[The Handler]] – Upgrades [[equipment]] and allows for [[crafting]] certain [[items]].
{{Navbox/NPCs}}
79553771fc8e6ca775b99979d35e2de32ae39cbb
Template:Navbox/NPCs
10
294
384
2025-07-27T19:37:46Z
Sharparam
284703
Created page with "{{Navbox | {{{child|}}} | template = Navbox/NPCs | title = [[NPCs]] | list1 = * [[Abandoned Soldier]] * [[Abelard the Brave]] * [[Anselm the Pure]] * [[Archinquisitor Belisarius]] * [[The Handler]] * [[Inquisitor Commander Alexius]] * [[Mysterious Woman]] * [[Royal Division Captain Yulia]] * [[Stranger]] * [[Yaroslav]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] <noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{child|}}}
| template = Navbox/NPCs
| title = [[NPCs]]
| list1 =
* [[Abandoned Soldier]]
* [[Abelard the Brave]]
* [[Anselm the Pure]]
* [[Archinquisitor Belisarius]]
* [[The Handler]]
* [[Inquisitor Commander Alexius]]
* [[Mysterious Woman]]
* [[Royal Division Captain Yulia]]
* [[Stranger]]
* [[Yaroslav]]
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
<noinclude>
19819092a7dffc936dc5330f6d3c7764bede86db
Abandoned Soldier
0
400
561
2025-07-27T22:35:50Z
Sharparam
284703
Add infobox and navbox
wikitext
text/x-wiki
{{Infobox/NPC
| image = Abandoned Soldier.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
Found in the [[Monastery#Lower|lower Monastery]], at the top of the stairs sitting next to one of the statue heads ({{coords|22476.39|-66438.91|-8856.44}}).
After defeating [[Konrad the Traitor]], he moves to {{TODO|Add second location}}.
At some point, he disappears entirely from the game.
{{Navbox/NPCs}}
e596f1f08e1e0d7bb6ddf38f363f5924a5b8dd01
Archinquisitor Belisarius
0
401
563
2025-07-27T22:36:32Z
Sharparam
284703
Add infobox and navbox
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}}
{{stub}}
{{Infobox/NPC
| image = Archinquisitor Belisarius.png
}}
{{Navbox/NPCs}}
7acff4eb5df9236854d4caf127e0613b0980b80d
Inquisitor Commander Alexius
0
402
565
2025-07-27T22:37:16Z
Sharparam
284703
Add infobox and navbox
wikitext
text/x-wiki
{{Infobox/NPC
| image = Inquisitor Commander Alexius.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|-41635.32|9075.12|11831.71}}
Located in the [[Asylum]], in a tower that can be reached by following a hidden path.
== Quotes ==
=== On first meeting ===
{{Quote
|Hmmm – a visitor.
A visitor to a plague at that – a rare occurence{{sic|expected=occurrence}}. Ah! The Administration? Yes – that much is now obvious.
Always a pervasive need for the world to make sense – but with each passing moment, I find the [[omnistructure]] is always one step beyond it… beyond comprehension.
I wonder what tales you'd share if only you could speak. Traversing every crevice and ruin on foot, my, my… the secrets you hold… and what happens to the ones you leave behind? Do you ever think of them?
It sounds like a treacherous life… You must not know much kindness. And how could you – I imagine you've experienced pain and death uncountable times. It is after all reflected in your demeanour.
Maybe this can make a small change. <!-- Gives greater crystals -->
You know, I myself am not a stranger to challenges. This struggle between absolute power and perfect order is no longer easy to balance. I find myself giving it my all, without, seeing much in return…
[[The Serdars]] now complicate things… Their sacrifices were too great for a wavering Empire. Yet rebelling against everything makes life lose its purpose…
[[The Administration|The Administration's]] vision of order is sterile however… perfect, yes, but like marble – its beauty frozen permanently in the rhythm of death. In his few moments of peace, [[Yaroslav]] would probably explain it better than I – then again – his word was always as sharp as his saber.
We both have work to do. Until we meet again.
}}
Unlocks the data log [[Understanding]] and gives you two [[Greater Anomalous Crystal|Greater Anomalous Crystals]].
=== After first encounter ===
{{Quote|We both have work to do. Until we meet again}}
{{Navbox/NPCs}}
39b57600330ffb5ca7e6c437458be303142ceb91
Yaroslav
0
403
567
2025-07-27T22:38:09Z
Sharparam
284703
Add infobox and navbox
wikitext
text/x-wiki
{{Infobox/NPC
| image = Yaroslav.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|3721|1150|-1397}}
Located in the [[Desert]]. Standing with his crew in front of the gate to [[The Anomaly]].
== Quotes ==
=== First encounter ===
{{Quote
|Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing.
Time is not of the essence here… Only choice. Soon, you'll feel it yourself.
Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face…
Beyond those gates, you will have to carry the greatest burden of all – your own!
The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness!
I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her.
I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life.
We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception…
When you return, Collector, things will not be as they were. You will not be as you were.
}}
=== After first encounter ===
{{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}}
=== Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] ===
{{Quote
|Things have been set in motion that can never be explained.
An eternal rain is coming our way – remember to trust your blade. You will need it more than ever.
}}
{{Navbox/NPCs}}
6bb0d94919bf2b14a91b7fd37736740fa5038de0
Royal Division Captain Yulia
0
404
569
2025-07-29T12:44:45Z
Sharparam
284703
Created page with "{{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}} {{Infobox/NPC | image = Royal Division Captain Yulia.png }} {{stub}} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. {{Navbox/NPCs}}"
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}}
{{Infobox/NPC
| image = Royal Division Captain Yulia.png
}}
{{stub}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
{{Navbox/NPCs}}
47c5320bb535502d6ea086d13c44e3827509697f
Vermillion Staff
0
507
778
2025-07-29T20:05:02Z
Sharparam
284703
Specify minimum mark
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Vermillion Staff.png
| Type = Staff
| Damage type = Technomancy
| Speed = Slow
| Abilities = Forceful Repulsion, Quake
| Mk_min = 3
| Mk3_Damage_min = 117
| Mk3_Damage_max = 120
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}.
== Location ==
{{coords|1241|-8256|275}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. At the outdoor area with a big staircase leading up, head instead to the right before the staircase, leading to an area with some tombstones. The weapon can be found leaning against a wall in the dead-end.
{{Navbox/Weapons}}
e59fb090f56eced502c56a092f5d2cf9267c2818
Template:DamageRange
10
527
814
2025-07-29T20:07:04Z
Sharparam
284703
Allow using tech as short for technomancy
wikitext
text/x-wiki
<includeonly>{{Tooltip|{{{1}}}–{{{2}}}|Average: {{Average|{{{1}}}|{{{2}}}}}}}{{#if:{{{type|}}}| {{#switch:{{lc:{{{type}}}}}
| sharp = [[Sharp]]
| blunt = [[Blunt]]
| tech
| technomancy = [[Technomancy]]
| #default = {{{type}}}
}}|}}</includeonly><noinclude>{{Documentation}}</noinclude>
bee05e8ca021e7585fc203ed68db91f82ab057e2
Template:Navbox/Armor
10
439
638
2025-07-29T20:28:04Z
Sharparam
284703
Add [[Desert Corp]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Crude Helmet]]
* [[Deserts Respirator Helmet]]
* [[Eris]]
* [[Librarian Hood]]
* [[Plagued Revenant Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Techpriest Helmet]]
| group2 = [[Pauldrons]]
| group3 = [[Chestguards]]
| list3 =
* [[Citadel Warrior Chest]]
* [[Corrupted Cuirass]]
* [[Librarian Overcoat]]
* [[Sentinel Chest]]
| group4 = [[Legguards]]
| list4 =
* [[Librarian Trousers]]
* [[Sentinel Legguard]]
| group5 = [[Gauntlets]]
| list5 =
* [[Sentinel Gauntlets]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>{{Documentation}}</noinclude>
d47fdce5305e2ded83cd423d5b2674c32d0dde4d
Mutated Ghoul
0
552
864
2025-07-30T21:47:33Z
Sharparam
284703
Created page with "{{Infobox/Boss | image = Mutated Ghoul.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Location == {{coords|6937.36|-64861.39|-17736.47}} (approximate) Located in a big grass field at the bottom of the [[Monastery]]. == Drops == * [[Anomalous Fragment]] (only in [[NG+]]) {{Navbox/Bosses}}"
wikitext
text/x-wiki
{{Infobox/Boss
| image = Mutated Ghoul.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}.
== Location ==
{{coords|6937.36|-64861.39|-17736.47}} (approximate)
Located in a big grass field at the bottom of the [[Monastery]].
== Drops ==
* [[Anomalous Fragment]] (only in [[NG+]])
{{Navbox/Bosses}}
8e88bd012af5d51d364d79af5fc33127dd67fa4d
Divine Greataxe
0
470
704
2025-07-30T23:09:34Z
Sharparam
284703
Fix coordinates
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Divine Greataxe.png
| Type = Greatweapon
| Damage type = Sharp
| Speed = Sluggish
| Passives = Greater Divine Judgment
| Abilities = Regal Radiance
| Mk4_Damage_min = 597
| Mk4_Damage_max = 656
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
== Location ==
{{coords|43210.37|165132.67|-141105.39}}
Found in the [[Anomaly]]. From the [[Homunculus]], walk past [[The Handler]] and you will see the item up ahead on the ledge of a building.
{{Navbox/Weapons}}
0ae771a14e6b5fd5c63e8a73b5aebd90154e8bff
Abelard the Brave
0
405
571
2025-07-30T23:23:05Z
Sharparam
284703
Created page with "{{Infobox/NPC | image = Abelard the Brave.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|3566.32|32790.88|-14128.63}} Stands on the edge of a platform at the top of the [[Machinarium]]. == Quotes == === First encounter === {{Quote |Gets lonely out here. Thank the [[God-Emperor]] for the voices that haunt me… Who knows what [[Yaroslav]] is up to. To turn on his own… so brutally. Tsss! [[Serdar]] filth! No order to this place. Ther..."
wikitext
text/x-wiki
{{Infobox/NPC
| image = Abelard the Brave.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|3566.32|32790.88|-14128.63}}
Stands on the edge of a platform at the top of the [[Machinarium]].
== Quotes ==
=== First encounter ===
{{Quote
|Gets lonely out here. Thank the [[God-Emperor]] for the voices that haunt me…
Who knows what [[Yaroslav]] is up to. To turn on his own… so brutally. Tsss!
[[Serdar]] filth!
No order to this place. There's no cycle, no ebb and flow to the city. It all feels like… Eh. What do you care anyway.
War is Hell. Not a sewer, so I don't exactly know what you{{note|The voice actor emphasis the "you" in this sentence, but the subtitles do not.}} are doing here.
We all have our role to play. You play yours. We'll see about mine!
Farewell.
}}
=== Upon speaking to him again ===
{{Quote|Farewell.}}
== Notes ==
{{notelist}}
{{Navbox/NPCs}}
bff64714017d7cf963314a972d069174724842aa
Module:Convert
828
720
1103
2025-07-31T20:50:48Z
wikipedia>Ahecht
0
move arg extraction to its own function to allow _convert() to be called from other lua modules
Scribunto
text/plain
-- Convert a value from one unit of measurement to another.
-- Example: {{convert|123|lb|kg}} --> 123 pounds (56 kg)
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
local MINUS = '−' -- Unicode U+2212 MINUS SIGN (UTF-8: e2 88 92)
local abs = math.abs
local floor = math.floor
local format = string.format
local log10 = math.log10
local ustring = mw.ustring
local ulen = ustring.len
local usub = ustring.sub
-- Configuration options to keep magic values in one location.
-- Conversion data and message text are defined in separate modules.
local config, maxsigfig
local numdot -- must be '.' or ',' or a character which works in a regex
local numsep, numsep_remove, numsep_remove2
local data_code, all_units
local text_code
local varname -- can be a code to use variable names that depend on value
local from_en_table -- to translate an output string of en digits to local language
local to_en_table -- to translate an input string of digits in local language to en
-- Use translation_table in convert/text to change the following.
local en_default -- true uses lang=en unless convert has lang=local or local digits
local group_method = 3 -- code for how many digits are in a group
local per_word = 'per' -- for units like "liters per kilometer"
local plural_suffix = 's' -- only other useful value is probably '' to disable plural unit names
local omitsep -- true to omit separator before local symbol/name
-- All units should be defined in the data module. However, to cater for quick changes
-- and experiments, any unknown unit is looked up in an extra data module, if it exists.
-- That module would be transcluded in only a small number of pages, so there should be
-- little server overhead from making changes, and changes should propagate quickly.
local extra_module -- name of module with extra units
local extra_units -- nil or table of extra units from extra_module
-- Some options in the invoking template can set variables used later in the module.
local currency_text -- for a user-defined currency symbol: {{convert|12|$/ha|$=€}} (euro replaces dollar)
local function from_en(text)
-- Input is a string representing a number in en digits with '.' decimal mark,
-- without digit grouping (which is done just after calling this).
-- Return the translation of the string with numdot and digits in local language.
if numdot ~= '.' then
text = text:gsub('%.', numdot)
end
if from_en_table then
text = text:gsub('%d', from_en_table)
end
return text
end
local function to_en(text)
-- Input is a string representing a number in the local language with
-- an optional numdot decimal mark and numsep digit grouping.
-- Return the translation of the string with '.' mark and en digits,
-- and no separators (they have to be removed here to handle cases like
-- numsep = '.' and numdot = ',' with input "1.234.567,8").
if to_en_table then
text = ustring.gsub(text, '%d', to_en_table)
end
if numsep_remove then
text = text:gsub(numsep_remove, '')
end
if numsep_remove2 then
text = text:gsub(numsep_remove2, '')
end
if numdot ~= '.' then
text = text:gsub(numdot, '.')
end
return text
end
local function decimal_mark(text)
-- Return ',' if text probably is using comma for decimal mark, or has no decimal mark.
-- Return '.' if text probably is using dot for decimal mark.
-- Otherwise return nothing (decimal mark not known).
if not text:find('[.,]') then return ',' end
text = text:gsub('^%-', ''):gsub('%+%d+/%d+$', ''):gsub('[Ee]%-?%d+$', '')
local decimal =
text:match('^0?([.,])%d+$') or
text:match('%d([.,])%d?%d?$') or
text:match('%d([.,])%d%d%d%d+$')
if decimal then return decimal end
if text:match('%.%d+%.') then return ',' end
if text:match('%,%d+,') then return '.' end
end
local add_warning, with_separator -- forward declarations
local function to_en_with_check(text, parms)
-- Version of to_en() for a wiki using numdot = ',' and numsep = '.' to check
-- text (an input number as a string) which might have been copied from enwiki.
-- For example, in '1.234' the '.' could be a decimal mark or a group separator.
-- From viwiki.
if to_en_table then
text = ustring.gsub(text, '%d', to_en_table)
end
if decimal_mark(text) == '.' then
local original = text
text = text:gsub(',', '') -- for example, interpret "1,234.5" as an enwiki value
if parms then
add_warning(parms, 0, 'cvt_enwiki_num', original, with_separator({}, text))
end
else
if numsep_remove then
text = text:gsub(numsep_remove, '')
end
if numsep_remove2 then
text = text:gsub(numsep_remove2, '')
end
if numdot ~= '.' then
text = text:gsub(numdot, '.')
end
end
return text
end
local function omit_separator(id)
-- Return true if there should be no separator before id (a unit symbol or name).
-- For zhwiki, there should be no separator if id uses local characters.
-- The following kludge should be a sufficient test.
if omitsep then
if id:sub(1, 2) == '-{' then -- for "-{...}-" content language variant
return true
end
if id:byte() > 127 then
local first = usub(id, 1, 1)
if first ~= 'Å' and first ~= '°' and first ~= 'µ' then
return true
end
end
end
return id:sub(1, 1) == '/' -- no separator before units like "/ha"
end
local spell_module -- name of module that can spell numbers
local speller -- function from that module to handle spelling (set if needed)
local wikidata_module, wikidata_data_module -- names of Wikidata modules
local wikidata_code, wikidata_data -- exported tables from those modules (set if needed)
local function set_config(args)
-- Set configuration options from template #invoke or defaults.
config = args
maxsigfig = config.maxsigfig or 14 -- maximum number of significant figures
local data_module, text_module
local sandbox = config.sandbox and ('/' .. config.sandbox) or ''
data_module = "Module:Convert/data" .. sandbox
text_module = "Module:Convert/text" .. sandbox
extra_module = "Module:Convert/extra" .. sandbox
wikidata_module = "Module:Convert/wikidata" .. sandbox
wikidata_data_module = "Module:Convert/wikidata/data" .. sandbox
spell_module = "Module:ConvertNumeric"
data_code = mw.loadData(data_module)
text_code = mw.loadData(text_module)
all_units = data_code.all_units
local translation = text_code.translation_table
if translation then
numdot = translation.numdot
numsep = translation.numsep
if numdot == ',' and numsep == '.' then
if text_code.all_messages.cvt_enwiki_num then
to_en = to_en_with_check
end
end
if translation.group then
group_method = translation.group
end
if translation.per_word then
per_word = translation.per_word
end
if translation.plural_suffix then
plural_suffix = translation.plural_suffix
end
varname = translation.varname
from_en_table = translation.from_en
local use_workaround = true
if use_workaround then
-- 2013-07-05 workaround bug by making a copy of the required table.
-- mw.ustring.gsub fails with a table (to_en_table) as the replacement,
-- if the table is accessed via mw.loadData.
local source = translation.to_en
if source then
to_en_table = {}
for k, v in pairs(source) do
to_en_table[k] = v
end
end
else
to_en_table = translation.to_en
end
if translation.lang == 'en default' then
en_default = true -- for hiwiki
end
omitsep = translation.omitsep -- for zhwiki
end
numdot = config.numdot or numdot or '.' -- decimal mark before fractional digits
numsep = config.numsep or numsep or ',' -- group separator for numbers
-- numsep should be ',' or '.' or '' or ' ' or a Unicode character.
-- numsep_remove must work in a regex to identify separators to be removed.
if numsep ~= '' then
numsep_remove = (numsep == '.') and '%.' or numsep
end
if numsep ~= ',' and numdot ~= ',' then
numsep_remove2 = ',' -- so numbers copied from enwiki will work
end
end
local function collection()
-- Return a table to hold items.
return {
n = 0,
add = function (self, item)
self.n = self.n + 1
self[self.n] = item
end,
}
end
local function divide(numerator, denominator)
-- Return integers quotient, remainder resulting from dividing the two
-- given numbers, which should be unsigned integers.
local quotient, remainder = floor(numerator / denominator), numerator % denominator
if not (0 <= remainder and remainder < denominator) then
-- Floating point limits may need this, as in {{convert|160.02|Ym|ydftin}}.
remainder = 0
end
return quotient, remainder
end
local function split(text, delimiter)
-- Return a numbered table with fields from splitting text.
-- The delimiter is used in a regex without escaping (for example, '.' would fail).
-- Each field has any leading/trailing whitespace removed.
local t = {}
text = text .. delimiter -- to get last item
for item in text:gmatch('%s*(.-)%s*' .. delimiter) do
table.insert(t, item)
end
return t
end
local function strip(text)
-- If text is a string, return its content with no leading/trailing
-- whitespace. Otherwise return nil (a nil argument gives a nil result).
if type(text) == 'string' then
return text:match("^%s*(.-)%s*$")
end
end
local function table_len(t)
-- Return length (<100) of a numbered table to replace #t which is
-- documented to not work if t is accessed via mw.loadData().
for i = 1, 100 do
if t[i] == nil then
return i - 1
end
end
end
local function wanted_category(catkey, catsort, want_warning)
-- Return message category if it is wanted in current namespace,
-- otherwise return ''.
local cat
local title = mw.title.getCurrentTitle()
if title then
local nsdefault = '0' -- default namespace: '0' = article; '0,10' = article and template
local namespace = title.namespace
for _, v in ipairs(split(config.nscat or nsdefault, ',')) do
if namespace == tonumber(v) then
cat = text_code.all_categories[want_warning and 'warning' or catkey]
if catsort and catsort ~= '' and cat:sub(-2) == ']]' then
cat = cat:sub(1, -3) .. '|' .. mw.text.nowiki(usub(catsort, 1, 20)) .. ']]'
end
break
end
end
end
return cat or ''
end
local function message(parms, mcode, is_warning)
-- Return wikitext for an error message, including category if specified
-- for the message type.
-- mcode = numbered table specifying the message:
-- mcode[1] = 'cvt_xxx' (string used as a key to get message info)
-- mcode[2] = 'parm1' (string to replace '$1' if any in message)
-- mcode[3] = 'parm2' (string to replace '$2' if any in message)
-- mcode[4] = 'parm3' (string to replace '$3' if any in message)
local msg
if type(mcode) == 'table' then
if mcode[1] == 'cvt_no_output' then
-- Some errors should cause convert to output an empty string,
-- for example, for an optional field in an infobox.
return ''
end
msg = text_code.all_messages[mcode[1]]
end
parms.have_problem = true
local function subparm(fmt, ...)
local rep = {}
for i, v in ipairs({...}) do
rep['$' .. i] = v
end
return (fmt:gsub('$%d+', rep))
end
if msg then
local parts = {}
local regex, replace = msg.regex, msg.replace
for i = 1, 3 do
local limit = 40
local s = mcode[i + 1]
if s then
if regex and replace then
s = s:gsub(regex, replace)
limit = nil -- allow long "should be" messages
end
-- Escape user input so it does not break the message.
-- To avoid tags (like {{convert|1<math>23</math>|m}}) breaking
-- the mouseover title, any strip marker starting with char(127) is
-- replaced with '...' (text not needing i18n).
local append
local pos = s:find(string.char(127), 1, true)
if pos then
append = '...'
s = s:sub(1, pos - 1)
end
if limit and ulen(s) > limit then
s = usub(s, 1, limit)
append = '...'
end
s = mw.text.nowiki(s) .. (append or '')
else
s = '?'
end
parts['$' .. i] = s
end
local function ispreview()
-- Return true if a prominent message should be shown.
if parms.test == 'preview' or parms.test == 'nopreview' then
-- For testing, can preview a real message or simulate a preview
-- when running automated tests.
return parms.test == 'preview'
end
local success, revid = pcall(function ()
return (parms.frame):preprocess('{{REVISIONID}}') end)
return success and (revid == '')
end
local want_warning = is_warning and
not config.warnings and -- show unobtrusive warnings if config.warnings not configured
not msg.nowarn -- but use msg settings, not standard warning, if specified
local title = string.gsub(msg[1] or 'Missing message', '$%d+', parts)
local text = want_warning and '*' or msg[2] or 'Missing message'
local cat = wanted_category(msg[3], mcode[2], want_warning)
local anchor = msg[4] or ''
local fmtkey = ispreview() and 'cvt_format_preview' or
(want_warning and 'cvt_format2' or msg.format or 'cvt_format')
local fmt = text_code.all_messages[fmtkey] or 'convert: bug'
return subparm(fmt, title:gsub('"', '"'), text, cat, anchor)
end
return 'Convert internal error: unknown message'
end
function add_warning(parms, level, key, text1, text2) -- for forward declaration above
-- If enabled, add a warning that will be displayed after the convert result.
-- A higher level is more verbose: more kinds of warnings are displayed.
-- To reduce output noise, only the first warning is displayed.
if level <= (tonumber(config.warnings) or 1) then
if parms.warnings == nil then
parms.warnings = message(parms, { key, text1, text2 }, true)
end
end
end
local function spell_number(parms, inout, number, numerator, denominator)
-- Return result of spelling (number, numerator, denominator), or
-- return nil if spelling is not available or not supported for given text.
-- Examples (each value must be a string or nil):
-- number numerator denominator output
-- ------ --------- ----------- -------------------
-- "1.23" nil nil one point two three
-- "1" "2" "3" one and two thirds
-- nil "2" "3" two thirds
if not speller then
local function get_speller(module)
return require(module).spell_number
end
local success
success, speller = pcall(get_speller, spell_module)
if not success or type(speller) ~= 'function' then
add_warning(parms, 1, 'cvt_no_spell', 'spell')
return nil
end
end
local case
if parms.spell_upper == inout then
case = true
parms.spell_upper = nil -- only uppercase first word in a multiple unit
end
local sp = not parms.opt_sp_us
local adj = parms.opt_adjectival
return speller(number, numerator, denominator, case, sp, adj)
end
------------------------------------------------------------------------
-- BEGIN: Code required only for built-in units.
-- LATER: If need much more code, move to another module to simplify this module.
local function speed_of_sound(altitude)
-- This is for the Mach built-in unit of speed.
-- Return speed of sound in metres per second at given altitude in feet.
-- If no altitude given, use default (zero altitude = sea level).
-- Table gives speed of sound in miles per hour at various altitudes:
-- altitude = -17,499 to 402,499 feet
-- mach_table[a + 4] = s where
-- a = (altitude / 5000) rounded to nearest integer (-3 to 80)
-- s = speed of sound (mph) at that altitude
-- LATER: Should calculate result from an interpolation between the next
-- lower and higher altitudes in table, rather than rounding to nearest.
-- From: http://www.aerospaceweb.org/question/atmosphere/q0112.shtml
local mach_table = { -- a =
799.5, 787.0, 774.2, 761.207051, -- -3 to 0
748.0, 734.6, 721.0, 707.0, 692.8, 678.3, 663.5, 660.1, 660.1, 660.1, -- 1 to 10
660.1, 660.1, 660.1, 662.0, 664.3, 666.5, 668.9, 671.1, 673.4, 675.6, -- 11 to 20
677.9, 683.7, 689.9, 696.0, 702.1, 708.1, 714.0, 719.9, 725.8, 731.6, -- 21 to 30
737.3, 737.7, 737.7, 736.2, 730.5, 724.6, 718.8, 712.9, 707.0, 701.0, -- 31 to 40
695.0, 688.9, 682.8, 676.6, 670.4, 664.1, 657.8, 652.9, 648.3, 643.7, -- 41 to 50
639.1, 634.4, 629.6, 624.8, 620.0, 615.2, 613.2, 613.2, 613.2, 613.5, -- 51 to 60
614.4, 615.3, 616.7, 619.8, 623.4, 629.7, 635.0, 641.1, 650.6, 660.0, -- 61 to 70
672.5, 674.3, 676.1, 677.9, 679.7, 681.5, 683.3, 685.1, 686.8, 688.6, -- 71 to 80
}
altitude = altitude or 0
local a = (altitude < 0) and -altitude or altitude
a = floor(a / 5000 + 0.5)
if altitude < 0 then
a = -a
end
if a < -3 then
a = -3
elseif a > 80 then
a = 80
end
return mach_table[a + 4] * 0.44704 -- mph converted to m/s
end
-- END: Code required only for built-in units.
------------------------------------------------------------------------
local function add_style(parms, class)
-- Add selected template style to parms if not already present.
parms.templatestyles = parms.templatestyles or {}
if not parms.templatestyles[class] then
parms.templatestyles[class] = parms.frame:extensionTag({
name = 'templatestyles', args = { src = text_code.titles[class] }
})
end
end
local function get_styles(parms)
-- Return string of required template styles, empty if none.
if parms.templatestyles then
local t = {}
for _, v in pairs(parms.templatestyles) do
table.insert(t, v)
end
return table.concat(t)
end
return ''
end
local function get_range(word)
-- Return a range (string or table) corresponding to word (like "to"),
-- or return nil if not a range word.
local ranges = text_code.ranges
return ranges.types[word] or ranges.types[ranges.aliases[word]]
end
local function check_mismatch(unit1, unit2)
-- If unit1 cannot be converted to unit2, return an error message table.
-- This allows conversion between units of the same type, and between
-- Nm (normally torque) and ftlb (energy), as in gun-related articles.
-- This works because Nm is the base unit (scale = 1) for both the
-- primary type (torque), and the alternate type (energy, where Nm = J).
-- A match occurs if the primary types are the same, or if unit1 matches
-- the alternate type of unit2, and vice versa. That provides a whitelist
-- of which conversions are permitted between normally incompatible types.
if unit1.utype == unit2.utype or
(unit1.utype == unit2.alttype and unit1.alttype == unit2.utype) then
return nil
end
return { 'cvt_mismatch', unit1.utype, unit2.utype }
end
local function override_from(out_table, in_table, fields)
-- Copy the specified fields from in_table to out_table, but do not
-- copy nil fields (keep any corresponding field in out_table).
for _, field in ipairs(fields) do
if in_table[field] then
out_table[field] = in_table[field]
end
end
end
local function shallow_copy(t)
-- Return a shallow copy of table t.
-- Do not need the features and overhead of the Scribunto mw.clone().
local result = {}
for k, v in pairs(t) do
result[k] = v
end
return result
end
local unit_mt = {
-- Metatable to get missing values for a unit that does not accept SI prefixes.
-- Warning: The boolean value 'false' is returned for any missing field
-- so __index is not called twice for the same field in a given unit.
__index = function (self, key)
local value
if key == 'name1' or key == 'sym_us' then
value = self.symbol
elseif key == 'name2' then
value = self.name1 .. plural_suffix
elseif key == 'name1_us' then
value = self.name1
if not rawget(self, 'name2_us') then
-- If name1_us is 'foot', do not make name2_us by appending plural_suffix.
self.name2_us = self.name2
end
elseif key == 'name2_us' then
local raw1_us = rawget(self, 'name1_us')
if raw1_us then
value = raw1_us .. plural_suffix
else
value = self.name2
end
elseif key == 'link' then
value = self.name1
else
value = false
end
rawset(self, key, value)
return value
end
}
local function prefixed_name(unit, name, index)
-- Return unit name with SI prefix inserted at correct position.
-- index = 1 (name1), 2 (name2), 3 (name1_us), 4 (name2_us).
-- The position is a byte (not character) index, so use Lua's sub().
local pos = rawget(unit, 'prefix_position')
if type(pos) == 'string' then
pos = tonumber(split(pos, ',')[index])
end
if pos then
return name:sub(1, pos - 1) .. unit.si_name .. name:sub(pos)
end
return unit.si_name .. name
end
local unit_prefixed_mt = {
-- Metatable to get missing values for a unit that accepts SI prefixes.
-- Before use, fields si_name, si_prefix must be defined.
-- The unit must define _symbol, _name1 and
-- may define _sym_us, _name1_us, _name2_us
-- (_sym_us, _name2_us may be defined for a language using sp=us
-- to refer to a variant unrelated to U.S. units).
__index = function (self, key)
local value
if key == 'symbol' then
value = self.si_prefix .. self._symbol
if value == 'l' then value = 'L' end
elseif key == 'sym_us' then
value = rawget(self, '_sym_us')
if value then
value = self.si_prefix .. value
else
value = self.symbol
end
elseif key == 'name1' then
value = prefixed_name(self, self._name1, 1)
elseif key == 'name2' then
value = rawget(self, '_name2')
if value then
value = prefixed_name(self, value, 2)
else
value = self.name1 .. plural_suffix
end
elseif key == 'name1_us' then
value = rawget(self, '_name1_us')
if value then
value = prefixed_name(self, value, 3)
else
value = self.name1
end
elseif key == 'name2_us' then
value = rawget(self, '_name2_us')
if value then
value = prefixed_name(self, value, 4)
elseif rawget(self, '_name1_us') then
value = self.name1_us .. plural_suffix
else
value = self.name2
end
elseif key == 'link' then
value = self.name1
else
value = false
end
rawset(self, key, value)
return value
end
}
local unit_per_mt = {
-- Metatable to get values for a per unit of form "x/y".
-- This is never called to determine a unit name or link because per units
-- are handled as a special case.
-- Similarly, the default output is handled elsewhere, and for a symbol
-- this is only called from get_default() for default_exceptions.
__index = function (self, key)
local value
if key == 'symbol' then
local per = self.per
local unit1, unit2 = per[1], per[2]
if unit1 then
value = unit1[key] .. '/' .. unit2[key]
else
value = '/' .. unit2[key]
end
elseif key == 'sym_us' then
value = self.symbol
elseif key == 'scale' then
local per = self.per
local unit1, unit2 = per[1], per[2]
value = (unit1 and unit1.scale or 1) * self.scalemultiplier / unit2.scale
else
value = false
end
rawset(self, key, value)
return value
end
}
local function make_per(unitcode, unit_table, ulookup)
-- Return true, t where t is a per unit with unit codes expanded to unit tables,
-- or return false, t where t is an error message table.
local result = {
unitcode = unitcode,
utype = unit_table.utype,
per = {}
}
override_from(result, unit_table, { 'invert', 'iscomplex', 'default', 'link', 'symbol', 'symlink' })
result.symbol_raw = (result.symbol or false) -- to distinguish between a defined exception and a metatable calculation
local prefix
for i, v in ipairs(unit_table.per) do
if i == 1 and v == '' then
-- First unit symbol can be empty; that gives a nil first unit table.
elseif i == 1 and text_code.currency[v] then
prefix = currency_text or v
else
local success, t = ulookup(v)
if not success then return false, t end
result.per[i] = t
end
end
local multiplier = unit_table.multiplier
if not result.utype then
-- Creating an automatic per unit.
local unit1 = result.per[1]
local utype = (unit1 and unit1.utype or prefix or '') .. '/' .. result.per[2].utype
local t = data_code.per_unit_fixups[utype]
if t then
if type(t) == 'table' then
utype = t.utype or utype
result.link = result.link or t.link
multiplier = multiplier or t.multiplier
else
utype = t
end
end
result.utype = utype
end
result.scalemultiplier = multiplier or 1
result.vprefix = prefix or false -- set to non-nil to avoid calling __index
return true, setmetatable(result, unit_per_mt)
end
local function lookup(parms, unitcode, what, utable, fails, depth)
-- Return true, t where t is a copy of the unit's converter table,
-- or return false, t where t is an error message table.
-- Parameter 'what' determines whether combination units are accepted:
-- 'no_combination' : single unit only
-- 'any_combination' : single unit or combination or output multiple
-- 'only_multiple' : single unit or output multiple only
-- Parameter unitcode is a symbol (like 'g'), with an optional SI prefix (like 'kg').
-- If, for example, 'kg' is in this table, that entry is used;
-- otherwise the prefix ('k') is applied to the base unit ('g').
-- If unitcode is a known combination code (and if allowed by what),
-- a table of output multiple unit tables is included in the result.
-- For compatibility with the old template, an underscore in a unitcode is
-- replaced with a space so usage like {{convert|350|board_feet}} works.
-- Wikignomes may also put two spaces or " " in combinations, so
-- replace underscore, " ", and multiple spaces with a single space.
utable = utable or parms.unittable or all_units
fails = fails or {}
depth = depth and depth + 1 or 1
if depth > 9 then
-- There are ways to mistakenly define units which result in infinite
-- recursion when lookup() is called. That gives a long delay and very
-- confusing error messages, so the depth parameter is used as a guard.
return false, { 'cvt_lookup', unitcode }
end
if unitcode == nil or unitcode == '' then
return false, { 'cvt_no_unit' }
end
unitcode = unitcode:gsub('_', ' '):gsub(' ', ' '):gsub(' +', ' ')
local function call_make_per(t)
return make_per(unitcode, t,
function (ucode) return lookup(parms, ucode, 'no_combination', utable, fails, depth) end
)
end
local t = utable[unitcode]
if t then
if t.shouldbe then
return false, { 'cvt_should_be', t.shouldbe }
end
if t.sp_us then
parms.opt_sp_us = true
end
local target = t.target -- nil, or unitcode is an alias for this target
if target then
local success, result = lookup(parms, target, what, utable, fails, depth)
if not success then return false, result end
override_from(result, t, { 'customary', 'default', 'link', 'symbol', 'symlink', 'usename' })
local multiplier = t.multiplier
if multiplier then
result.multiplier = tostring(multiplier)
result.scale = result.scale * multiplier
end
return true, result
end
if t.per then
return call_make_per(t)
end
local combo = t.combination -- nil or a table of unitcodes
if combo then
local multiple = t.multiple
if what == 'no_combination' or (what == 'only_multiple' and not multiple) then
return false, { 'cvt_bad_unit', unitcode }
end
-- Recursively create a combination table containing the
-- converter table of each unitcode.
local result = { utype = t.utype, multiple = multiple, combination = {} }
local cvt = result.combination
for i, v in ipairs(combo) do
local success, t = lookup(parms, v, multiple and 'no_combination' or 'only_multiple', utable, fails, depth)
if not success then return false, t end
cvt[i] = t
end
return true, result
end
local result = shallow_copy(t)
result.unitcode = unitcode
if result.prefixes then
result.si_name = ''
result.si_prefix = ''
return true, setmetatable(result, unit_prefixed_mt)
end
return true, setmetatable(result, unit_mt)
end
local SIprefixes = text_code.SIprefixes
for plen = SIprefixes[1] or 2, 1, -1 do
-- Look for an SI prefix; should never occur with an alias.
-- Check for longer prefix first ('dam' is decametre).
-- SIprefixes[1] = prefix maximum #characters (as seen by mw.ustring.sub).
local prefix = usub(unitcode, 1, plen)
local si = SIprefixes[prefix]
if si then
local t = utable[usub(unitcode, plen+1)]
if t and t.prefixes then
local result = shallow_copy(t)
result.unitcode = unitcode
result.si_name = parms.opt_sp_us and si.name_us or si.name
result.si_prefix = si.prefix or prefix
result.scale = t.scale * 10 ^ (si.exponent * t.prefixes)
return true, setmetatable(result, unit_prefixed_mt)
end
end
end
-- Accept user-defined combinations like "acre+m2+ha" or "acre m2 ha" for output.
-- If '+' is used, each unit code can include a space, and any error is fatal.
-- If ' ' is used and if each space-separated word is a unit code, it is a combo,
-- but errors are not fatal so the unit code can be looked up as an extra unit.
local err_is_fatal
local combo = collection()
if unitcode:find('+', 1, true) then
err_is_fatal = true
for item in (unitcode .. '+'):gmatch('%s*(.-)%s*%+') do
if item ~= '' then
combo:add(item)
end
end
elseif unitcode:find('%s') then
for item in unitcode:gmatch('%S+') do
combo:add(item)
end
end
if combo.n > 1 then
local function lookup_combo()
if what == 'no_combination' or what == 'only_multiple' then
return false, { 'cvt_bad_unit', unitcode }
end
local result = { combination = {} }
local cvt = result.combination
for i, v in ipairs(combo) do
local success, t = lookup(parms, v, 'only_multiple', utable, fails, depth)
if not success then return false, t end
if i == 1 then
result.utype = t.utype
else
local mismatch = check_mismatch(result, t)
if mismatch then
return false, mismatch
end
end
cvt[i] = t
end
return true, result
end
local success, result = lookup_combo()
if success or err_is_fatal then
return success, result
end
end
-- Accept any unit with an engineering notation prefix like "e6cuft"
-- (million cubic feet), but not chained prefixes like "e3e6cuft",
-- and not if the unit is a combination or multiple,
-- and not if the unit has an offset or is a built-in.
-- Only en digits are accepted.
local e, exponent, baseunit = unitcode:match('^([Ee])(%d+)(.*)')
if exponent then
local engscale = text_code.eng_scales[exponent]
if engscale then
local success, result = lookup(parms, baseunit, 'no_combination', utable, fails, depth)
if success and not (result.offset or result.builtin or result.engscale) then
if e == 'E' then
result.this_number_word = true
unitcode = 'e' .. unitcode:sub(2)
end
result.unitcode = unitcode -- 'e6cuft' not 'cuft'
result.defkey = unitcode -- key to lookup default exception
result.engscale = engscale
result.scale = result.scale * 10 ^ tonumber(exponent)
return true, result
end
end
end
-- Look for x/y; split on right-most slash to get scale correct (x/y/z is x/y per z).
local top, bottom = unitcode:match('^(.-)/([^/]+)$')
if top and not unitcode:find('e%d') then
-- If valid, create an automatic per unit for an "x/y" unit code.
-- The unitcode must not include extraneous spaces.
-- Engineering notation (apart from at start and which has been stripped before here),
-- is not supported so do not make a per unit if find text like 'e3' in unitcode.
local success, result = call_make_per({ per = {top, bottom} })
if success then
return true, result
end
end
if not parms.opt_ignore_error and not get_range(unitcode) then
-- Want the "what links here" list for the extra_module to show only cases
-- where an extra unit is used, so do not require it if invoked from {{val}}
-- or if looking up a range word which cannot be a unit.
if not extra_units then
local success, extra = pcall(function () return require(extra_module).extra_units end)
if success and type(extra) == 'table' then
extra_units = extra
end
end
if extra_units then
-- A unit in one data table might refer to a unit in the other table, so
-- switch between them, relying on fails or depth to terminate loops.
if not fails[unitcode] then
fails[unitcode] = true
local other = (utable == all_units) and extra_units or all_units
local success, result = lookup(parms, unitcode, what, other, fails, depth)
if success then
return true, result
end
end
end
end
if to_en_table then
-- At fawiki it is common to translate all digits so a unit like "km2" becomes "km۲".
local en_code = ustring.gsub(unitcode, '%d', to_en_table)
if en_code ~= unitcode then
return lookup(parms, en_code, what, utable, fails, depth)
end
end
return false, { 'cvt_unknown', unitcode }
end
local function valid_number(num)
-- Return true if num is a valid number.
-- In Scribunto (different from some standard Lua), when expressed as a string,
-- overflow or other problems are indicated with text like "inf" or "nan"
-- which are regarded as invalid here (each contains "n").
if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then
return true
end
end
local function hyphenated(name, parts)
-- Return a hyphenated form of given name (for adjectival usage).
-- The name may be linked and the target of the link must not be changed.
-- Hypothetical examples:
-- [[long ton|ton]] → [[long ton|ton]] (no change)
-- [[tonne|long ton]] → [[tonne|long-ton]]
-- [[metric ton|long ton]] → [[metric ton|long-ton]]
-- [[long ton]] → [[long ton|long-ton]]
-- Input can also have multiple links in a single name like:
-- [[United States customary units|U.S.]] [[US gallon|gallon]]
-- [[mile]]s per [[United States customary units|U.S.]] [[quart]]
-- [[long ton]]s per [[short ton]]
-- Assume that links cannot be nested (never like "[[abc[[def]]ghi]]").
-- This uses a simple and efficient procedure that works for most cases.
-- Some units (if used) would require more, and can later think about
-- adding a method to handle exceptions.
-- The procedure is to replace each space with a hyphen, but
-- not a space after ')' [for "(pre-1954 US) nautical mile"], and
-- not spaces immediately before '(' or in '(...)' [for cases like
-- "British thermal unit (ISO)" and "Calorie (International Steam Table)"].
if name:find(' ', 1, true) then
if parts then
local pos
if name:sub(1, 1) == '(' then
pos = name:find(')', 1, true)
if pos then
return name:sub(1, pos+1) .. name:sub(pos+2):gsub(' ', '-')
end
elseif name:sub(-1) == ')' then
pos = name:find('(', 1, true)
if pos then
return name:sub(1, pos-2):gsub(' ', '-') .. name:sub(pos-1)
end
end
return name:gsub(' ', '-')
end
parts = collection()
for before, item, after in name:gmatch('([^[]*)(%[%[[^[]*%]%])([^[]*)') do
if item:find(' ', 1, true) then
local prefix
local plen = item:find('|', 1, true)
if plen then
prefix = item:sub(1, plen)
item = item:sub(plen + 1, -3)
else
prefix = item:sub(1, -3) .. '|'
item = item:sub(3, -3)
end
item = prefix .. hyphenated(item, parts) .. ']]'
end
parts:add(before:gsub(' ', '-') .. item .. after:gsub(' ', '-'))
end
if parts.n == 0 then
-- No link like "[[...]]" was found in the original name.
parts:add(hyphenated(name, parts))
end
return table.concat(parts)
end
return name
end
local function hyphenated_maybe(parms, want_name, sep, id, inout)
-- Return s, f where
-- s = id, possibly modified
-- f = true if hyphenated
-- Possible modifications: hyphenate; prepend '-'; append mid text.
if id == nil or id == '' then
return ''
end
local mid = (inout == (parms.opt_flip and 'out' or 'in')) and parms.mid or ''
if want_name then
if parms.opt_adjectival then
return '-' .. hyphenated(id) .. mid, true
end
if parms.opt_add_s and id:sub(-1) ~= 's' then
id = id .. 's' -- for nowiki
end
end
return sep .. id .. mid
end
local function use_minus(text)
-- Return text with Unicode minus instead of '-', if present.
if text:sub(1, 1) == '-' then
return MINUS .. text:sub(2)
end
return text
end
local function digit_groups(parms, text, method)
-- Return a numbered table of groups of digits (left-to-right, in local language).
-- Parameter method is a number or nil:
-- 3 for 3-digit grouping (default), or
-- 2 for 3-then-2 grouping (only for digits before decimal mark).
local len_right
local len_left = text:find('.', 1, true)
if len_left then
len_right = #text - len_left
len_left = len_left - 1
else
len_left = #text
end
local twos = method == 2 and len_left > 5
local groups = collection()
local run = len_left
local n
if run < 4 or (run == 4 and parms.opt_comma5) then
if parms.opt_gaps then
n = run
else
n = #text
end
elseif twos then
n = run % 2 == 0 and 1 or 2
else
n = run % 3 == 0 and 3 or run % 3
end
while run > 0 do
groups:add(n)
run = run - n
n = (twos and run > 3) and 2 or 3
end
if len_right then
if groups.n == 0 then
groups:add(0)
end
if parms.opt_gaps and len_right > 3 then
local want4 = not parms.opt_gaps3 -- true gives no gap before trailing single digit
local isfirst = true
run = len_right
while run > 0 do
n = (want4 and run == 4) and 4 or (run > 3 and 3 or run)
if isfirst then
isfirst = false
groups[groups.n] = groups[groups.n] + 1 + n
else
groups:add(n)
end
run = run - n
end
else
groups[groups.n] = groups[groups.n] + 1 + len_right
end
end
local pos = 1
for i, length in ipairs(groups) do
groups[i] = from_en(text:sub(pos, pos + length - 1))
pos = pos + length
end
return groups
end
function with_separator(parms, text) -- for forward declaration above
-- Input text is a number in en digits with optional '.' decimal mark.
-- Return an equivalent, formatted for display:
-- with a custom decimal mark instead of '.', if wanted
-- with thousand separators inserted, if wanted
-- digits in local language
-- The given text is like '123' or '123.' or '12345.6789'.
-- The text has no sign (caller inserts that later, if necessary).
-- When using gaps, they are inserted before and after the decimal mark.
-- Separators are inserted only before the decimal mark.
-- A trailing dot (as in '123.') is removed because their use appears to
-- be accidental, and such a number should be shown as '123' or '123.0'.
-- It is useful for convert to suppress the dot so, for example, '4000.'
-- is a simple way of indicating that all the digits are significant.
if text:sub(-1) == '.' then
text = text:sub(1, -2)
end
if #text < 4 or parms.opt_nocomma or numsep == '' then
return from_en(text)
end
local groups = digit_groups(parms, text, group_method)
if parms.opt_gaps then
if groups.n <= 1 then
return groups[1] or ''
end
local nowrap = '<span style="white-space: nowrap">'
local gap = '<span style="margin-left: 0.25em">'
local close = '</span>'
return nowrap .. groups[1] .. gap .. table.concat(groups, close .. gap, 2, groups.n) .. close .. close
end
return table.concat(groups, numsep)
end
-- An input value like 1.23e12 is displayed using scientific notation (1.23×10¹²).
-- That also makes the output use scientific notation, except for small values.
-- In addition, very small or very large output values use scientific notation.
-- Use format(fmtpower, significand, '10', exponent) where each argument is a string.
local fmtpower = '%s<span style="margin:0 .15em 0 .25em">×</span>%s<sup>%s</sup>'
local function with_exponent(parms, show, exponent)
-- Return wikitext to display the implied value in scientific notation.
-- Input uses en digits; output uses digits in local language.
return format(fmtpower, with_separator(parms, show), from_en('10'), use_minus(from_en(tostring(exponent))))
end
local function make_sigfig(value, sigfig)
-- Return show, exponent that are equivalent to the result of
-- converting the number 'value' (where value >= 0) to a string,
-- rounded to 'sigfig' significant figures.
-- The returned items are:
-- show: a string of digits; no sign and no dot;
-- there is an implied dot before show.
-- exponent: a number (an integer) to shift the implied dot.
-- Resulting value = tonumber('.' .. show) * 10^exponent.
-- Examples:
-- make_sigfig(23.456, 3) returns '235', 2 (.235 * 10^2).
-- make_sigfig(0.0023456, 3) returns '235', -2 (.235 * 10^-2).
-- make_sigfig(0, 3) returns '000', 1 (.000 * 10^1).
if sigfig <= 0 then
sigfig = 1
elseif sigfig > maxsigfig then
sigfig = maxsigfig
end
if value == 0 then
return string.rep('0', sigfig), 1
end
local exp, fracpart = math.modf(log10(value))
if fracpart >= 0 then
fracpart = fracpart - 1
exp = exp + 1
end
local digits = format('%.0f', 10^(fracpart + sigfig))
if #digits > sigfig then
-- Overflow (for sigfig=3: like 0.9999 rounding to "1000"; need "100").
digits = digits:sub(1, sigfig)
exp = exp + 1
end
assert(#digits == sigfig, 'Bug: rounded number has wrong length')
return digits, exp
end
-- Fraction output format.
local fracfmt = {
{ -- Like {{frac}} (fraction slash).
'<span class="frac">{SIGN}<span class="num">{NUM}</span>⁄<span class="den">{DEN}</span></span>', -- 1/2
'<span class="frac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="num">{NUM}</span>⁄<span class="den">{DEN}</span></span>', -- 1+2/3
style = 'frac',
},
{ -- Like {{sfrac}} (stacked fraction, that is, horizontal bar).
'<span class="sfrac tion">{SIGN}<span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span>', -- 1//2
'<span class="sfrac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="tion"><span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span></span>', -- 1+2//3
style = 'sfrac',
},
}
local function format_fraction(parms, inout, negative, wholestr, numstr, denstr, do_spell, style)
-- Return wikitext for a fraction, possibly spelled.
-- Inputs use en digits and have no sign; output uses digits in local language.
local wikitext
if not style then
style = parms.opt_fraction_horizontal and 2 or 1
end
if wholestr == '' then
wholestr = nil
end
local substitute = {
SIGN = negative and MINUS or '',
WHOLE = wholestr and with_separator(parms, wholestr),
NUM = from_en(numstr),
DEN = from_en(denstr),
}
wikitext = fracfmt[style][wholestr and 2 or 1]:gsub('{(%u+)}', substitute)
if do_spell then
if negative then
if wholestr then
wholestr = '-' .. wholestr
else
numstr = '-' .. numstr
end
end
local s = spell_number(parms, inout, wholestr, numstr, denstr)
if s then
return s
end
end
add_style(parms, fracfmt[style].style)
return wikitext
end
local function format_number(parms, show, exponent, isnegative)
-- Parameter show is a string or a table containing strings.
-- Each string is a formatted number in en digits and optional '.' decimal mark.
-- A table represents a fraction: integer, numerator, denominator;
-- if a table is given, exponent must be nil.
-- Return t where t is a table with fields:
-- show = wikitext formatted to display implied value
-- (digits in local language)
-- is_scientific = true if show uses scientific notation
-- clean = unformatted show (possibly adjusted and with inserted '.')
-- (en digits)
-- sign = '' or MINUS
-- exponent = exponent (possibly adjusted)
-- The clean and exponent fields can be used to calculate the
-- rounded absolute value, if needed.
--
-- The value implied by the arguments is found from:
-- exponent is nil; and
-- show is a string of digits (no sign), with an optional dot;
-- show = '123.4' is value 123.4, '1234' is value 1234.0;
-- or:
-- exponent is an integer indicating where dot should be;
-- show is a string of digits (no sign and no dot);
-- there is an implied dot before show;
-- show does not start with '0';
-- show = '1234', exponent = 3 is value 0.1234*10^3 = 123.4.
--
-- The formatted result:
-- * Is for an output value and is spelled if wanted and possible.
-- * Includes a Unicode minus if isnegative and not spelled.
-- * Uses a custom decimal mark, if wanted.
-- * Has digits grouped where necessary, if wanted.
-- * Uses scientific notation if requested, or for very small or large values
-- (which forces result to not be spelled).
-- * Has no more than maxsigfig significant digits
-- (same as old template and {{#expr}}).
local xhi, xlo -- these control when scientific notation (exponent) is used
if parms.opt_scientific then
xhi, xlo = 4, 2 -- default for output if input uses e-notation
elseif parms.opt_scientific_always then
xhi, xlo = 0, 0 -- always use scientific notation (experimental)
else
xhi, xlo = 10, 4 -- default
end
local sign = isnegative and MINUS or ''
local maxlen = maxsigfig
local tfrac
if type(show) == 'table' then
tfrac = show
show = tfrac.wholestr
assert(exponent == nil, 'Bug: exponent given with fraction')
end
if not tfrac and not exponent then
local integer, dot, decimals = show:match('^(%d*)(%.?)(.*)')
if integer == '0' or integer == '' then
local zeros, figs = decimals:match('^(0*)([^0]?.*)')
if #figs == 0 then
if #zeros > maxlen then
show = '0.' .. zeros:sub(1, maxlen)
end
elseif #zeros >= xlo then
show = figs
exponent = -#zeros
elseif #figs > maxlen then
show = '0.' .. zeros .. figs:sub(1, maxlen)
end
elseif #integer >= xhi then
show = integer .. decimals
exponent = #integer
else
maxlen = maxlen + #dot
if #show > maxlen then
show = show:sub(1, maxlen)
end
end
end
if exponent then
local function zeros(n)
return string.rep('0', n)
end
if #show > maxlen then
show = show:sub(1, maxlen)
end
if exponent > xhi or exponent <= -xlo or (exponent == xhi and show ~= '1' .. zeros(xhi - 1)) then
-- When xhi, xlo = 10, 4 (the default), scientific notation is used if the
-- rounded value satisfies: value >= 1e9 or value < 1e-4 (1e9 = 0.1e10),
-- except if show is '1000000000' (1e9), for example:
-- {{convert|1000000000|m|m|sigfig=10}} → 1,000,000,000 metres (1,000,000,000 m)
local significand
if #show > 1 then
significand = show:sub(1, 1) .. '.' .. show:sub(2)
else
significand = show
end
return {
clean = '.' .. show,
exponent = exponent,
sign = sign,
show = sign .. with_exponent(parms, significand, exponent-1),
is_scientific = true,
}
end
if exponent >= #show then
show = show .. zeros(exponent - #show) -- result has no dot
elseif exponent <= 0 then
show = '0.' .. zeros(-exponent) .. show
else
show = show:sub(1, exponent) .. '.' .. show:sub(exponent+1)
end
end
local formatted_show
if tfrac then
show = tostring(tfrac.value) -- to set clean in returned table
formatted_show = format_fraction(parms, 'out', isnegative, tfrac.wholestr, tfrac.numstr, tfrac.denstr, parms.opt_spell_out)
else
if isnegative and show:match('^0.?0*$') then
sign = '' -- don't show minus if result is negative but rounds to zero
end
formatted_show = sign .. with_separator(parms, show)
if parms.opt_spell_out then
formatted_show = spell_number(parms, 'out', sign .. show) or formatted_show
end
end
return {
clean = show,
sign = sign,
show = formatted_show,
is_scientific = false, -- to avoid calling __index
}
end
local function extract_fraction(parms, text, negative)
-- If text represents a fraction, return
-- value, altvalue, show, denominator
-- where
-- value is a number (value of the fraction in argument text)
-- altvalue is an alternate interpretation of any fraction for the hands
-- unit where "12.1+3/4" means 12 hands 1.75 inches
-- show is a string (formatted text for display of an input value,
-- and is spelled if wanted and possible)
-- denominator is value of the denominator in the fraction
-- Otherwise, return nil.
-- Input uses en digits and '.' decimal mark (input has been translated).
-- Output uses digits in local language and local decimal mark, if any.
------------------------------------------------------------------------
-- Originally this function accepted x+y/z where x, y, z were any valid
-- numbers, possibly with a sign. For example '1.23e+2+1.2/2.4' = 123.5,
-- and '2-3/8' = 1.625. However, such usages were found to be errors or
-- misunderstandings, so since August 2014 the following restrictions apply:
-- x (if present) is an integer or has a single digit after decimal mark
-- y and z are unsigned integers
-- e-notation is not accepted
-- The overall number can start with '+' or '-' (so '12+3/4' and '+12+3/4'
-- and '-12-3/4' are valid).
-- Any leading negative sign is removed by the caller, so only inputs
-- like the following are accepted here (may have whitespace):
-- negative = false false true (there was a leading '-')
-- text = '2/3' '+2/3' '2/3'
-- text = '1+2/3' '+1+2/3' '1-2/3'
-- text = '12.3+1/2' '+12.3+1/2' '12.3-1/2'
-- Values like '12.3+1/2' are accepted, but are intended only for use
-- with the hands unit (not worth adding code to enforce that).
------------------------------------------------------------------------
local leading_plus, prefix, numstr, slashes, denstr =
text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*(/+)%s*(%d+)%s*$')
if not leading_plus then
-- Accept a single U+2044 fraction slash because that may be pasted.
leading_plus, prefix, numstr, denstr =
text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*⁄%s*(%d+)%s*$')
slashes = '/'
end
local numerator = tonumber(numstr)
local denominator = tonumber(denstr)
if numerator == nil or denominator == nil or (negative and leading_plus ~= '') then
return nil
end
local whole, wholestr
if prefix == '' then
wholestr = ''
whole = 0
else
-- Any prefix must be like '12+' or '12-' (whole number and fraction sign);
-- '12.3+' and '12.3-' are also accepted (single digit after decimal point)
-- because '12.3+1/2 hands' is valid (12 hands 3½ inches).
local num1, num2, frac_sign = prefix:match('^(%d+)(%.?%d?)%s*([+%-])$')
if num1 == nil then return nil end
if num2 == '' then -- num2 must be '' or like '.1' but not '.' or '.12'
wholestr = num1
else
if #num2 ~= 2 then return nil end
wholestr = num1 .. num2
end
if frac_sign ~= (negative and '-' or '+') then return nil end
whole = tonumber(wholestr)
if whole == nil then return nil end
end
local value = whole + numerator / denominator
if not valid_number(value) then return nil end
local altvalue = whole + numerator / (denominator * 10)
local style = #slashes -- kludge: 1 or 2 slashes can be used to select style
if style > 2 then style = 2 end
local wikitext = format_fraction(parms, 'in', negative, leading_plus .. wholestr, numstr, denstr, parms.opt_spell_in, style)
return value, altvalue, wikitext, denominator
end
local function extract_number(parms, text, another, no_fraction)
-- Return true, info if can extract a number from text,
-- where info is a table with the result,
-- or return false, t where t is an error message table.
-- Input can use en digits or digits in local language and can
-- have references at the end. Accepting references is intended
-- for use in infoboxes with a field for a value passed to convert.
-- Parameter another = true if the expected value is not the first.
-- Before processing, the input text is cleaned:
-- * Any thousand separators (valid or not) are removed.
-- * Any sign is replaced with '-' (if negative) or '' (otherwise).
-- That replaces Unicode minus with '-'.
-- If successful, the returned info table contains named fields:
-- value = a valid number
-- altvalue = a valid number, usually same as value but different
-- if fraction used (for hands unit)
-- singular = true if value is 1 or -1 (to use singular form of units)
-- clean = cleaned text with any separators and sign removed
-- (en digits and '.' decimal mark)
-- show = text formatted for output, possibly with ref strip markers
-- (digits in local language and custom decimal mark)
-- The resulting show:
-- * Is for an input value and is spelled if wanted and possible.
-- * Has a rounded value, if wanted.
-- * Has digits grouped where necessary, if wanted.
-- * If negative, a Unicode minus is used; otherwise the sign is
-- '+' (if the input text used '+'), or is '' (if no sign in input).
text = strip(text or '')
local reference
local pos = text:find('\127', 1, true)
if pos then
local before = text:sub(1, pos - 1)
local remainder = text:sub(pos)
local refs = {}
while #remainder > 0 do
local ref, spaces
ref, spaces, remainder = remainder:match('^(\127[^\127]*UNIQ[^\127]*%-ref[^\127]*\127)(%s*)(.*)')
if ref then
table.insert(refs, ref)
else
refs = {}
break
end
end
if #refs > 0 then
text = strip(before)
reference = table.concat(refs)
end
end
local clean = to_en(text, parms)
if clean == '' then
return false, { another and 'cvt_no_num2' or 'cvt_no_num' }
end
local isnegative, propersign = false, '' -- most common case
local singular, show, denominator
local value = tonumber(clean)
local altvalue
if value then
local sign = clean:sub(1, 1)
if sign == '+' or sign == '-' then
propersign = (sign == '+') and '+' or MINUS
clean = clean:sub(2)
end
if value < 0 then
isnegative = true
value = -value
end
else
local valstr
for _, prefix in ipairs({ '-', MINUS, '−' }) do
-- Including '-' sets isnegative in case input is a fraction like '-2-3/4'.
local plen = #prefix
if clean:sub(1, plen) == prefix then
valstr = clean:sub(plen + 1)
if valstr:match('^%s') then -- "- 1" is invalid but "-1 - 1/2" is ok
return false, { 'cvt_bad_num', text }
end
break
end
end
if valstr then
isnegative = true
propersign = MINUS
clean = valstr
value = tonumber(clean)
end
if value == nil then
if not no_fraction then
value, altvalue, show, denominator = extract_fraction(parms, clean, isnegative)
end
if value == nil then
return false, { 'cvt_bad_num', text }
end
if value <= 1 then
singular = true -- for example, "½ mile" or "one half mile" (singular unit)
end
end
end
if not valid_number(value) then -- for example, "1e310" may overflow
return false, { 'cvt_invalid_num' }
end
if show == nil then
-- clean is a non-empty string with no spaces, and does not represent a fraction,
-- and value = tonumber(clean) is a number >= 0.
-- If the input uses e-notation, show will be displayed using a power of ten, but
-- we use the number as given so it might not be normalized scientific notation.
-- The input value is spelled if specified so any e-notation is ignored;
-- that allows input like 2e6 to be spelled as "two million" which works
-- because the spell module converts '2e6' to '2000000' before spelling.
local function rounded(value, default, exponent)
local precision = parms.opt_ri
if precision then
local fmt = '%.' .. format('%d', precision) .. 'f'
local result = fmt:format(tonumber(value) + 2e-14) -- fudge for some common cases of bad rounding
if not exponent then
singular = (tonumber(result) == 1)
end
return result
end
return default
end
singular = (value == 1)
local scientific
local significand, exponent = clean:match('^([%d.]+)[Ee]([+%-]?%d+)')
if significand then
show = with_exponent(parms, rounded(significand, significand, exponent), exponent)
scientific = true
else
show = with_separator(parms, rounded(value, clean))
end
show = propersign .. show
if parms.opt_spell_in then
show = spell_number(parms, 'in', propersign .. rounded(value, clean)) or show
scientific = false
end
if scientific then
parms.opt_scientific = true
end
end
if isnegative and (value ~= 0) then
value = -value
altvalue = -(altvalue or value)
end
return true, {
value = value,
altvalue = altvalue or value,
singular = singular,
clean = clean,
show = show .. (reference or ''),
denominator = denominator,
}
end
local function get_number(text)
-- Return v, f where:
-- v = nil (text is not a number)
-- or
-- v = value of text (text is a number)
-- f = true if value is an integer
-- Input can use en digits or digits in local language or separators,
-- but no Unicode minus, and no fraction.
if text then
local number = tonumber(to_en(text))
if number then
local _, fracpart = math.modf(number)
return number, (fracpart == 0)
end
end
end
local function gcd(a, b)
-- Return the greatest common denominator for the given values,
-- which are known to be positive integers.
if a > b then
a, b = b, a
end
if a <= 0 then
return b
end
local r = b % a
if r <= 0 then
return a
end
if r == 1 then
return 1
end
return gcd(r, a)
end
local function fraction_table(value, denominator)
-- Return value as a string or a table:
-- * If result is a string, there is no fraction, and the result
-- is value formatted as a string of en digits.
-- * If result is a table, it represents a fraction with named fields:
-- wholestr, numstr, denstr (strings of en digits for integer, numerator, denominator).
-- The result is rounded to the nearest multiple of (1/denominator).
-- If the multiple is zero, no fraction is included.
-- No fraction is included if value is very large as the fraction would
-- be unhelpful, particularly if scientific notation is required.
-- Input value is a non-negative number.
-- Input denominator is a positive integer for the desired fraction.
if value <= 0 then
return '0'
end
if denominator <= 0 or value > 1e8 then
return format('%.2f', value)
end
local integer, decimals = math.modf(value)
local numerator = floor((decimals * denominator) +
0.5 + 2e-14) -- add fudge for some common cases of bad rounding
if numerator >= denominator then
integer = integer + 1
numerator = 0
end
local wholestr = tostring(integer)
if numerator > 0 then
local div = gcd(numerator, denominator)
if div > 1 then
numerator = numerator / div
denominator = denominator / div
end
return {
wholestr = (integer > 0) and wholestr or '',
numstr = tostring(numerator),
denstr = tostring(denominator),
value = value,
}
end
return wholestr
end
local function preunits(count, preunit1, preunit2)
-- If count is 1:
-- ignore preunit2
-- return p1
-- else:
-- preunit1 is used for preunit2 if the latter is empty
-- return p1, p2
-- where:
-- p1 is text to insert before the input unit
-- p2 is text to insert before the output unit
-- p1 or p2 may be nil to mean "no preunit"
-- Using '+' gives output like "5+ feet" (no space before, but space after).
local function withspace(text, wantboth)
-- Return text with space before and, if wantboth, after.
-- However, no space is added if there is a space or ' ' or '-'
-- at that position ('-' is for adjectival text).
-- There is also no space if text starts with '&'
-- (e.g. '°' would display a degree symbol with no preceding space).
local char = text:sub(1, 1)
if char == '&' then
return text -- an html entity can be used to specify the exact display
end
if not (char == ' ' or char == '-' or char == '+') then
text = ' ' .. text
end
if wantboth then
char = text:sub(-1, -1)
if not (char == ' ' or char == '-' or text:sub(-6, -1) == ' ') then
text = text .. ' '
end
end
return text
end
local PLUS = '+ '
preunit1 = preunit1 or ''
local trim1 = strip(preunit1)
if count == 1 then
if trim1 == '' then
return nil
end
if trim1 == '+' then
return PLUS
end
return withspace(preunit1, true)
end
preunit1 = withspace(preunit1)
preunit2 = preunit2 or ''
local trim2 = strip(preunit2)
if trim1 == '+' then
if trim2 == '' or trim2 == '+' then
return PLUS, PLUS
end
preunit1 = PLUS
end
if trim2 == '' then
if trim1 == '' then
return nil, nil
end
preunit2 = preunit1
elseif trim2 == '+' then
preunit2 = PLUS
elseif trim2 == ' ' then -- trick to make preunit2 empty
preunit2 = nil
else
preunit2 = withspace(preunit2)
end
return preunit1, preunit2
end
local function range_text(range, want_name, parms, before, after, inout, options)
-- Return before .. rtext .. after
-- where rtext is the text that separates two values in a range.
local rtext, adj_text, exception
options = options or {}
if type(range) == 'table' then
-- Table must specify range text for ('off' and 'on') or ('input' and 'output'),
-- and may specify range text for 'adj=on',
-- and may specify exception = true.
rtext = range[want_name and 'off' or 'on'] or
range[((inout == 'in') == (parms.opt_flip == true)) and 'output' or 'input']
adj_text = range['adj']
exception = range['exception']
else
rtext = range
end
if parms.opt_adjectival then
if want_name or (exception and parms.abbr_org == 'on') then
rtext = adj_text or rtext:gsub(' ', '-'):gsub(' ', '-')
end
end
if rtext == '–' and (options.spaced or after:sub(1, #MINUS) == MINUS) then
rtext = ' – '
end
return before .. rtext .. after
end
local function get_composite(parms, iparm, in_unit_table)
-- Look for a composite input unit. For example, {{convert|1|yd|2|ft|3|in}}
-- would result in a call to this function with
-- iparm = 3 (parms[iparm] = "2", just after the first unit)
-- in_unit_table = (unit table for "yd"; contains value 1 for number of yards)
-- Return true, iparm, unit where
-- iparm = index just after the composite units (7 in above example)
-- unit = composite unit table holding all input units,
-- or return true if no composite unit is present in parms,
-- or return false, t where t is an error message table.
local default, subinfo
local composite_units, count = { in_unit_table }, 1
local fixups = {}
local total = in_unit_table.valinfo[1].value
local subunit = in_unit_table
while subunit.subdivs do -- subdivs is nil or a table of allowed subdivisions
local subcode = strip(parms[iparm+1])
local subdiv = subunit.subdivs[subcode] or subunit.subdivs[(all_units[subcode] or {}).target]
if not subdiv then
break
end
local success
success, subunit = lookup(parms, subcode, 'no_combination')
if not success then return false, subunit end -- should never occur
success, subinfo = extract_number(parms, parms[iparm])
if not success then return false, subinfo end
iparm = iparm + 2
subunit.inout = 'in'
subunit.valinfo = { subinfo }
-- Recalculate total as a number of subdivisions.
-- subdiv[1] = number of subdivisions per previous unit (integer > 1).
total = total * subdiv[1] + subinfo.value
if not default then -- set by the first subdiv with a default defined
default = subdiv.default
end
count = count + 1
composite_units[count] = subunit
if subdiv.unit or subdiv.name then
fixups[count] = { unit = subdiv.unit, name = subdiv.name, valinfo = subunit.valinfo }
end
end
if count == 1 then
return true -- no error and no composite unit
end
for i, fixup in pairs(fixups) do
local unit = fixup.unit
local name = fixup.name
if not unit or (count > 2 and name) then
composite_units[i].fixed_name = name
else
local success, alternate = lookup(parms, unit, 'no_combination')
if not success then return false, alternate end -- should never occur
alternate.inout = 'in'
alternate.valinfo = fixup.valinfo
composite_units[i] = alternate
end
end
return true, iparm, {
utype = in_unit_table.utype,
scale = subunit.scale, -- scale of last (least significant) unit
valinfo = { { value = total, clean = subinfo.clean, denominator = subinfo.denominator } },
composite = composite_units,
default = default or in_unit_table.default
}
end
local function translate_parms(parms, kv_pairs)
-- Update fields in parms by translating each key:value in kv_pairs to terms
-- used by this module (may involve translating from local language to English).
-- Also, checks are performed which may display warnings, if enabled.
-- Return true if successful or return false, t where t is an error message table.
currency_text = nil -- local testing can hold module in memory; must clear globals
if kv_pairs.adj and kv_pairs.sing then
-- For enwiki (before translation), warn if attempt to use adj and sing
-- as the latter is a deprecated alias for the former.
if kv_pairs.adj ~= kv_pairs.sing and kv_pairs.sing ~= '' then
add_warning(parms, 1, 'cvt_unknown_option', 'sing=' .. kv_pairs.sing)
end
kv_pairs.sing = nil
end
kv_pairs.comma = kv_pairs.comma or config.comma -- for plwiki who want default comma=5
for loc_name, loc_value in pairs(kv_pairs) do
local en_name = text_code.en_option_name[loc_name]
if en_name then
local en_value = text_code.en_option_value[en_name]
if en_value == 'INTEGER' then -- altitude_ft, altitude_m, frac, sigfig
en_value = nil
if loc_value == '' then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
else
local minimum
local number, is_integer = get_number(loc_value)
if en_name == 'sigfig' then
minimum = 1
elseif en_name == 'frac' then
minimum = 2
if number and number < 0 then
parms.opt_fraction_horizontal = true
number = -number
end
else
minimum = -1e6
end
if number and is_integer and number >= minimum then
en_value = number
else
local m
if en_name == 'frac' then
m = 'cvt_bad_frac'
elseif en_name == 'sigfig' then
m = 'cvt_bad_sigfig'
else
m = 'cvt_bad_altitude'
end
add_warning(parms, 1, m, loc_name .. '=' .. loc_value)
end
end
elseif en_value == 'TEXT' then -- $, input, qid, qual, stylein, styleout, tracking
en_value = loc_value ~= '' and loc_value or nil -- accept non-empty user text with no validation
if not en_value and (en_name == '$' or en_name == 'qid' or en_name == 'qual') then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
elseif en_name == '$' then
-- Value should be a single character like "€" for the euro currency symbol, but anything is accepted.
currency_text = (loc_value == 'euro') and '€' or loc_value
elseif en_name == 'input' then
-- May have something like {{convert|input=}} (empty input) if source is an infobox
-- with optional fields. In that case, want to output nothing rather than an error.
parms.input_text = loc_value -- keep input because parms.input is nil if loc_value == ''
end
else
en_value = en_value[loc_value]
if en_value and en_value:sub(-1) == '?' then
en_value = en_value:sub(1, -2)
add_warning(parms, -1, 'cvt_deprecated', loc_name .. '=' .. loc_value)
end
if en_value == nil then
if loc_value == '' then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
else
add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value)
end
elseif en_value == '' then
en_value = nil -- an ignored option like adj=off
elseif type(en_value) == 'string' and en_value:sub(1, 4) == 'opt_' then
for _, v in ipairs(split(en_value, ',')) do
local lhs, rhs = v:match('^(.-)=(.+)$')
if rhs then
parms[lhs] = tonumber(rhs) or rhs
else
parms[v] = true
end
end
en_value = nil
end
end
parms[en_name] = en_value
else
add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value)
end
end
local abbr_entered = parms.abbr
local cfg_abbr = config.abbr
if cfg_abbr then
-- Don't warn if invalid because every convert would show that warning.
if cfg_abbr == 'on always' then
parms.abbr = 'on'
elseif cfg_abbr == 'off always' then
parms.abbr = 'off'
elseif parms.abbr == nil then
if cfg_abbr == 'on default' then
parms.abbr = 'on'
elseif cfg_abbr == 'off default' then
parms.abbr = 'off'
end
end
end
if parms.abbr then
if parms.abbr == 'unit' then
parms.abbr = 'on'
parms.number_word = true
end
parms.abbr_org = parms.abbr -- original abbr, before any flip
elseif parms.opt_hand_hh then
parms.abbr_org = 'on'
parms.abbr = 'on'
else
parms.abbr = 'out' -- default is to abbreviate output only (use symbol, not name)
end
if parms.opt_order_out then
-- Disable options that do not work in a useful way with order=out.
parms.opt_flip = nil -- override adj=flip
parms.opt_spell_in = nil
parms.opt_spell_out = nil
parms.opt_spell_upper = nil
end
if parms.opt_spell_out and not abbr_entered then
parms.abbr = 'off' -- should show unit name when spelling the output value
end
if parms.opt_flip then
local function swap_in_out(option)
local value = parms[option]
if value == 'in' then
parms[option] = 'out'
elseif value == 'out' then
parms[option] = 'in'
end
end
swap_in_out('abbr')
swap_in_out('lk')
if parms.opt_spell_in and not parms.opt_spell_out then
-- For simplicity, and because it does not appear to be needed,
-- user cannot set an option to spell the output only.
parms.opt_spell_in = nil
parms.opt_spell_out = true
end
end
if parms.opt_spell_upper then
parms.spell_upper = parms.opt_flip and 'out' or 'in'
end
if parms.opt_table or parms.opt_tablecen then
if abbr_entered == nil and parms.lk == nil then
parms.opt_values = true
end
parms.table_align = parms.opt_table and 'right' or 'center'
end
if parms.table_align or parms.opt_sortable_on then
parms.need_table_or_sort = true
end
local disp_joins = text_code.disp_joins
local default_joins = disp_joins['b']
parms.join_between = default_joins[3] or '; '
local disp = parms.disp
if disp == nil then -- special case for the most common setting
parms.joins = default_joins
elseif disp == 'x' then
-- Later, parms.joins is set from the input parameters.
else
-- Old template does this.
local abbr = parms.abbr
if disp == 'slash' then
if abbr_entered == nil then
disp = 'slash-nbsp'
elseif abbr == 'in' or abbr == 'out' then
disp = 'slash-sp'
else
disp = 'slash-nosp'
end
elseif disp == 'sqbr' then
if abbr == 'on' then
disp = 'sqbr-nbsp'
else
disp = 'sqbr-sp'
end
end
parms.joins = disp_joins[disp] or default_joins
parms.join_between = parms.joins[3] or parms.join_between
parms.wantname = parms.joins.wantname
end
if (en_default and not parms.opt_lang_local and (parms[1] or ''):find('%d')) or parms.opt_lang_en then
from_en_table = nil
end
if en_default and from_en_table then
-- For hiwiki: localized symbol/name is defined with the US symbol/name field,
-- and is used if output uses localized numbers.
parms.opt_sp_us = true
end
return true
end
local function get_values(parms)
-- If successful, update parms and return true, v, i where
-- v = table of input values
-- i = index to next entry in parms after those processed here
-- or return false, t where t is an error message table.
local valinfo = collection() -- numbered table of input values
local range = collection() -- numbered table of range items (having, for example, 2 range items requires 3 input values)
local had_nocomma -- true if removed "nocomma" kludge from second parameter (like "tonocomma")
local parm2 = strip(parms[2])
if parm2 and parm2:sub(-7, -1) == 'nocomma' then
parms[2] = strip(parm2:sub(1, -8))
parms.opt_nocomma = true
had_nocomma = true
end
local function extractor(i)
-- If the parameter is not a value, try unpacking it as a range ("1-23" for "1 to 23").
-- However, "-1-2/3" is a negative fraction (-1⅔), so it must be extracted first.
-- Do not unpack a parameter if it is like "3-1/2" which is sometimes incorrectly
-- used instead of "3+1/2" (and which should not be interpreted as "3 to ½").
-- Unpacked items are inserted into the parms table.
-- The tail recursion allows combinations like "1x2 to 3x4".
local valstr = strip(parms[i]) -- trim so any '-' as a negative sign will be at start
local success, result = extract_number(parms, valstr, i > 1)
if not success and valstr and i < 20 then -- check i to limit abuse
local lhs, sep, rhs = valstr:match('^(%S+)%s+(%S+)%s+(%S.*)')
if lhs and not (sep == '-' and rhs:match('/')) then
if sep:find('%d') then
return success, result -- to reject {{convert|1 234 567|m}} with a decent message (en only)
end
parms[i] = rhs
table.insert(parms, i, sep)
table.insert(parms, i, lhs)
return extractor(i)
end
if not valstr:match('%-.*/') then
for _, sep in ipairs(text_code.ranges.words) do
local start, stop = valstr:find(sep, 2, true) -- start at 2 to skip any negative sign for range '-'
if start then
parms[i] = valstr:sub(stop + 1)
table.insert(parms, i, sep)
table.insert(parms, i, valstr:sub(1, start - 1))
return extractor(i)
end
end
end
end
return success, result
end
local i = 1
local is_change
while true do
local success, info = extractor(i) -- need to set parms.opt_nocomma before calling this
if not success then return false, info end
i = i + 1
if is_change then
info.is_change = true -- value is after "±" and so is a change (significant for range like {{convert|5|±|5|°C}})
is_change = nil
end
valinfo:add(info)
local range_item = get_range(strip(parms[i]))
if not range_item then
break
end
i = i + 1
range:add(range_item)
if type(range_item) == 'table' then
-- For range "x", if append unit to some values, append it to all.
parms.in_range_x = parms.in_range_x or range_item.in_range_x
parms.out_range_x = parms.out_range_x or range_item.out_range_x
parms.abbr_range_x = parms.abbr_range_x or range_item.abbr_range_x
is_change = range_item.is_range_change
end
end
if range.n > 0 then
if range.n > 30 then -- limit abuse, although 4 is a more likely upper limit
return false, { 'cvt_invalid_num' } -- misleading message but it will do
end
parms.range = range
elseif had_nocomma then
return false, { 'cvt_unknown', parm2 }
end
return true, valinfo, i
end
local function simple_get_values(parms)
-- If input is like "{{convert|valid_value|valid_unit|...}}",
-- return true, i, in_unit, in_unit_table
-- i = index in parms of what follows valid_unit, if anything.
-- The valid_value is not negative and does not use a fraction, and
-- no options requiring further processing of the input are used.
-- Otherwise, return nothing or return false, parm1 for caller to interpret.
-- Testing shows this function is successful for 96% of converts in articles,
-- and that on average it speeds up converts by 8%.
local clean = to_en(strip(parms[1] or ''), parms)
if parms.opt_ri or parms.opt_spell_in or #clean > 10 or not clean:match('^[0-9.]+$') then
return false, clean
end
local value = tonumber(clean)
if not value then return end
local info = {
value = value,
altvalue = value,
singular = (value == 1),
clean = clean,
show = with_separator(parms, clean),
}
local in_unit = strip(parms[2])
local success, in_unit_table = lookup(parms, in_unit, 'no_combination')
if not success then return end
in_unit_table.valinfo = { info }
return true, 3, in_unit, in_unit_table
end
local function wikidata_call(parms, operation, ...)
-- Return true, s where s is the result of a Wikidata operation,
-- or return false, t where t is an error message table.
local function worker(...)
wikidata_code = wikidata_code or require(wikidata_module)
wikidata_data = wikidata_data or mw.loadData(wikidata_data_module)
return wikidata_code[operation](wikidata_data, ...)
end
local success, status, result = pcall(worker, ...)
if success then
return status, result
end
if parms.opt_sortable_debug then
-- Use debug=yes to crash if an error while accessing Wikidata.
error('Error accessing Wikidata: ' .. status, 0)
end
return false, { 'cvt_wd_fail' }
end
local function get_parms(parms, args)
-- If successful, update parms and return true, unit where
-- parms is a table of all arguments passed to the template
-- converted to named arguments, and
-- unit is the input unit table;
-- or return false, t where t is an error message table.
-- For special processing (not a convert), can also return
-- true, wikitext where wikitext is the final result.
-- The returned input unit table may be for a fake unit using the specified
-- unit code as the symbol and name, and with bad_mcode = message code table.
-- MediaWiki removes leading and trailing whitespace from the values of
-- named arguments. However, the values of numbered arguments include any
-- whitespace entered in the template, and whitespace is used by some
-- parameters (example: the numbered parameters associated with "disp=x").
local kv_pairs = {} -- table of input key:value pairs where key is a name; needed because cannot iterate parms and add new fields to it
for k, v in pairs(args) do
if type(k) == 'number' or k == 'test' then -- parameter "test" is reserved for testing and is not translated
parms[k] = v
else
kv_pairs[k] = v
end
end
if parms.test == 'wikidata' then
local ulookup = function (ucode)
-- Use empty table for parms so it does not accumulate results when used repeatedly.
return lookup({}, ucode, 'no_combination')
end
return wikidata_call(parms, '_listunits', ulookup)
end
local success, msg = translate_parms(parms, kv_pairs)
if not success then return false, msg end
if parms.input then
success, msg = wikidata_call(parms, '_adjustparameters', parms, 1)
if not success then return false, msg end
end
local success, i, in_unit, in_unit_table = simple_get_values(parms)
if not success then
if type(i) == 'string' and i:match('^NNN+$') then
-- Some infoboxes have examples like {{convert|NNN|m}} (3 or more "N").
-- Output an empty string for these.
return false, { 'cvt_no_output' }
end
local valinfo
success, valinfo, i = get_values(parms)
if not success then return false, valinfo end
in_unit = strip(parms[i])
i = i + 1
success, in_unit_table = lookup(parms, in_unit, 'no_combination')
if not success then
in_unit = in_unit or ''
if parms.opt_ignore_error then -- display given unit code with no error (for use with {{val}})
in_unit_table = '' -- suppress error message and prevent processing of output unit
end
in_unit_table = setmetatable({
symbol = in_unit, name2 = in_unit, utype = in_unit,
scale = 1, default = '', defkey = '', linkey = '',
bad_mcode = in_unit_table }, unit_mt)
end
in_unit_table.valinfo = valinfo
end
if parms.test == 'msg' then
-- Am testing the messages produced when no output unit is specified, and
-- the input unit has a missing or invalid default.
-- Set two units for testing that.
-- LATER: Remove this code.
if in_unit == 'chain' then
in_unit_table.default = nil -- no default
elseif in_unit == 'rd' then
in_unit_table.default = "ft!X!m" -- an invalid expression
end
end
in_unit_table.inout = 'in' -- this is an input unit
if not parms.range then
local success, inext, composite_unit = get_composite(parms, i, in_unit_table)
if not success then return false, inext end
if composite_unit then
in_unit_table = composite_unit
i = inext
end
end
if in_unit_table.builtin == 'mach' then
-- As with old template, a number following Mach as the input unit is the altitude.
-- That is deprecated: should use altitude_ft=NUMBER or altitude_m=NUMBER.
local success, info
success = tonumber(parms[i]) -- this will often work and will give correct result for values like 2e4 without forcing output scientific notation
if success then
info = { value = success }
else
success, info = extract_number(parms, parms[i], false, true)
end
if success then
i = i + 1
in_unit_table.altitude = info.value
end
end
local word = strip(parms[i])
i = i + 1
local precision, is_bad_precision
local function set_precision(text)
local number, is_integer = get_number(text)
if number then
if is_integer then
precision = number
else
precision = text
is_bad_precision = true
end
return true -- text was used for precision, good or bad
end
end
if word and not set_precision(word) then
parms.out_unit = parms.out_unit or word
if set_precision(strip(parms[i])) then
i = i + 1
end
end
if parms.opt_adj_mid then
word = parms[i]
i = i + 1
if word then -- mid-text words
if word:sub(1, 1) == '-' then
parms.mid = word
else
parms.mid = ' ' .. word
end
end
end
if parms.opt_one_preunit then
parms[parms.opt_flip and 'preunit2' or 'preunit1'] = preunits(1, parms[i])
i = i + 1
end
if parms.disp == 'x' then
-- Following is reasonably compatible with the old template.
local first = parms[i] or ''
local second = parms[i+1] or ''
i = i + 2
if strip(first) == '' then -- user can enter ' ' rather than ' ' to avoid the default
first = ' [ ' .. first
second = ' ]' .. second
end
parms.joins = { first, second }
elseif parms.opt_two_preunits then
local p1, p2 = preunits(2, parms[i], parms[i+1])
i = i + 2
if parms.preunit1 then
-- To simplify documentation, allow unlikely use of adj=pre with disp=preunit
-- (however, an output unit must be specified with adj=pre and with disp=preunit).
parms.preunit1 = parms.preunit1 .. p1
parms.preunit2 = p2
else
parms.preunit1, parms.preunit2 = p1, p2
end
end
if precision == nil then
if set_precision(strip(parms[i])) then
i = i + 1
end
end
if is_bad_precision then
add_warning(parms, 1, 'cvt_bad_prec', precision)
else
parms.precision = precision
end
for j = i, i + 3 do
local parm = parms[j] -- warn if find a non-empty extraneous parameter
if parm and parm:match('%S') then
add_warning(parms, 1, 'cvt_unknown_option', parm)
break
end
end
return true, in_unit_table
end
local function record_default_precision(parms, out_current, precision)
-- If necessary, adjust parameters and return a possibly adjusted precision.
-- When converting a range of values where a default precision is required,
-- that default is calculated for each value because the result sometimes
-- depends on the precise input and output values. This function may cause
-- the entire convert process to be repeated in order to ensure that the
-- same default precision is used for each individual convert.
-- If that were not done, a range like 1000 to 1000.4 may give poor results
-- because the first output could be heavily rounded, while the second is not.
-- For range 1000.4 to 1000, this function can give the second convert the
-- same default precision that was used for the first.
if not parms.opt_round_each then
local maxdef = out_current.max_default_precision
if maxdef then
if maxdef < precision then
parms.do_convert_again = true
out_current.max_default_precision = precision
else
precision = out_current.max_default_precision
end
else
out_current.max_default_precision = precision
end
end
return precision
end
local function default_precision(parms, invalue, inclean, denominator, outvalue, in_current, out_current, extra)
-- Return a default value for precision (an integer like 2, 0, -2).
-- If denominator is not nil, it is the value of the denominator in inclean.
-- Code follows procedures used in old template.
local fudge = 1e-14 -- {{Order of magnitude}} adds this, so we do too
local prec, minprec, adjust
local subunit_ignore_trailing_zero
local subunit_more_precision -- kludge for "in" used in input like "|2|ft|6|in"
local composite = in_current.composite
if composite then
subunit_ignore_trailing_zero = true -- input "|2|st|10|lb" has precision 0, not -1
if composite[#composite].exception == 'subunit_more_precision' then
subunit_more_precision = true -- do not use standard precision with input like "|2|ft|6|in"
end
end
if denominator and denominator > 0 then
prec = math.max(log10(denominator), 1)
else
-- Count digits after decimal mark, handling cases like '12.345e6'.
local exponent
local integer, dot, decimals, expstr = inclean:match('^(%d*)(%.?)(%d*)(.*)')
local e = expstr:sub(1, 1)
if e == 'e' or e == 'E' then
exponent = tonumber(expstr:sub(2))
end
if dot == '' then
prec = subunit_ignore_trailing_zero and 0 or -integer:match('0*$'):len()
else
prec = #decimals
end
if exponent then
-- So '1230' and '1.23e3' both give prec = -1, and '0.00123' and '1.23e-3' give 5.
prec = prec - exponent
end
end
if in_current.istemperature and out_current.istemperature then
-- Converting between common temperatures (°C, °F, °R, K); not keVT.
-- Kelvin value can be almost zero, or small but negative due to precision problems.
-- Also, an input value like -300 C (below absolute zero) gives negative kelvins.
-- Calculate minimum precision from absolute value.
adjust = 0
local kelvin = abs((invalue - in_current.offset) * in_current.scale)
if kelvin < 1e-8 then -- assume nonzero due to input or calculation precision problem
minprec = 2
else
minprec = 2 - floor(log10(kelvin) + fudge) -- 3 sigfigs in kelvin
end
else
if invalue == 0 or outvalue <= 0 then
-- We are never called with a negative outvalue, but it might be zero.
-- This is special-cased to avoid calculation exceptions.
return record_default_precision(parms, out_current, 0)
end
if out_current.exception == 'integer_more_precision' and floor(invalue) == invalue then
-- With certain output units that sometimes give poor results
-- with default rounding, use more precision when the input
-- value is equal to an integer. An example of a poor result
-- is when input 50 gives a smaller output than input 49.5.
-- Experiment shows this helps, but it does not eliminate all
-- surprises because it is not clear whether "50" should be
-- interpreted as "from 45 to 55" or "from 49.5 to 50.5".
adjust = -log10(in_current.scale)
elseif subunit_more_precision then
-- Conversion like "{{convert|6|ft|1|in|cm}}" (where subunit is "in")
-- has a non-standard adjust value, to give more output precision.
adjust = log10(out_current.scale) + 2
else
adjust = log10(abs(invalue / outvalue))
end
adjust = adjust + log10(2)
-- Ensure that the output has at least two significant figures.
minprec = 1 - floor(log10(outvalue) + fudge)
end
if extra then
adjust = extra.adjust or adjust
minprec = extra.minprec or minprec
end
return record_default_precision(parms, out_current, math.max(floor(prec + adjust), minprec))
end
local function convert(parms, invalue, info, in_current, out_current)
-- Convert given input value from one unit to another.
-- Return output_value (a number) if a simple convert, or
-- return f, t where
-- f = true, t = table of information with results, or
-- f = false, t = error message table.
local inscale = in_current.scale
local outscale = out_current.scale
if not in_current.iscomplex and not out_current.iscomplex then
return invalue * (inscale / outscale) -- minimize overhead for most common case
end
if in_current.invert or out_current.invert then
-- Inverted units, such as inverse length, inverse time, or
-- fuel efficiency. Built-in units do not have invert set.
if (in_current.invert or 1) * (out_current.invert or 1) < 0 then
return 1 / (invalue * inscale * outscale)
end
return invalue * (inscale / outscale)
elseif in_current.offset then
-- Temperature (there are no built-ins for this type of unit).
if info.is_change then
return invalue * (inscale / outscale)
end
return (invalue - in_current.offset) * (inscale / outscale) + out_current.offset
else
-- Built-in unit.
local in_builtin = in_current.builtin
local out_builtin = out_current.builtin
if in_builtin and out_builtin then
if in_builtin == out_builtin then
return invalue
end
-- There are no cases (yet) where need to convert from one
-- built-in unit to another, so this should never occur.
return false, { 'cvt_bug_convert' }
end
if in_builtin == 'mach' or out_builtin == 'mach' then
-- Should check that only one altitude is given but am planning to remove
-- in_current.altitude (which can only occur when Mach is the input unit),
-- and out_current.altitude cannot occur.
local alt = parms.altitude_ft or in_current.altitude
if not alt and parms.altitude_m then
alt = parms.altitude_m / 0.3048 -- 1 ft = 0.3048 m
end
local spd = speed_of_sound(alt)
if in_builtin == 'mach' then
inscale = spd
return invalue * (inscale / outscale)
end
outscale = spd
local adjust = 0.1 / inscale
return true, {
outvalue = invalue * (inscale / outscale),
adjust = log10(adjust) + log10(2),
}
elseif in_builtin == 'hand' then
-- 1 hand = 4 inches; 1.2 hands = 6 inches.
-- Decimals of a hand are only defined for the first digit, and
-- the first fractional digit should be a number of inches (1, 2 or 3).
-- However, this code interprets the entire fractional part as the number
-- of inches / 10 (so 1.75 inches would be 0.175 hands).
-- A value like 12.3 hands is exactly 12*4 + 3 inches; base default precision on that.
local integer, fracpart = math.modf(invalue)
local inch_value = 4 * integer + 10 * fracpart -- equivalent number of inches
local factor = inscale / outscale
if factor == 4 then
-- Am converting to inches: show exact result, and use "inches" not "in" by default.
if parms.abbr_org == nil then
out_current.usename = true
end
local show = format('%g', abs(inch_value)) -- show and clean are unsigned
if not show:find('e', 1, true) then
return true, {
invalue = inch_value,
outvalue = inch_value,
clean = show,
show = show,
}
end
end
local outvalue = (integer + 2.5 * fracpart) * factor
local fracstr = info.clean:match('%.(.*)') or ''
local fmt
if fracstr == '' then
fmt = '%.0f'
else
fmt = '%.' .. format('%d', #fracstr - 1) .. 'f'
end
return true, {
invalue = inch_value,
clean = format(fmt, inch_value),
outvalue = outvalue,
minprec = 0,
}
end
end
return false, { 'cvt_bug_convert' } -- should never occur
end
local function user_style(parms, i)
-- Return text for a user-specified style for a table cell, or '' if none,
-- given i = 1 (input style) or 2 (output style).
local style = parms[(i == 1) and 'stylein' or 'styleout']
if style then
style = style:gsub('"', '')
if style ~= '' then
if style:sub(-1) ~= ';' then
style = style .. ';'
end
return style
end
end
return ''
end
local function make_table_or_sort(parms, invalue, info, in_current, scaled_top)
-- Set options to handle output for a table or a sort key, or both.
-- The text sort key is based on the value resulting from converting
-- the input to a fake base unit with scale = 1, and other properties
-- required for a conversion derived from the input unit.
-- For other modules, return the sort key in a hidden span element, and
-- the scaled value used to generate the sort key.
-- If scaled_top is set, it is the scaled value of the numerator of a per unit
-- to be combined with this unit (the denominator) to make the sort key.
-- Scaling only works with units that convert with a factor (not temperature).
local sortkey, scaled_value
if parms.opt_sortable_on then
local base = { -- a fake unit with enough fields for a valid convert
scale = 1,
invert = in_current.invert and 1,
iscomplex = in_current.iscomplex,
offset = in_current.offset and 0,
}
local outvalue, extra = convert(parms, invalue, info, in_current, base)
if extra then
outvalue = extra.outvalue
end
if in_current.istemperature then
-- Have converted to kelvin; assume numbers close to zero have a
-- rounding error and should be zero.
if abs(outvalue) < 1e-12 then
outvalue = 0
end
end
if scaled_top and outvalue ~= 0 then
outvalue = scaled_top / outvalue
end
scaled_value = outvalue
if not valid_number(outvalue) then
if outvalue < 0 then
sortkey = '1000000000000000000'
else
sortkey = '9000000000000000000'
end
elseif outvalue == 0 then
sortkey = '5000000000000000000'
else
local mag = floor(log10(abs(outvalue)) + 1e-14)
local prefix
if outvalue > 0 then
prefix = 7000 + mag
else
prefix = 2999 - mag
outvalue = outvalue + 10^(mag+1)
end
sortkey = format('%d', prefix) .. format('%015.0f', floor(outvalue * 10^(14-mag)))
end
end
local sortspan
if sortkey and not parms.table_align then
sortspan = parms.opt_sortable_debug and
'<span data-sort-value="' .. sortkey .. '♠"><span style="border:1px solid">' .. sortkey .. '♠</span></span>' or
'<span data-sort-value="' .. sortkey .. '♠"></span>'
parms.join_before = sortspan
end
if parms.table_align then
local sort
if sortkey then
sort = ' data-sort-value="' .. sortkey .. '"'
if parms.opt_sortable_debug then
parms.join_before = '<span style="border:1px solid">' .. sortkey .. '</span>'
end
else
sort = ''
end
local style = 'style="text-align:' .. parms.table_align .. ';'
local joins = {}
for i = 1, 2 do
joins[i] = (i == 1 and '' or '\n|') .. style .. user_style(parms, i) .. '"' .. sort .. '|'
end
parms.table_joins = joins
end
return sortspan, scaled_value
end
local cvt_to_hand
local function cvtround(parms, info, in_current, out_current)
-- Return true, t where t is a table with the conversion results; fields:
-- show = rounded, formatted string with the result of converting value in info,
-- using the rounding specified in parms.
-- singular = true if result (after rounding and ignoring any negative sign)
-- is "1", or like "1.00", or is a fraction with value < 1;
-- (and more fields shown below, and a calculated 'absvalue' field).
-- or return false, t where t is an error message table.
-- Input info.clean uses en digits (it has been translated, if necessary).
-- Output show uses en or non-en digits as appropriate, or can be spelled.
if out_current.builtin == 'hand' then
return cvt_to_hand(parms, info, in_current, out_current)
end
local invalue = in_current.builtin == 'hand' and info.altvalue or info.value
local outvalue, extra = convert(parms, invalue, info, in_current, out_current)
if parms.need_table_or_sort then
parms.need_table_or_sort = nil -- process using first input value only
make_table_or_sort(parms, invalue, info, in_current)
end
if extra then
if not outvalue then return false, extra end
invalue = extra.invalue or invalue
outvalue = extra.outvalue
end
if not valid_number(outvalue) then
return false, { 'cvt_invalid_num' }
end
local isnegative
if outvalue < 0 then
isnegative = true
outvalue = -outvalue
end
local precision, show, exponent
local denominator = out_current.frac
if denominator then
show = fraction_table(outvalue, denominator)
else
precision = parms.precision
if not precision then
if parms.sigfig then
show, exponent = make_sigfig(outvalue, parms.sigfig)
elseif parms.opt_round then
local n = parms.opt_round
if n == 0.5 then
local integer, fracpart = math.modf(floor(2 * outvalue + 0.5) / 2)
if fracpart == 0 then
show = format('%.0f', integer)
else
show = format('%.1f', integer + fracpart)
end
else
show = format('%.0f', floor((outvalue / n) + 0.5) * n)
end
elseif in_current.builtin == 'mach' then
local sigfig = info.clean:gsub('^[0.]+', ''):gsub('%.', ''):len() + 1
show, exponent = make_sigfig(outvalue, sigfig)
else
local inclean = info.clean
if extra then
inclean = extra.clean or inclean
show = extra.show
end
if not show then
precision = default_precision(parms, invalue, inclean, info.denominator, outvalue, in_current, out_current, extra)
end
end
end
end
if precision then
if precision >= 0 then
local fudge
if precision <= 8 then
-- Add a fudge to handle common cases of bad rounding due to inability
-- to precisely represent some values. This makes the following work:
-- {{convert|-100.1|C|K}} and {{convert|5555000|um|m|2}}.
-- Old template uses #expr round, which invokes PHP round().
-- LATER: Investigate how PHP round() works.
fudge = 2e-14
else
fudge = 0
end
local fmt = '%.' .. format('%d', precision) .. 'f'
local success
success, show = pcall(format, fmt, outvalue + fudge)
if not success then
return false, { 'cvt_big_prec', tostring(precision) }
end
else
precision = -precision -- #digits to zero (in addition to any digits after dot)
local shift = 10 ^ precision
show = format('%.0f', outvalue/shift)
if show ~= '0' then
exponent = #show + precision
end
end
end
local t = format_number(parms, show, exponent, isnegative)
if type(show) == 'string' then
-- Set singular using match because on some systems 0.99999999999999999 is 1.0.
if exponent then
t.singular = (exponent == 1 and show:match('^10*$'))
else
t.singular = (show == '1' or show:match('^1%.0*$'))
end
else
t.fraction_table = show
t.singular = (outvalue <= 1) -- cannot have 'fraction == 1', but if it were possible it would be singular
end
t.raw_absvalue = outvalue -- absolute value before rounding
return true, setmetatable(t, {
__index = function (self, key)
if key == 'absvalue' then
-- Calculate absolute value after rounding, if needed.
local clean, exponent = rawget(self, 'clean'), rawget(self, 'exponent')
local value = tonumber(clean) -- absolute value (any negative sign has been ignored)
if exponent then
value = value * 10^exponent
end
rawset(self, key, value)
return value
end
end })
end
function cvt_to_hand(parms, info, in_current, out_current)
-- Convert input to hands, inches.
-- Return true, t where t is a table with the conversion results;
-- or return false, t where t is an error message table.
if parms.abbr_org == nil then
out_current.usename = true -- default is to show name not symbol
end
local precision = parms.precision
local frac = out_current.frac
if not frac and precision and precision > 1 then
frac = (precision == 2) and 2 or 4
end
local out_next = out_current.out_next
if out_next then
-- Use magic knowledge to determine whether the next unit is inches without requiring i18n.
-- The following ensures that when the output combination "hand in" is used, the inches
-- value is rounded to match the hands value. Also, displaying say "61½" instead of 61.5
-- is better as 61.5 implies the value is not 61.4.
if out_next.exception == 'subunit_more_precision' then
out_next.frac = frac
end
end
-- Convert to inches; calculate hands from that.
local dummy_unit_table = { scale = out_current.scale / 4, frac = frac }
local success, outinfo = cvtround(parms, info, in_current, dummy_unit_table)
if not success then return false, outinfo end
local tfrac = outinfo.fraction_table
local inches = outinfo.raw_absvalue
if tfrac then
inches = floor(inches) -- integer part only; fraction added later
else
inches = floor(inches + 0.5) -- a hands measurement never shows decimals of an inch
end
local hands, inches = divide(inches, 4)
outinfo.absvalue = hands + inches/4 -- supposed to be the absolute rounded value, but this is close enough
local inchstr = tostring(inches) -- '0', '1', '2' or '3'
if precision and precision <= 0 then -- using negative or 0 for precision rounds to nearest hand
hands = floor(outinfo.raw_absvalue/4 + 0.5)
inchstr = ''
elseif tfrac then
-- Always show an integer before fraction (like "15.0½") because "15½" means 15-and-a-half hands.
inchstr = numdot .. format_fraction(parms, 'out', false, inchstr, tfrac.numstr, tfrac.denstr)
else
inchstr = numdot .. from_en(inchstr)
end
outinfo.show = outinfo.sign .. with_separator(parms, format('%.0f', hands)) .. inchstr
return true, outinfo
end
local function evaluate_condition(value, condition)
-- Return true or false from applying a conditional expression to value,
-- or throw an error if invalid.
-- A very limited set of expressions is supported:
-- v < 9
-- v * 9 < 9
-- where
-- 'v' is replaced with value
-- 9 is any number (as defined by Lua tonumber)
-- only en digits are accepted
-- '<' can also be '<=' or '>' or '>='
-- In addition, the following form is supported:
-- LHS and RHS
-- where
-- LHS, RHS = any of above expressions.
local function compare(value, text)
local arithop, factor, compop, limit = text:match('^%s*v%s*([*]?)(.-)([<>]=?)(.*)$')
if arithop == nil then
error('Invalid default expression', 0)
elseif arithop == '*' then
factor = tonumber(factor)
if factor == nil then
error('Invalid default expression', 0)
end
value = value * factor
end
limit = tonumber(limit)
if limit == nil then
error('Invalid default expression', 0)
end
if compop == '<' then
return value < limit
elseif compop == '<=' then
return value <= limit
elseif compop == '>' then
return value > limit
elseif compop == '>=' then
return value >= limit
end
error('Invalid default expression', 0) -- should not occur
end
local lhs, rhs = condition:match('^(.-%W)and(%W.*)')
if lhs == nil then
return compare(value, condition)
end
return compare(value, lhs) and compare(value, rhs)
end
local function get_default(value, unit_table)
-- Return true, s where s = name of unit's default output unit,
-- or return false, t where t is an error message table.
-- Some units have a default that depends on the input value
-- (the first value if a range of values is used).
-- If '!' is in the default, the first bang-delimited field is an
-- expression that uses 'v' to represent the input value.
-- Example: 'v < 120 ! small ! big ! suffix' (suffix is optional)
-- evaluates 'v < 120' as a boolean with result
-- 'smallsuffix' if (value < 120), or 'bigsuffix' otherwise.
-- Input must use en digits and '.' decimal mark.
local default = data_code.default_exceptions[unit_table.defkey or unit_table.symbol] or unit_table.default
if not default then
local per = unit_table.per
if per then
local function a_default(v, u)
local success, ucode = get_default(v, u)
if not success then
return '?' -- an unlikely error has occurred; will cause lookup of default to fail
end
-- Attempt to use only the first unit if a combination or output multiple.
-- This is not bulletproof but should work for most cases.
-- Where it does not work, the convert will need to specify the wanted output unit.
local t = all_units[ucode]
if t then
local combo = t.combination
if combo then
-- For a multiple like ftin, the "first" unit (ft) is last in the combination.
local i = t.multiple and table_len(combo) or 1
ucode = combo[i]
end
else
-- Try for an automatically generated combination.
local item = ucode:match('^(.-)%+') or ucode:match('^(%S+)%s')
if all_units[item] then
return item
end
end
return ucode
end
local unit1, unit2 = per[1], per[2]
local def1 = (unit1 and a_default(value, unit1) or unit_table.vprefix or '')
local def2 = a_default(1, unit2) -- 1 because per unit of denominator
return true, def1 .. '/' .. def2
end
return false, { 'cvt_no_default', unit_table.symbol }
end
if default:find('!', 1, true) == nil then
return true, default
end
local t = split(default, '!')
if #t == 3 or #t == 4 then
local success, result = pcall(evaluate_condition, value, t[1])
if success then
default = result and t[2] or t[3]
if #t == 4 then
default = default .. t[4]
end
return true, default
end
end
return false, { 'cvt_bad_default', unit_table.symbol }
end
local linked_pages -- to record linked pages so will not link to the same page more than once
local function unlink(unit_table)
-- Forget that the given unit has previously been linked (if it has).
-- That is needed when processing a range of inputs or outputs when an id
-- for the first range value may have been evaluated, but only an id for
-- the last value is displayed, and that id may need to be linked.
linked_pages[unit_table.unitcode or unit_table] = nil
end
local function make_link(link, id, unit_table)
-- Return wikilink "[[link|id]]", possibly abbreviated as in examples:
-- [[Mile|mile]] --> [[mile]]
-- [[Mile|miles]] --> [[mile]]s
-- However, just id is returned if:
-- * no link given (so caller does not need to check if a link was defined); or
-- * link has previously been used during the current convert (to avoid overlinking).
local link_key
if unit_table then
link_key = unit_table.unitcode or unit_table
else
link_key = link
end
if not link or link == '' or linked_pages[link_key] then
return id
end
linked_pages[link_key] = true
-- Following only works for language en, but it should be safe on other wikis,
-- and overhead of doing it generally does not seem worthwhile.
local l = link:sub(1, 1):lower() .. link:sub(2)
if link == id or l == id then
return '[[' .. id .. ']]'
elseif link .. 's' == id or l .. 's' == id then
return '[[' .. id:sub(1, -2) .. ']]s'
else
return '[[' .. link .. '|' .. id .. ']]'
end
end
local function variable_name(clean, unit_table, exp_multiplier, key_id)
-- A unit name may depend on the value in some languages.
-- Parameter clean is the unsigned value in en digits, as a string.
-- It may represent a number ("1.0") or a fraction ("1+2/3").
-- In varname, fields are separated with "!" and are not empty.
-- A field for a unit using an SI prefix has the prefix name inserted,
-- replacing '#' if found, or before the field otherwise.
if clean:match('[./]') then -- float or fraction
if exp_multiplier then
clean = exp_multiplier -- force selection of name for a large integer
else
clean = 34.5 -- force selection of name for a float value
end
else
clean = tonumber(clean) * (exp_multiplier or 1)
end
local name1, vname
if key_id == 'pername' and unit_table.pername then
vname = unit_table.pername
elseif unit_table.varname then
local splitvname = split(unit_table.varname, '!')
name1 = unit_table.name1
vname = mw.language.getContentLanguage():convertPlural(clean, name1, unpack(splitvname))
else
return clean == 1 and unit_table.name1 or unit_table.name2
end
if vname == name1 then
-- SI prefix (if any) has been inserted by unit_prefixed_mt.
else
local si_name = rawget(unit_table, 'si_name') or ''
local pos = vname:find('#', 1, true)
if pos then
vname = vname:sub(1, pos - 1) .. si_name .. vname:sub(pos + 1)
else
vname = si_name .. vname
end
end
return vname
end
local function linked_id(parms, unit_table, key_id, want_link, clean, exp_multiplier)
-- Return final unit id (symbol or name), optionally with a wikilink,
-- and update unit_table.sep if required.
-- key_id is one of: 'symbol', 'sym_us', 'name1', 'name1_us', 'name2', 'name2_us', 'pername'.
local abbr_on = (key_id == 'symbol' or key_id == 'sym_us')
if abbr_on and want_link then
local symlink = rawget(unit_table, 'symlink')
if symlink then
return symlink -- for exceptions that have the linked symbol built-in
end
end
local multiplier = rawget(unit_table, 'multiplier')
local per = unit_table.per
if per then
local paren1, paren2 = '', '' -- possible parentheses around bottom unit
local unit1 = per[1] -- top unit_table, or nil
local unit2 = per[2] -- bottom unit_table
if abbr_on then
if not unit1 then
unit_table.sep = '' -- no separator in "$2/acre"
end
if not want_link then
local symbol = unit_table.symbol_raw
if symbol then
return symbol -- for exceptions that have the symbol built-in
end
end
if (unit2.symbol):find('⋅', 1, true) then
paren1, paren2 = '(', ')'
end
end
local key_id2 -- unit2 is always singular
if key_id == 'name2' then
key_id2 = 'name1'
elseif key_id == 'name2_us' then
key_id2 = 'name1_us'
else
key_id2 = key_id
end
if key_id2 == 'name1' or key_id2 == 'name1_us' then
key_id2 = unit2.pername and 'pername' or key_id2 -- ukwiki has some units with a different name in "per unitname"
end
local result
if abbr_on then
result = '/'
elseif omitsep then
result = per_word
elseif unit1 then
result = ' ' .. per_word .. ' '
else
result = per_word .. ' '
end
if want_link and unit_table.link then
if varname and not abbr_on then
result = (unit1 and variable_name(clean, unit1, exp_multiplier) or '') .. result .. variable_name('1', unit2, exp_multiplier, key_id2)
else
result = (unit1 and linked_id(parms, unit1, key_id, false, clean) or '') .. result .. linked_id(parms, unit2, key_id2, false, '1')
end
if omit_separator(result) then
unit_table.sep = ''
end
return make_link(unit_table.link, result, unit_table)
end
if unit1 then
result = linked_id(parms, unit1, key_id, want_link, clean) .. result
if unit1.sep then
unit_table.sep = unit1.sep
end
elseif omitsep then
unit_table.sep = ''
end
return result .. paren1 .. linked_id(parms, unit2, key_id2, want_link, '1') .. paren2
end
if multiplier then
-- A multiplier (like "100" in "100km") forces the unit to be plural.
multiplier = from_en(multiplier)
if not omitsep then
multiplier = multiplier .. (abbr_on and ' ' or ' ')
end
if not abbr_on then
if key_id == 'name1' then
key_id = 'name2'
elseif key_id == 'name1_us' then
key_id = 'name2_us'
end
end
else
multiplier = ''
end
local id = unit_table.fixed_name or ((varname and not abbr_on) and variable_name(clean, unit_table, exp_multiplier, key_id) or unit_table[key_id])
if omit_separator(id) then
unit_table.sep = ''
end
if want_link then
local link = data_code.link_exceptions[unit_table.linkey or unit_table.symbol] or unit_table.link
if link then
local before = ''
local i = unit_table.customary
if i == 1 and parms.opt_sp_us then
i = 2 -- show "U.S." not "US"
end
if i == 3 and abbr_on then
i = 4 -- abbreviate "imperial" to "imp"
end
local customary = text_code.customary_units[i]
if customary then
-- LATER: This works for language en only, but it's esoteric so ignore for now.
local pertext
if id:sub(1, 1) == '/' then
-- Want unit "/USgal" to display as "/U.S. gal", not "U.S. /gal".
pertext = '/'
id = id:sub(2)
elseif id:sub(1, 4) == 'per ' then
-- Similarly want "per U.S. gallon", not "U.S. per gallon" (but in practice this is unlikely to be used).
pertext = 'per '
id = id:sub(5)
else
pertext = ''
end
-- Omit any "US"/"U.S."/"imp"/"imperial" from start of id since that will be inserted.
local removes = (i < 3) and { 'US ', 'US ', 'U.S. ', 'U.S. ' } or { 'imp ', 'imp ', 'imperial ' }
for _, prefix in ipairs(removes) do
local plen = #prefix
if id:sub(1, plen) == prefix then
id = id:sub(plen + 1)
break
end
end
before = pertext .. make_link(customary.link, customary[1]) .. ' '
end
id = before .. make_link(link, id, unit_table)
end
end
return multiplier .. id
end
local function make_id(parms, which, unit_table)
-- Return id, f where
-- id = unit name or symbol, possibly modified
-- f = true if id is a name, or false if id is a symbol
-- using the value for index 'which', and for 'in' or 'out' (unit_table.inout).
-- Result is '' if no symbol/name is to be used.
-- In addition, set unit_table.sep = ' ' or ' ' or ''
-- (the separator that caller will normally insert before the id).
if parms.opt_values then
unit_table.sep = ''
return ''
end
local inout = unit_table.inout
local info = unit_table.valinfo[which]
local lk = parms.lk
local want_link = (lk == 'on' or lk == inout)
local singular = info.singular
local want_name
local exp_multiplier
if unit_table.usename then
want_name = true
else
if parms.abbr_org == nil then
if parms.wantname then
want_name = true
end
if unit_table.usesymbol then
want_name = false
end
end
if want_name == nil then
local abbr = parms.abbr
if abbr == 'on' or abbr == inout or (abbr == 'mos' and inout == 'out') then
want_name = false
else
want_name = true
end
end
end
local key
if want_name then
if lk == nil and unit_table.builtin == 'hand' then
want_link = true
end
if parms.opt_use_nbsp then
unit_table.sep = ' '
else
unit_table.sep = ' '
end
if parms.opt_singular then
local value
if inout == 'in' then
value = info.value
else
value = info.absvalue
end
if value then -- some unusual units do not always set value field
value = abs(value)
singular = (0 < value and value < 1.0001)
end
end
if unit_table.engscale then
-- engscale: so "|1|e3kg" gives "1 thousand kilograms" (plural)
singular = false
exp_multiplier = 10^unit_table.engscale.exponent -- '1 gram' and '1 thousand grams', for example, may use different names for the unit in some languages
end
key = (parms.opt_adjectival or singular) and 'name1' or 'name2'
if parms.opt_sp_us then
key = key .. '_us'
end
else
if unit_table.builtin == 'hand' then
if parms.opt_hand_hh then
unit_table.symbol = 'hh' -- LATER: might want i18n applied to this
end
end
unit_table.sep = ' '
key = parms.opt_sp_us and 'sym_us' or 'symbol'
end
return linked_id(parms, unit_table, key, want_link, info.clean, exp_multiplier), want_name
end
local function decorate_value(parms, unit_table, which, enable_number_word)
-- If needed, update unit_table so values will be shown with extra information.
-- For consistency with the old template (but different from fmtpower),
-- the style to display powers of 10 includes "display:none" to allow some
-- browsers to copy, for example, "10³" as "10^3", rather than as "103".
-- The engscale table may have entries such as either of the following:
-- ["3"] = { "thousand", exponent = 3 },
-- ["3"] = { name1 = "A", varname = "B!C!D", exponent = 3 },
-- The first option always uses "thousand" as the exponent name.
-- The second option uses one of A, B, C, D as the exponent name, depending on the value.
local info
local engscale = unit_table.engscale
local prefix = unit_table.vprefix
if engscale or prefix then
info = unit_table.valinfo[which]
if info.decorated then
return -- do not redecorate if repeating convert
end
info.decorated = true
if engscale then
-- Range |10|-|20|e3km| gives '10×10³–20×10³' or '10–20 thousand'.
local inout = unit_table.inout
local abbr = parms.abbr
if (abbr == 'on' or abbr == inout) and not (unit_table.this_number_word or parms.number_word) then
info.show = info.show ..
'<span style="margin-left:0.2em">×<span style="margin-left:0.1em">' ..
from_en('10') ..
'</span></span><s style="display:none">^</s><sup>' ..
from_en(tostring(engscale.exponent)) .. '</sup>'
elseif enable_number_word then
local number_id
local name = engscale.varname and variable_name(info.clean, engscale) or engscale[1]
if parms.lk == 'on' or parms.lk == inout then
number_id = make_link(engscale.link, name)
else
number_id = name
end
-- WP:NUMERAL recommends " " in values like "12 million".
info.show = info.show .. (parms.opt_adjectival and '-' or ' ') .. number_id
end
end
if prefix then
info.show = prefix .. info.show
end
end
end
local function process_input(parms, in_current)
-- Processing required once per conversion.
-- Return block of text to represent input (value/unit).
if parms.opt_output_only or parms.opt_output_number_only or parms.opt_output_unit_only then
parms.joins = { '', '' }
return ''
end
local first_unit
local composite = in_current.composite -- nil or table of units
if composite then
first_unit = composite[1]
else
first_unit = in_current
end
local id1, want_name = make_id(parms, 1, first_unit)
local sep = first_unit.sep -- separator between value and unit, set by make_id
local preunit = parms.preunit1
if preunit then
sep = '' -- any separator is included in preunit
else
preunit = ''
end
if parms.opt_input_unit_only then
parms.joins = { '', '' }
if composite then
local parts = { id1 }
for i, unit in ipairs(composite) do
if i > 1 then
table.insert(parts, (make_id(parms, 1, unit)))
end
end
id1 = table.concat(parts, ' ')
end
if want_name and parms.opt_adjectival then
return preunit .. hyphenated(id1)
end
return preunit .. id1
end
if parms.opt_also_symbol and not composite and not parms.opt_flip then
local join1 = parms.joins[1]
if join1 == ' (' or join1 == ' [' then
parms.joins = { ' [' .. first_unit[parms.opt_sp_us and 'sym_us' or 'symbol'] .. ']' .. join1 , parms.joins[2] }
end
end
if in_current.builtin == 'mach' and first_unit.sep ~= '' then -- '' means omitsep with non-enwiki name
local prefix = id1 .. ' '
local range = parms.range
local valinfo = first_unit.valinfo
local result = prefix .. valinfo[1].show
if range then
-- For simplicity and because more not needed, handle one range item only.
local prefix2 = make_id(parms, 2, first_unit) .. ' '
result = range_text(range[1], want_name, parms, result, prefix2 .. valinfo[2].show, 'in', {spaced=true})
end
return preunit .. result
end
if composite then
-- Simplify: assume there is no range, and no decoration.
local mid = (not parms.opt_flip) and parms.mid or ''
local sep1 = ' '
local sep2 = ' '
if parms.opt_adjectival and want_name then
sep1 = '-'
sep2 = '-'
end
if omitsep and sep == '' then
-- Testing the id of the most significant unit should be sufficient.
sep1 = ''
sep2 = ''
end
local parts = { first_unit.valinfo[1].show .. sep1 .. id1 }
for i, unit in ipairs(composite) do
if i > 1 then
table.insert(parts, unit.valinfo[1].show .. sep1 .. (make_id(parms, 1, unit)))
end
end
return table.concat(parts, sep2) .. mid
end
local add_unit = (parms.abbr == 'mos') or
parms[parms.opt_flip and 'out_range_x' or 'in_range_x'] or
(not want_name and parms.abbr_range_x)
local range = parms.range
if range and not add_unit then
unlink(first_unit)
end
local id = range and make_id(parms, range.n + 1, first_unit) or id1
local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, 'in')
if was_hyphenated then
add_unit = false
end
local result
local valinfo = first_unit.valinfo
if range then
for i = 0, range.n do
local enable_number_word
if i == range.n then
add_unit = false
enable_number_word = true
end
decorate_value(parms, first_unit, i+1, enable_number_word)
local show = valinfo[i+1].show
if add_unit then
show = show .. first_unit.sep .. (i == 0 and id1 or make_id(parms, i+1, first_unit))
end
if i == 0 then
result = show
else
result = range_text(range[i], want_name, parms, result, show, 'in')
end
end
else
decorate_value(parms, first_unit, 1, true)
result = valinfo[1].show
end
return result .. preunit .. extra
end
local function process_one_output(parms, out_current)
-- Processing required for each output unit.
-- Return block of text to represent output (value/unit).
local inout = out_current.inout -- normally 'out' but can be 'in' for order=out
local id1, want_name = make_id(parms, 1, out_current)
local sep = out_current.sep -- set by make_id
local preunit = parms.preunit2
if preunit then
sep = '' -- any separator is included in preunit
else
preunit = ''
end
if parms.opt_output_unit_only then
if want_name and parms.opt_adjectival then
return preunit .. hyphenated(id1)
end
return preunit .. id1
end
if out_current.builtin == 'mach' and out_current.sep ~= '' then -- '' means omitsep with non-enwiki name
local prefix = id1 .. ' '
local range = parms.range
local valinfo = out_current.valinfo
local result = prefix .. valinfo[1].show
if range then
-- For simplicity and because more not needed, handle one range item only.
result = range_text(range[1], want_name, parms, result, prefix .. valinfo[2].show, inout, {spaced=true})
end
return preunit .. result
end
local add_unit = (parms[parms.opt_flip and 'in_range_x' or 'out_range_x'] or
(not want_name and parms.abbr_range_x)) and
not parms.opt_output_number_only
local range = parms.range
if range and not add_unit then
unlink(out_current)
end
local id = range and make_id(parms, range.n + 1, out_current) or id1
local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, inout)
if was_hyphenated then
add_unit = false
end
local result
local valinfo = out_current.valinfo
if range then
for i = 0, range.n do
local enable_number_word
if i == range.n then
add_unit = false
enable_number_word = true
end
decorate_value(parms, out_current, i+1, enable_number_word)
local show = valinfo[i+1].show
if add_unit then
show = show .. out_current.sep .. (i == 0 and id1 or make_id(parms, i+1, out_current))
end
if i == 0 then
result = show
else
result = range_text(range[i], want_name, parms, result, show, inout)
end
end
else
decorate_value(parms, out_current, 1, true)
result = valinfo[1].show
end
if parms.opt_output_number_only then
return result
end
return result .. preunit .. extra
end
local function make_output_single(parms, in_unit_table, out_unit_table)
-- Return true, item where item = wikitext of the conversion result
-- for a single output (which is not a combination or a multiple);
-- or return false, t where t is an error message table.
if parms.opt_order_out and in_unit_table.unitcode == out_unit_table.unitcode then
out_unit_table.valinfo = in_unit_table.valinfo
else
out_unit_table.valinfo = collection()
for _, v in ipairs(in_unit_table.valinfo) do
local success, info = cvtround(parms, v, in_unit_table, out_unit_table)
if not success then return false, info end
out_unit_table.valinfo:add(info)
end
end
return true, process_one_output(parms, out_unit_table)
end
local function make_output_multiple(parms, in_unit_table, out_unit_table)
-- Return true, item where item = wikitext of the conversion result
-- for an output which is a multiple (like 'ftin');
-- or return false, t where t is an error message table.
local inout = out_unit_table.inout -- normally 'out' but can be 'in' for order=out
local multiple = out_unit_table.multiple -- table of scaling factors (will not be nil)
local combos = out_unit_table.combination -- table of unit tables (will not be nil)
local abbr = parms.abbr
local abbr_org = parms.abbr_org
local disp = parms.disp
local want_name = (abbr_org == nil and (disp == 'or' or disp == 'slash')) or
not (abbr == 'on' or abbr == inout or abbr == 'mos')
local want_link = (parms.lk == 'on' or parms.lk == inout)
local mid = parms.opt_flip and parms.mid or ''
local sep1 = ' '
local sep2 = ' '
if parms.opt_adjectival and want_name then
sep1 = '-'
sep2 = '-'
end
local do_spell = parms.opt_spell_out
parms.opt_spell_out = nil -- so the call to cvtround does not spell the value
local function make_result(info, isfirst)
local fmt, outvalue, sign
local results = {}
for i = 1, #combos do
local tfrac, thisvalue, strforce
local out_current = combos[i]
out_current.inout = inout
local scale = multiple[i]
if i == 1 then -- least significant unit ('in' from 'ftin')
local decimals
out_current.frac = out_unit_table.frac
local success, outinfo = cvtround(parms, info, in_unit_table, out_current)
if not success then return false, outinfo end
if isfirst then
out_unit_table.valinfo = { outinfo } -- in case output value of first least significant unit is needed
end
sign = outinfo.sign
tfrac = outinfo.fraction_table
if outinfo.is_scientific then
strforce = outinfo.show
decimals = ''
elseif tfrac then
decimals = ''
else
local show = outinfo.show -- number as a string in local language
local p1, p2 = show:find(numdot, 1, true)
decimals = p1 and show:sub(p2 + 1) or '' -- text after numdot, if any
end
fmt = '%.' .. ulen(decimals) .. 'f' -- to reproduce precision
if decimals == '' then
if tfrac then
outvalue = floor(outinfo.raw_absvalue) -- integer part only; fraction added later
else
outvalue = floor(outinfo.raw_absvalue + 0.5) -- keep all integer digits of least significant unit
end
else
outvalue = outinfo.absvalue
end
end
if scale then
outvalue, thisvalue = divide(outvalue, scale)
else
thisvalue = outvalue
end
local id
if want_name then
if varname then
local clean
if strforce or tfrac then
clean = '.1' -- dummy value to force name for floating point
else
clean = format(fmt, thisvalue)
end
id = variable_name(clean, out_current)
else
local key = 'name2'
if parms.opt_adjectival then
key = 'name1'
elseif tfrac then
if thisvalue == 0 then
key = 'name1'
end
elseif parms.opt_singular then
if 0 < thisvalue and thisvalue < 1.0001 then
key = 'name1'
end
else
if thisvalue == 1 then
key = 'name1'
end
end
id = out_current[key]
end
else
id = out_current['symbol']
end
if i == 1 and omit_separator(id) then
-- Testing the id of the least significant unit should be sufficient.
sep1 = ''
sep2 = ''
end
if want_link then
local link = out_current.link
if link then
id = make_link(link, id, out_current)
end
end
local strval
local spell_inout = (i == #combos or outvalue == 0) and inout or '' -- trick so the last value processed (first displayed) has uppercase, if requested
if strforce and outvalue == 0 then
sign = '' -- any sign is in strforce
strval = strforce -- show small values in scientific notation; will only use least significant unit
elseif tfrac then
local wholestr = (thisvalue > 0) and tostring(thisvalue) or nil
strval = format_fraction(parms, spell_inout, false, wholestr, tfrac.numstr, tfrac.denstr, do_spell)
else
strval = (thisvalue == 0) and from_en('0') or with_separator(parms, format(fmt, thisvalue))
if do_spell then
strval = spell_number(parms, spell_inout, strval) or strval
end
end
table.insert(results, strval .. sep1 .. id)
if outvalue == 0 then
break
end
fmt = '%.0f' -- only least significant unit can have a non-integral value
end
local reversed, count = {}, #results
for i = 1, count do
reversed[i] = results[count + 1 - i]
end
return true, sign .. table.concat(reversed, sep2)
end
local valinfo = in_unit_table.valinfo
local success, result = make_result(valinfo[1], true)
if not success then return false, result end
local range = parms.range
if range then
for i = 1, range.n do
local success, result2 = make_result(valinfo[i+1])
if not success then return false, result2 end
result = range_text(range[i], want_name, parms, result, result2, inout, {spaced=true})
end
end
return true, result .. mid
end
local function process(parms, in_unit_table, out_unit_table)
-- Return true, s, outunit where s = final wikitext result,
-- or return false, t where t is an error message table.
linked_pages = {}
local success, bad_output
local bad_input_mcode = in_unit_table.bad_mcode -- nil if input unit is a valid convert unit
local out_unit = parms.out_unit
if out_unit == nil or out_unit == '' or type(out_unit) == 'function' then
-- out_unit can be set to a function by adjustparameters in Module:Convert/wikidata.
if bad_input_mcode or parms.opt_input_unit_only then
bad_output = ''
else
local getdef = type(out_unit) == 'function' and out_unit or get_default
success, out_unit = getdef(in_unit_table.valinfo[1].value, in_unit_table)
parms.out_unit = out_unit
if not success then
bad_output = out_unit
end
end
end
if not bad_output and not out_unit_table then
success, out_unit_table = lookup(parms, out_unit, 'any_combination')
if success then
local mismatch = check_mismatch(in_unit_table, out_unit_table)
if mismatch then
bad_output = mismatch
end
else
bad_output = out_unit_table
end
end
local lhs, rhs
local flipped = parms.opt_flip and not bad_input_mcode
if bad_output then
rhs = (bad_output == '') and '' or message(parms, bad_output)
elseif parms.opt_input_unit_only then
rhs = ''
else
local combos -- nil (for 'ft' or 'ftin'), or table of unit tables (for 'm ft')
if not out_unit_table.multiple then -- nil/false ('ft' or 'm ft'), or table of factors ('ftin')
combos = out_unit_table.combination
end
local frac = parms.frac -- nil or denominator of fraction for output values
if frac then
-- Apply fraction to the unit (if only one), or to non-SI units (if a combination),
-- except that if a precision is also specified, the fraction only applies to
-- the hand unit; that allows the following result:
-- {{convert|156|cm|in hand|1|frac=2}} → 156 centimetres (61.4 in; 15.1½ hands)
-- However, the following is handled elsewhere as a special case:
-- {{convert|156|cm|hand in|1|frac=2}} → 156 centimetres (15.1½ hands; 61½ in)
if combos then
local precision = parms.precision
for _, unit in ipairs(combos) do
if unit.builtin == 'hand' or (not precision and not unit.prefixes) then
unit.frac = frac
end
end
else
out_unit_table.frac = frac
end
end
local outputs = {}
local imax = combos and #combos or 1 -- 1 (single unit) or number of unit tables
if imax == 1 then
parms.opt_order_out = nil -- only useful with an output combination
end
if not flipped and not parms.opt_order_out then
-- Process left side first so any duplicate links (from lk=on) are suppressed
-- on right. Example: {{convert|28|e9pc|e9ly|abbr=off|lk=on}}
lhs = process_input(parms, in_unit_table)
end
for i = 1, imax do
local success, item
local out_current = combos and combos[i] or out_unit_table
out_current.inout = 'out'
if i == 1 then
if imax > 1 and out_current.builtin == 'hand' then
out_current.out_next = combos[2] -- built-in hand can influence next unit in a combination
end
if parms.opt_order_out then
out_current.inout = 'in'
end
end
if out_current.multiple then
success, item = make_output_multiple(parms, in_unit_table, out_current)
else
success, item = make_output_single(parms, in_unit_table, out_current)
end
if not success then return false, item end
outputs[i] = item
end
if parms.opt_order_out then
lhs = outputs[1]
table.remove(outputs, 1)
end
local sep = parms.table_joins and parms.table_joins[2] or parms.join_between
rhs = table.concat(outputs, sep)
end
if flipped or not lhs then
local input = process_input(parms, in_unit_table)
if flipped then
lhs = rhs
rhs = input
else
lhs = input
end
end
if parms.join_before then
lhs = parms.join_before .. lhs
end
local wikitext
if bad_input_mcode then
if bad_input_mcode == '' then
wikitext = lhs
else
wikitext = lhs .. message(parms, bad_input_mcode)
end
elseif parms.table_joins then
wikitext = parms.table_joins[1] .. lhs .. parms.table_joins[2] .. rhs
else
wikitext = lhs .. parms.joins[1] .. rhs .. parms.joins[2]
end
if parms.warnings and not bad_input_mcode then
wikitext = wikitext .. parms.warnings
end
return true, get_styles(parms) .. wikitext, out_unit_table
end
local function _main_convert(confArgs, parmsArgs, frame)
-- Do convert, and if needed, do it again with higher default precision.
local parms = { frame = frame or mw.getCurrentFrame() } -- will hold template arguments, after translation
set_config(confArgs)
local success, result = get_parms(parms, parmsArgs)
if success then
if type(result) ~= 'table' then
return tostring(result)
end
local in_unit_table = result
local out_unit_table
for _ = 1, 2 do -- use counter so cannot get stuck repeating convert
success, result, out_unit_table = process(parms, in_unit_table, out_unit_table)
if success and parms.do_convert_again then
parms.do_convert_again = false
else
break
end
end
end
-- If input=x gives a problem, the result should be just the user input
-- (if x is a property like P123 it has been replaced with '').
-- An unknown input unit would display the input and an error message
-- with success == true at this point.
-- Also, can have success == false with a message that outputs an empty string.
if parms.input_text then
if success and not parms.have_problem then
return result
end
local cat
if parms.tracking then
-- Add a tracking category using the given text as the category sort key.
-- There is currently only one type of tracking, but in principle multiple
-- items could be tracked, using different sort keys for convenience.
cat = wanted_category('tracking', parms.tracking)
end
return parms.input_text .. (cat or '')
end
return success and result or message(parms, result)
end
local function main_convert(frame)
return _main_convert(frame.args, frame:getParent().args, frame)
end
local function _unit(unitcode, options)
-- Helper function for Module:Val to look up a unit.
-- Parameter unitcode must be a string to identify the wanted unit.
-- Parameter options must be nil or a table with optional fields:
-- value = number (for sort key; default value is 1)
-- scaled_top = nil for a normal unit, or a number for a unit which is
-- the denominator of a per unit (for sort key)
-- si = { 'symbol', 'link' }
-- (a table with two strings) to make an SI unit
-- that will be used for the look up
-- link = true if result should be [[linked]]
-- sort = 'on' or 'debug' if result should include a sort key in a
-- span element ('debug' makes the key visible)
-- name = true for the name of the unit instead of the symbol
-- us = true for the US spelling of the unit, if any
-- Return nil if unitcode is not a non-empty string.
-- Otherwise return a table with fields:
-- text = requested symbol or name of unit, optionally linked
-- scaled_value = input value adjusted by unit scale; used for sort key
-- sortspan = span element with sort key like that provided by {{ntsh}},
-- calculated from the result of converting value
-- to a base unit with scale 1.
-- unknown = true if the unitcode was not known
unitcode = strip(unitcode)
if unitcode == nil or unitcode == '' then
return nil
end
set_config({})
linked_pages = {}
options = options or {}
local parms = {
abbr = options.name and 'off' or 'on',
lk = options.link and 'on' or nil,
opt_sp_us = options.us and true or nil,
opt_ignore_error = true, -- do not add pages using this function to 'what links here' for Module:Convert/extra
opt_sortable_on = options.sort == 'on' or options.sort == 'debug',
opt_sortable_debug = options.sort == 'debug',
}
if options.si then
-- Make a dummy table of units (just one unit) for lookup to use.
-- This makes lookup recognize any SI prefix in the unitcode.
local symbol = options.si[1] or '?'
parms.unittable = { [symbol] = {
_name1 = symbol,
_name2 = symbol,
_symbol = symbol,
utype = symbol,
scale = symbol == 'g' and 0.001 or 1,
prefixes = 1,
default = symbol,
link = options.si[2],
}}
end
local success, unit_table = lookup(parms, unitcode, 'no_combination')
if not success then
unit_table = setmetatable({
symbol = unitcode, name2 = unitcode, utype = unitcode,
scale = 1, default = '', defkey = '', linkey = '' }, unit_mt)
end
local value = tonumber(options.value) or 1
local clean = tostring(abs(value))
local info = {
value = value,
altvalue = value,
singular = (clean == '1'),
clean = clean,
show = clean,
}
unit_table.inout = 'in'
unit_table.valinfo = { info }
local sortspan, scaled_value
if options.sort then
sortspan, scaled_value = make_table_or_sort(parms, value, info, unit_table, options.scaled_top)
end
return {
text = make_id(parms, 1, unit_table),
sortspan = sortspan,
scaled_value = scaled_value,
unknown = not success and true or nil,
}
end
return { convert = main_convert, _convert = _main_convert, _unit = _unit }
84ef1800df9ddbc24da3d295d74282d1c59ec2b5
Captain Yulia
0
742
1144
2025-08-06T13:05:28Z
Sharparam
284703
Redirected page to [[Royal Division Captain Yulia]]
wikitext
text/x-wiki
#REDIRECT [[Royal Division Captain Yulia]]
944a6e86bec704d704b6109fc690822aa40d60b9
Vermillion Mirage
0
753
1166
2025-08-06T13:05:55Z
Sharparam
284703
Redirected page to [[Royal Division Captain Yulia & Vermillion Mirage]]
wikitext
text/x-wiki
#REDIRECT [[Royal Division Captain Yulia & Vermillion Mirage]]
a706f52584d29641b5b3d4ebd9403828f396a0e3
Royal Division Captain Yulia & Vermillion Mirage
0
551
862
2025-08-06T13:16:49Z
Sharparam
284703
Update entropy gain description
wikitext
text/x-wiki
{{Infobox/Boss
| image = Final boss.png
}}
'''{{PAGENAME}}''' is the final [[Bosses|boss]] in {{BFF}}.
== Overview ==
When starting the fight, only the [[Vermillion Mirage]] will be present, including showing only its name in the boss healthbar.
After the mirage takes a certain amount of damage, [[Royal Division Captain Yulia]] will join the fight, updating the name in the boss healthbar to include both of them.
Dying for any reason after Yulia joins the fight causes the player to gain 0.5% [[entropy]]. This is because the act of her joining applies a debuff to the player causing entropy gain on death.
Throughout the fight, they will take turns being the active enemy, with the other one falling back to take a more passive role and using various ranged abilities on the player.
Defeating the boss will immediately trigger the [[Endings|ending]] cutscene.
After getting back to the title screen, the save file can be loaded again which will put the player at the same homunculus, allowing for the boss to be fought again. This makes it the only boss in the game that can be fought multiple times without having to start a new game.
== Location ==
Found at the end of [[Vermillion Fields]]. At the final location of the "Temple" [[Homunculus]], head up the large stairs and the boss arena will be at the top.
{{Navbox/Bosses}}
[[Category:Pages that need coordinates]]
dfff03fcfd660a270e379514af4cb192c6e3d589
Entropy
0
709
1084
2025-08-06T13:17:41Z
Sharparam
284703
Update description for final boss
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a property of the player in {{BFF}}.
== Overview ==
Entropy can only be gained from a few sources.
* Dying to a [[Vermillion Knight]] increases entropy by 0.25%.
* Dying during phase 2 of the [[Royal Division Captain Yulia & Vermillion Mirage]] boss fight (after Yulia joins the fight) increases entropy by 0.5%.
Upon reaching 100% entropy, the player's save file is deleted.
[[Category:Game mechanics]]
cda5c4f1fca74bd5447670462ba15ebe07df0b38
Template:Infobox/Weapon
10
451
666
2025-08-19T02:14:26Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| bow
| ranged = [[Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| bow
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| bow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
6ed81445f4e99c129429ea030ff07667c32cc439
Main Page
0
1
1
2025-08-20T01:22:19Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Bleak Faith: Forsaken Wiki]]
cbeda71f0e01355547a440cf49c164ea0bce9014
2
1
2025-08-20T01:22:20Z
ARTIFICER
564804
Protected "[[Main Page]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
#redirect [[Bleak Faith: Forsaken Wiki]]
cbeda71f0e01355547a440cf49c164ea0bce9014
Bleak Faith: Forsaken Wiki
0
2
3
2025-08-20T01:22:20Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<!-- Hello and welcome to wiki.gg! This page is built via our IMProved Main Page (IMP) framework. If you are familiar with CSS grid areas, that's what you're defining here! But if you don't know any CSS that's ok!
👀 RULE 1: the same keyword represents the same section & can span multiple cells
👀 RULE 2: Each box in each layout must be a CONTIGUOUS RECTANGLE of any dimensions (most likely one of: 1x1, 1x2, 2x1, 2x2, 1x3, 3x1, 3x2, 2x3)
👀 RULE 3: This page defines LAYOUT ONLY. To edit the content, please use the links provided for you after saving/previewing your page.
👀 RULE 4: If you want to RENAME or ADD a box, (1) add a new section to the grid layout below (all three breakpoints!) and then (2) save or preview this page and then (3) click "Create this box"
-->{{Main page
|desktop=
<!-- for WIDE SCREENS -->
<!-- 👀 keep this at 3 columns, but you can otherwise rearrange as desired -->
welcome welcome welcome
about pages pages
contribute contribute external
<!-- end WIDE SCREEN layout -->
|tablet=
<!-- for TABLET SCREENS -->
<!-- 👀 keep this at 2 columns, but you can otherwise rearrange as desired -->
welcome welcome
about pages
contribute external
<!-- end TABLET SCREEN layout -->
|mobile=
<!-- for MOBILE DEVICES -->
<!-- 👀 keep this at 1 column, but you can otherwise rearrange as desired -->
welcome
about
pages
external
contribute
<!-- end MOBILE DEVICE layout -->
}}
{{#description2:Welcome to the {{SITENAME}}, a collaborative wiki resource that is open for anyone to edit!}} <!-- this is a short description of your wiki, which will appear in embeds in Google search results, Discord links, etc. -->
c5d4351377806d884e84bc34774f85fd4a425e0a
4
3
2025-08-20T01:22:21Z
ARTIFICER
564804
Protected "[[Bleak Faith: Forsaken Wiki]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<!-- Hello and welcome to wiki.gg! This page is built via our IMProved Main Page (IMP) framework. If you are familiar with CSS grid areas, that's what you're defining here! But if you don't know any CSS that's ok!
👀 RULE 1: the same keyword represents the same section & can span multiple cells
👀 RULE 2: Each box in each layout must be a CONTIGUOUS RECTANGLE of any dimensions (most likely one of: 1x1, 1x2, 2x1, 2x2, 1x3, 3x1, 3x2, 2x3)
👀 RULE 3: This page defines LAYOUT ONLY. To edit the content, please use the links provided for you after saving/previewing your page.
👀 RULE 4: If you want to RENAME or ADD a box, (1) add a new section to the grid layout below (all three breakpoints!) and then (2) save or preview this page and then (3) click "Create this box"
-->{{Main page
|desktop=
<!-- for WIDE SCREENS -->
<!-- 👀 keep this at 3 columns, but you can otherwise rearrange as desired -->
welcome welcome welcome
about pages pages
contribute contribute external
<!-- end WIDE SCREEN layout -->
|tablet=
<!-- for TABLET SCREENS -->
<!-- 👀 keep this at 2 columns, but you can otherwise rearrange as desired -->
welcome welcome
about pages
contribute external
<!-- end TABLET SCREEN layout -->
|mobile=
<!-- for MOBILE DEVICES -->
<!-- 👀 keep this at 1 column, but you can otherwise rearrange as desired -->
welcome
about
pages
external
contribute
<!-- end MOBILE DEVICE layout -->
}}
{{#description2:Welcome to the {{SITENAME}}, a collaborative wiki resource that is open for anyone to edit!}} <!-- this is a short description of your wiki, which will appear in embeds in Google search results, Discord links, etc. -->
c5d4351377806d884e84bc34774f85fd4a425e0a
Bleak Faith: Forsaken Wiki/welcome
0
4
6
2025-08-20T01:22:22Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Main page box/start
| title = Welcome to the {{SITENAME}}!
}}
We are currently maintaining [[Special:AllPages|{{NUMBEROFARTICLES}} articles]]. Please feel free to contribute by creating new articles or expanding existing ones.
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
96df981ef23fca9434d1586228cab8a51e0fdc0a
7
6
2025-08-20T01:22:22Z
ARTIFICER
564804
Protected "[[Bleak Faith: Forsaken Wiki/welcome]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
{{Main page box/start
| title = Welcome to the {{SITENAME}}!
}}
We are currently maintaining [[Special:AllPages|{{NUMBEROFARTICLES}} articles]]. Please feel free to contribute by creating new articles or expanding existing ones.
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
96df981ef23fca9434d1586228cab8a51e0fdc0a
Bleak Faith: Forsaken Wiki/pages
0
5
8
2025-08-20T01:22:22Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Main page box/start
| title = Useful wiki pages
| class = centered-content
}}
<div class="mp-links columns-2">
* {{MP link|Important page here|image=Wiki.gg logo-pink.svg|size=92px}}
* {{MP link|Random page|link=Special:Random}}
* {{MP link|Example character|link=Example character|image=Example_character_image.png|size=92px}}
* {{MP link|Example character infobox|link=Template:Example character infobox|image=Example_character_image.png|size=92px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
827f14b4cd3d346ca427f95e9574fc23c4874206
9
8
2025-08-20T01:22:23Z
ARTIFICER
564804
Protected "[[Bleak Faith: Forsaken Wiki/pages]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
{{Main page box/start
| title = Useful wiki pages
| class = centered-content
}}
<div class="mp-links columns-2">
* {{MP link|Important page here|image=Wiki.gg logo-pink.svg|size=92px}}
* {{MP link|Random page|link=Special:Random}}
* {{MP link|Example character|link=Example character|image=Example_character_image.png|size=92px}}
* {{MP link|Example character infobox|link=Template:Example character infobox|image=Example_character_image.png|size=92px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
827f14b4cd3d346ca427f95e9574fc23c4874206
Bleak Faith: Forsaken Wiki/about
0
6
10
2025-08-20T01:22:23Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Main page box/start
| title = About Bleak Faith: Forsaken
}}
This is an example main page. You can redesign it however you want, or you can keep the layout the same but change the contents (e.g. this part should talk about your game). Take a look at some other wiki.gg wikis for inspiration!
<div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
d5a0888496afa538312e1253db527add7089b342
11
10
2025-08-20T01:22:24Z
ARTIFICER
564804
Protected "[[Bleak Faith: Forsaken Wiki/about]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
{{Main page box/start
| title = About Bleak Faith: Forsaken
}}
This is an example main page. You can redesign it however you want, or you can keep the layout the same but change the contents (e.g. this part should talk about your game). Take a look at some other wiki.gg wikis for inspiration!
<div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
d5a0888496afa538312e1253db527add7089b342
Bleak Faith: Forsaken Wiki/contribute
0
7
12
2025-08-20T01:22:24Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Main page box/start
| title = Contribute to the wiki
}}
{{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players.
; Adding content
:* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done.
:* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough.
:* [[Special:UserLogin/signup|Register]] to edit and track your contributions.
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
8b79debc73480ec2b12cb5e39723b94532fd44bd
13
12
2025-08-20T01:22:24Z
ARTIFICER
564804
Protected "[[Bleak Faith: Forsaken Wiki/contribute]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
{{Main page box/start
| title = Contribute to the wiki
}}
{{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players.
; Adding content
:* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done.
:* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough.
:* [[Special:UserLogin/signup|Register]] to edit and track your contributions.
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
8b79debc73480ec2b12cb5e39723b94532fd44bd
Bleak Faith: Forsaken Wiki/external
0
8
14
2025-08-20T01:22:24Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Main page box/start
| title = External links
}}
<div class="mp-links columns-2">
* {{MP link|Official site|link=https://wiki.gg}}
* {{MP link|Discord|link=https://discord.gg/rTnST57tuW|image=Discord.svg|size=64x64px}}
* {{MP link|Bluesky|link=https://bsky.app/profile/wiki.gg|image=Bluesky.svg|size=64x64px}}
* {{MP link|indie.io|link=https://www.indie.io/|image=indie.io.svg|size=64x64px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
bb8190c57bb4cc147764d1c10f218fe4d34e0a49
15
14
2025-08-20T01:22:25Z
ARTIFICER
564804
Protected "[[Bleak Faith: Forsaken Wiki/external]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
{{Main page box/start
| title = External links
}}
<div class="mp-links columns-2">
* {{MP link|Official site|link=https://wiki.gg}}
* {{MP link|Discord|link=https://discord.gg/rTnST57tuW|image=Discord.svg|size=64x64px}}
* {{MP link|Bluesky|link=https://bsky.app/profile/wiki.gg|image=Bluesky.svg|size=64x64px}}
* {{MP link|indie.io|link=https://www.indie.io/|image=indie.io.svg|size=64x64px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
bb8190c57bb4cc147764d1c10f218fe4d34e0a49
Meta:Default Loadout Wiki:Copyrights
4
9
16
2025-08-20T01:22:26Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<!--''[[GAME]]'' content and materials are the intellectual property of their respective owners.
-->Content that you make available on {{SITENAME}} is licensed by you to us under our [{{int:wikigg-tos-url}} Terms of Service]. Do not make content available on {{SITENAME}} where you do not have the necessary rights to grant this license.
All textual and graphical content on {{SITENAME}} that we may lawfully license is licensed to you under the [https://creativecommons.org/licenses/by-sa/4.0 Creative Commons Attribution-ShareAlike 4.0] license.
[[Category:Legal notices]]
a5c705cf276359aef94d426ee75d18bbf1e361ac
17
16
2025-08-20T01:22:26Z
ARTIFICER
564804
Protected "[[Meta:Default Loadout Wiki:Copyrights]]" ([Edit=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<!--''[[GAME]]'' content and materials are the intellectual property of their respective owners.
-->Content that you make available on {{SITENAME}} is licensed by you to us under our [{{int:wikigg-tos-url}} Terms of Service]. Do not make content available on {{SITENAME}} where you do not have the necessary rights to grant this license.
All textual and graphical content on {{SITENAME}} that we may lawfully license is licensed to you under the [https://creativecommons.org/licenses/by-sa/4.0 Creative Commons Attribution-ShareAlike 4.0] license.
[[Category:Legal notices]]
a5c705cf276359aef94d426ee75d18bbf1e361ac
Module:Infobox
828
10
18
2025-08-20T01:22:26Z
ARTIFICER
564804
Importing default loadout
Scribunto
text/plain
-- version 0.1.7
--------------------------------------
-- User settings, you can modify these
--------------------------------------
-- if you want to not always use divs in your wiki (as opposed to tables), you can change this default
-- just remember to change it back each time you update from the main "branch" on the support wiki!
-- you can also control it per infobox with `|useDivs=yes` or `|useDivs=no`
local USE_DIVS = true -- `false` or `true`
-- default value to show if a param is missing in some but not all tabs.
-- set to `nil` (not in quotes) to remove such rows altogether in the tabs where they're missing
local TABBED_NONEXIST = nil -- `''` or `nil` or `'N/A'` etc. Don't put nil in quotes.
---------------------------------------------------------------------------
-- Do not modify anything below this line unless you know what you're doing
---------------------------------------------------------------------------
local h = {}
local p = {}
local hooks = {}
function p.arraymap(frame)
-- a lua implementation of Page Forms' arraymap
local args = h.overwrite()
local items = h.split(args[1], args[2] or ',')
for i, item in ipairs(items) do
items[i] = args[4]:gsub(args[3], item)
end
return table.concat(items, args[5] or ',')
end
function p.preprocess(frame)
return frame:preprocess(frame.args[1] or frame:getParent().args[1])
end
function p.main(frame)
h.registerHooks()
h.increment()
local args = h.overwrite()
local sep = args.sep or ','
h.castArgs(args, sep)
if h.castBool(args.setmainimage or 'yes') then
h.setMainImage(args.images[1])
end
-- suggest to use HIDDENCAT here; will be used for maintenance & gadget imports
return h.makeInfobox(args, sep), '[[Category:Pages with DRUID infoboxes]]'
end
function h.registerHooks()
if not mw.title.new('Module:Infobox/Hooks').exists then return end
hooks = require('Module:Infobox/Hooks')
end
function h.runHook(key, ...)
if hooks[key] then
hooks[key](...)
end
end
function h.increment()
-- optional use of VariablesLua for better compatibility
local VariablesLua = mw.ext.VariablesLua
if VariablesLua == nil then
local res
-- try to fall back to normal Variables
res, h.counter = pcall(
function()
return mw.getCurrentFrame():callParserFunction('#var', {'DRUID_INFOBOX_ID', 0}) + 1
end
)
if res then
mw.getCurrentFrame():callParserFunction('#vardefine', {'DRUID_INFOBOX_ID', h.counter})
else
-- else use a random number so at least there's some unique id
h.counter = math.random(100000000000000000) -- random integer
end
else
h.counter = VariablesLua.var('DRUID_INFOBOX_ID', 0) + 1
VariablesLua.vardefine('DRUID_INFOBOX_ID', h.counter)
end
end
function h.castArgs(args, sep)
h.runHook('onCastArgsStart', args, sep, args.kind)
args.tabs = h.split(args.tabs or args.image_labels, sep)
args.images = h.getImages(args, sep)
args.sections = h.split(args.sections, sep)
for _, section in ipairs(args.sections) do
if h.castBool(args[section .. '_isdata']) then
args[section .. 'Data'] = args[section]
args[section] = section .. 'Data'
args[section .. 'Data_nolabel'] = 'true' -- will be cast later
end
args[section] = h.split(args[section], sep)
args[section .. '_tabs'] = h.split(args[section .. '_tabs'], sep)
if #args.tabs > 0 and #args[section .. '_tabs'] > 0 then
error(('You cannot specify |tabs= and |%s= at the same time, please pick one'):format(section .. '_tabs'))
end
end
if args.useDivs then
USE_DIVS = h.castBool(args.useDivs)
end
-- this would be in the outer scope, but we're hiding it
h.entityType = USE_DIVS and 'div' or 'table' -- key of h.htmlEntities
h.runHook('onCastArgsEnd', args, sep, args.kind)
end
function h.getImages(args, sep)
if args.image and not args.images then
args.images = args.image
end
if args.images then
return h.split(args.images, sep)
end
if not args.tabs then return {} end
local ret = {}
for _, key in ipairs(args.tabs) do
if args[key .. '_image'] then
ret[#ret+1] = args[key .. '_image']
end
end
return ret
end
function h.setMainImage(file)
if h.counter > 1 then return end
if not file then return end
local fileText = file:gsub('.-:', '')
fileText = fileText:gsub('^([^|%]]+).*', '%1')
-- setmainimage is guaranteed to exist on wiki.gg but may not exist on other wikis
-- it's not a crucial piece of functionality so we'll fail silently if it doesn't exist
pcall(function() mw.getCurrentFrame():callParserFunction{
name = '#setmainimage',
args = { fileText },
} end)
end
function h.makeInfobox(args, sep)
local out = mw.html.create(h.getTag('container'))
:addClass('druid-infobox')
:addClass('druid-container')
:addClass('noexcerpt')
:addClass(args.class) -- warning: class can be nil, don't concat anything
:attr('id', args.id or ('druid-container-' .. h.counter))
h.runHook('onMakeOutputStart', out, args)
if args.kind then out:addClass('druid-container-' .. h.escape(args.kind)) end
h.printTitle(out, args)
h.printImages(out, args.images, args)
for _, section in ipairs(args.sections) do
-- cannot begin tagging here because we don't know if any applicable args are present
local cols = args[section .. '_columns']
local makeSection = cols and h.makeGridSection or h.makeSection
out:node(makeSection(section, args[section], args, tonumber(cols)))
end
h.runHook('onMakeOutputEnd', out, args)
-- category for gadget loading
return out, '[[Category:Pages with DRUID infoboxes]]'
end
function h.printTitle(out, args)
local tabs = args.tabs
if not tabs or #tabs == 0 then
h.printSimpleTitle(out, args)
return
end
if not h.hasComplexData('title', tabs, args) then
h.printSimpleTitle(out, args)
return
end
local node = h.printTitleWrapper(out)
h.printTabbedDataItem(node, 'title', tabs, args)
end
function h.printSimpleTitle(out, args)
if args.title then
local node = h.printTitleWrapper(out)
node:wikitext(args.title)
end
end
function h.printTitleWrapper(out)
return out:tag(h.getTag('titleOuter'))
:tag(h.getTag('titleInner'))
:addClass('druid-title')
:attr('colspan', 2)
end
function h.printTabbedDataItem(node, item, tabs, args)
-- hasData isn't used in the title case but we will need to track this
-- when we're printing section data later on
-- so we'll just track it always
local hasData = false
for i, label in ipairs(tabs) do
local div = node:tag('div')
:addClass('druid-toggleable-data')
:addClass('druid-toggleable')
:attr('data-druid', h.counter .. '-' .. i)
:attr('data-druid-tab-key', label)
if h.getTabbedContent(args, label, item) then
hasData = true
div:wikitext('\n\n' .. h.getTabbedContent(args, label, item))
div:addClass('druid-toggleable-data-nonempty')
else
div:addClass('druid-toggleable-data-empty')
end
if i == 1 then div:addClass('focused') end
end
return hasData
end
function h.printImages(out, images, args)
if #images == 0 and #args.tabs == 0 then return end
-- burden is on the user to format this as an image. this should be done in the infobox template,
-- with something like |image={{#if:{{{image|}}}|[[File:{{{image|}}}{{!}}300px{{!}}link=]]}}
local td = out:tag(h.getTag('section'))
:addClass('druid-section-container')
:tag(h.getTag('cell'))
:attr('colspan', 2)
local tabs = args.tabs
local tabTexts = h.getImageTabTexts(tabs, images, args)
h.printTabs(td, tabs, tabTexts, false, args)
if #images == 0 then return end
if #images == 1 then
td:addClass('druid-main-image')
:wikitext(images[1])
if args.caption then
td:tag('div')
:addClass('druid-main-image-caption')
:wikitext(args.caption)
end
return
end
td:addClass('druid-main-images')
local imagesContainer = td:tag('div')
:addClass('druid-main-images-files')
for i, image in ipairs(images) do
local container = imagesContainer:tag('div')
:addClass('druid-main-images-file')
:addClass('druid-toggleable')
:attr('data-druid', h.counter .. '-' .. i)
:wikitext(image)
:attr('data-druid-tab-key', tabs[i])
local labelText
if tabs[i] then
labelText = args[tabs[i] .. '_label'] or tabs[i]
else
labelText = '[[Category:Infoboxes missing image labels]]Image ' .. i
end
if args[labelText .. '_caption'] then
container:tag('div')
:addClass('druid-main-images-caption')
:wikitext(args[labelText .. '_caption'])
end
if i == 1 then
container:addClass('focused')
end
end
end
function h.getImageTabTexts(tabs, images, args)
if #tabs == 0 and #images <= 1 then return {} end
local texts = {}
local i = 1
while images[i] or tabs[i] do
if tabs[i] then
texts[i] = args[tabs[i] .. '_label'] or tabs[i]
else
texts[i] = '[[Category:Infoboxes missing image labels]]Image ' .. i
end
i = i + 1
end
return texts
end
function h.printTabs(td, tabs, texts, isSection, args)
if #texts == 0 then return end
local container = td:tag('div')
:addClass('druid-main-images-labels')
:addClass('druid-tabs')
if isSection then
container:addClass('druid-section-tabs')
end
for i, item in ipairs(tabs) do
local label = container:tag('div')
:addClass('druid-main-images-label')
:addClass('druid-tab')
:addClass('druid-toggleable')
:attr('data-druid', h.counter .. '-' .. i)
:wikitext(texts[i])
:attr('data-druid-tab-key', item)
if isSection then
label:addClass('druid-section-tab')
else
label:addClass('druid-title-tab')
end
if i == 1 then
label:addClass('focused')
end
-- this can be null, don't concat anything here
label:addClass(args[item .. '_class'])
end
end
function h.makeGridSection(section, sectionFields, args, numCols)
local numItems = h.countItems(sectionFields, section, args)
if numItems == 0 then return end
local node = mw.html.create(h.getTag('section'))
:addClass('druid-section-container')
h.printSectionHeader(node, section, args)
h.printSectionTabs(node, section, args)
local tr = node:tag(h.getTag('row'))
:attr('data-druid-section-row', h.escape(section))
if args[section .. '_collapsed'] then
tr:addClass('druid-collapsed')
end
local grid = tr:tag(h.getTag('cell'))
:attr('colspan', 2)
:addClass('druid-grid-section')
:addClass('druid-grid-section-' .. h.escape(section))
:addClass(args[section .. '_class']) -- warning: class can be nil, don't concat anything
:tag('div')
:addClass('druid-grid')
local row, col, i = 1, 1, 1
local sizeOfLastRow = numItems % numCols
local lcm = h.getNumGridCols(numItems, sizeOfLastRow, numCols)
grid:css('grid-template-columns', ('repeat(%s, 1fr)'):format(lcm))
local size = lcm / numCols
for _, item in ipairs(sectionFields) do
local node = mw.html.create('div')
local shouldPrint = h.printData(node, item, section, args)
if shouldPrint then
if i == numItems - sizeOfLastRow + 1 then
size = lcm / sizeOfLastRow
end
i = i + 1
local gStart = (col - 1) * size + 1
local gEnd = (col) * size + 1
local itemContainer = grid:tag('div')
:addClass('druid-grid-item')
:addClass('druid-grid-item-' .. h.escape(item))
:addClass(args[item .. '_class']) -- warning: class can be nil, don't concat anything
:css('grid-column', ('%s / %s'):format(gStart, gEnd))
:css('grid-row', row)
if not h.castBool(args[item .. '_nolabel']) then
h.printLabel(itemContainer:tag('div'), item, args)
end
itemContainer:node(node)
if col == numCols then
row = row + 1
col = 1
else
col = col + 1
end
end
end
return node
end
function h.makeSection(section, sectionFields, args)
if section == '' then return end -- bruteforce fix for trailing commas
local shouldPrint = false
local container = mw.html.create(h.getTag('section'))
:addClass('druid-section-container')
:addClass(args[section .. '_class']) -- warning: class can be nil, don't concat anything
h.printSectionHeader(container, section, args)
h.printSectionTabs(container, section, args)
for _, item in ipairs(sectionFields) do
local node = mw.html.create(h.getTag('cell'))
local shouldPrintItem = h.printData(node, item, section, args)
if shouldPrintItem then
shouldPrint = true
local tr = container:tag(h.getTag('row'))
:addClass('druid-row')
:addClass('druid-row-' .. h.escape(item))
:addClass(args[item .. '_class']) -- warning: class can be nil, don't concat anything
:attr('data-druid-section-row', h.escape(section))
if args[section .. '_collapsed'] then
tr:addClass('druid-collapsed')
end
if h.castBool(args[item .. '_wide']) or h.castBool(args[item .. '_nolabel']) then
node
:attr('colspan', 2)
:addClass('druid-data-wide')
else
h.printLabel(tr:tag(h.getTag('label')), item, args)
end
tr:node(node)
end
end
if not shouldPrint then return nil end
return container
end
function h.countItems(sectionFields, section, args)
local numItems = 0
for _, v in ipairs(sectionFields) do
-- we aren't actually printing here, but we're finding out if we should print anything
-- because we need the count of columns before we print anything in grid data
if h.printData(mw.html.create(), v, section, args) then
numItems = numItems + 1
end
end
return numItems
end
function h.getNumGridCols(numItems, sizeOfLastRow, numCols)
if not numCols then return numItems, 1 end
if numItems < numCols then return numItems, 1 end
if sizeOfLastRow == 0 then
return numCols, 1
end
local a, b = sizeOfLastRow, numCols
while b ~= 0 do
a, b = b, a % b
end
local lcm = sizeOfLastRow * numCols / a
return lcm
end
function h.printLabel(node, item, args)
return node
:addClass('druid-label')
:addClass('druid-label-' .. h.escape(item))
:wikitext(args[item .. '_display'] or args[item .. '_label'] or item)
end
function h.printData(node, item, section, args)
-- prints data to the node
-- and also returns whether the item is nonempty or not
local hasData = false
local sectionTabs = args[section .. '_tabs']
local tabs = args.tabs
if sectionTabs and #sectionTabs > 0 then
tabs = sectionTabs
end
if not tabs or #tabs == 0 then
return h.printSimpleData(node, item, args)
end
if not h.hasComplexData(item, tabs, args) then
return h.printSimpleData(node, item, args)
end
hasData = hasData or h.printTabbedDataItem(node, item, tabs, args)
if hasData then
node:addClass('druid-data')
end
return hasData
end
function h.getTabbedContent(args, label, item)
return args[label .. '_' .. item] or args[item] or TABBED_NONEXIST
end
function h.printSimpleData(node, item, args)
if args[item] and type(args[item]) ~= 'string' then
error(("Invalid use of field %s as both a section and a data value"):format(item))
end
if not args[item] then return false end
node:addClass('druid-data')
:addClass('druid-data-' .. h.escape(item))
:addClass('druid-data-nonempty')
:wikitext('\n\n' .. args[item])
return true
end
function h.hasComplexData(item, tabs, args)
for _, v in ipairs(tabs) do
if args[v .. '_' .. item] then return true end
end
return false
end
function h.printSectionHeader(node, section, args)
if h.castBool(args[section .. '_nolabel']) then return end
local tr = node:tag(h.getTag('row'))
:attr('data-druid-section', h.escape(section))
local th = tr:tag(h.getTag('sectionTitle'))
:attr('colspan', 2)
:addClass('druid-section')
:addClass('druid-section-' .. h.escape(section))
if args[section .. '_collapsible'] or args[section .. '_collapsed'] then
tr:addClass('druid-collapsible')
if args[section .. '_collapsed'] then
tr:addClass('druid-collapsible-collapsed')
end
end
local emptySections = {}
for _, label in ipairs(args.tabs) do
local hasLabel = false
for _, item in ipairs(args[section] or {}) do
if h.getTabbedContent(args, label, item) then
hasLabel = true
end
end
if not hasLabel then emptySections[label] = true end
end
if not next(emptySections) then
th:wikitext(args[section .. '_label'] or section)
return
end
for i, label in ipairs(args.tabs) do
local div = th:tag('div')
:addClass('druid-toggleable-heading')
:addClass('druid-toggleable')
:attr('data-druid', h.counter .. '-' .. i)
:wikitext(args[section .. '_label'] or section)
-- we are going to print the section content even in empty nodes
-- for compatibility with browsers without :has, where hiding empty rows won't happen
if emptySections[label] then
div:addClass('druid-toggleable-heading-empty')
end
if i == 1 then
div:addClass('focused')
end
end
end
function h.printSectionTabs(node, section, args)
local tabs = args[section .. '_tabs']
if not tabs or #tabs == 0 then return end
local tr = node:tag(h.getTag('sectionTabsOuter'))
:attr('data-druid-section', h.escape(section))
local th = tr:tag(h.getTag('sectionTabs'))
:attr('colspan', 2)
:addClass('druid-section-tabs')
:addClass('druid-section-tabs-' .. h.escape(section))
local texts = {}
for i, item in ipairs(tabs) do
texts[i] = args[item .. '_label'] or item
end
h.printTabs(th, tabs, texts, true, args)
end
----------------------------
-- general utility functions
----------------------------
function h.overwrite()
-- this is a generic utility function that collects args from the invoke call & the parent template.
-- normally, you merge args with parent template overwriting the invoke call, but
-- since we'll be putting markup/formatting into our invoke call,
-- we actually want to overwrite what the user sent.
local f = mw.getCurrentFrame()
local origArgs = f.args
local parentArgs = f:getParent().args
local args = {}
for k, v in pairs(parentArgs) do
v = mw.text.trim(v)
if v ~= '' then
args[k] = v
end
end
for k, v in pairs(origArgs) do
v = mw.text.trim(tostring(v))
if v ~= '' then
args[k] = v
end
end
return args
end
-- generic utility functions
-- these would normally be provided by other modules, but to make installation easy
-- I'm including everything here
function h.split(text, pattern, plain)
if not text then
return {}
end
local ret = {}
for m in h.gsplit(text, pattern, plain) do
ret[#ret+1] = m
end
return ret
end
function h.gsplit( text, pattern, plain )
if not pattern then pattern = ',' end
if not plain then
pattern = '%s*' .. pattern .. '%s*'
end
local s, l = 1, text:len()
return function ()
if s then
local e, n = text:find( pattern, s, plain )
local ret
if not e then
ret = text:sub( s )
s = nil
elseif n < e then
-- Empty separator!
ret = text:sub( s, e )
if e < l then
s = e + 1
else
s = nil
end
else
ret = e > s and text:sub( s, e - 1 ) or ''
s = n + 1
end
return ret
end
end, nil, nil
end
function h.escape(s)
s = s:gsub(' ', '')
:gsub('"', '')
:gsub("'", '')
:gsub("%?", '')
:gsub("%%", '')
:gsub("%[", '')
:gsub("%]", '')
:gsub("{", '')
:gsub("}", '')
:gsub("!", '')
return s
end
-- normally I would make these constants at the top of the file
-- but I don't want to mistake them with user-set constants
h.boolFalse = { ['false'] = true, ['no'] = true, [''] = true, ['0'] = true, ['nil'] = true }
function h.castBool(x)
if not x then return false end
return not h.boolFalse[tostring(x):lower()]
end
h.htmlEntities = {
table = {
container = 'table',
titleOuter = 'tr',
titleInner = 'th',
section = '',
sectionTitle = 'th',
sectionTabsOuter = 'tr',
sectionTabs = 'td',
row = 'tr',
label = 'th',
cell = 'td',
},
div = {
container = 'div',
titleOuter = 'div',
titleInner = 'div',
section = 'div',
sectionTitle = 'div',
sectionTabsOuter = 'div',
sectionTabs = 'div',
row = 'div',
label = 'div',
cell = 'div',
}
}
function h.getTag(key)
-- try not to totally fail here
return h.htmlEntities[h.entityType or 'div'][key]
end
return p
0b872baa88950499ed588906ea3b07f363640076
Module:Infobox/doc
828
11
19
2025-08-20T01:22:27Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{luadoc}}
This module enables the creation of [[support:DRUID infoboxes|DRUID infoboxes]].
0ce687b29fc5e2d6cad14853a8412fa91910000f
Module:Navbox
828
12
20
2025-08-20T01:22:27Z
ARTIFICER
564804
Importing default loadout
Scribunto
text/plain
-- version 1.2.5
-- config table for RANGER.
-- If you want to change the default config, DO NOT change it here,
-- please do it via the `onLoadConfig` hook in [[Module:Navbox/Hooks]].
local config = {
default_navbox_class = "navigation-not-searchable", -- Base value of the `class` parameter.
default_title_class = nil, -- Base value of the `title_class` parameter.
default_above_class = nil, -- Base value of the `above_class` parameter.
default_below_class = nil, -- Base value of the `below_class` parameter.
default_section_class =nil, -- Base value of the `section_class` parameter.
default_header_class = nil, -- Base value of the `header_class` parameter.
default_group_class = nil, -- Base value of the `group_class` parameter.
default_list_class = 'hlist', -- Base value of the `list_class` parameter.
default_header_state = nil, -- Base value of the `state` parameter.
editlink_hover_message_key = 'Navbox-edit-hover', -- The system message name for hover text of the edit icon.
auto_flatten_top_level = true, -- If true, when a section has only one list with no content and no corresponding group but has sublists, these sublists will be moved to top level.
-- This helps make the hierarchy of sections and content clearer.
-- An example:
-- {{navbox
-- ...
-- |header1 = Items
-- | group1.1 = Weapons
-- | list1.1 = Swords · Guns · Wands
-- | group1.2 = Armors
-- | list1.2 = Head pieces · Capes
-- |header2 = NPCs
-- | group2.1 = Town NPCs
-- | list2.1 = Guide · Witch
-- ...
-- }}
-- will be equal to:
-- {{navbox
-- ...
-- |header1 = Items
-- | group2 = Weapons
-- | list2 = Swords · Guns · Wands
-- | group3 = Armors
-- | list3 = Head pieces · Capes
-- |header5 = NPCs
-- | group6 = Town NPCs
-- | list6 = Guide · Witch
-- ...
-- }}
custom_render_handle = nil, -- usually for debugging purposes only. if set, it should be a function accept 2 parameters: `dataTree` and `args`, and return a string as module output.
}
---------------------------------------------------------------------
-- Argument alias.
local CANONICAL_NAMES = {
['titlestyle'] = 'title_style',
['listclass'] = 'list_class',
['groupstyle'] = 'group_style',
['collapsible'] = 'state',
['editlink'] = 'meta',
['editlinks'] = 'meta',
['editicon'] = 'meta',
['edit_link'] = 'meta',
['edit_links'] = 'meta',
['edit_icon'] = 'meta',
['navbar'] = 'meta',
['name'] = 'template',
['evenodd'] = 'striped',
['class'] = 'navbox_class',
['css'] = 'navbox_style',
['style'] = 'navbox_style',
['group'] = '1:group',
['list'] = '1:list',
}
local DEFAULT_ARGS = {
['meta'] = true,
}
local STATES = {
['no'] = '',
['off'] = '',
['plain'] = '',
['collapsed'] = 'mw-collapsible mw-collapsed',
['expanded'] = 'mw-collapsible',
}
local BOOL_FALSE = {
['no'] = true,
['off'] = true,
['false'] = true,
}
local STRIPED = {
['odd'] = 'striped-odd',
['swap'] = 'striped-odd',
['y'] = 'striped-even',
['yes'] = 'striped-even',
['on'] = 'striped-even',
['even'] = 'striped-even',
['striped'] = 'striped-even',
}
local NAVBOX_CHILD_INDICATOR = '!!C$H$I$L$D!!'
local NAVBOX_CHILD_INDICATOR_LENGTH = string.len( NAVBOX_CHILD_INDICATOR )
local CLASS_PREFIX = 'ranger-'
---------------------------------------------------------------------
local p = {}
local h = {} -- non-public
local hooks = mw.title.new('Module:Navbox/Hooks').exists and require('Module:Navbox/Hooks') or {}
---------------------------------------------------------------------
-- For templates: {{#invoke:navbox|main|...}}
function p.main(frame)
local args = p.mergeArgs(frame)
return p.build(args, true)
end
-- For modules: return require('module:navbox').build(args)
-- By default this method will skip the arguments sanitizing phase
-- (and onSanitizeArgsStart/onSanitizeArgsEnd hooks).
-- Set `doParseArgs` to true to do arguments sanitizing.
-- If `customConfig` table is provided, it will be merged into default config table (after onLoadConfig()).
-- If `customHooks` table is provided, all default hook handles will be overrided, unprovided hooks will be empty.
function p.build(args, doParseArgs, customConfig, customHooks)
if customHooks then
hooks = customHooks
end
if doParseArgs then
args = h.parseArgs(args)
end
h.runHook('onLoadConfig', config, args)
if customConfig then
for k,v in pairs(customConfig) do
config[k] = v
end
end
--merge default args
for k,v in pairs(DEFAULT_ARGS) do
if args[k] == nil then
args[k] = DEFAULT_ARGS[k]
end
end
h.runHook('onBuildTreeStart', args)
local dataTree = h.buildDataTree(args)
h.runHook('onBuildTreeEnd', dataTree, args)
if type(config.custom_render_handle) == 'function' then
return config.custom_render_handle(dataTree, args)
else
return h.render(dataTree)
end
end
-- merge args from frame and frame:getParent()
-- It may be used when creating custom wrapping navbox module.
--
-- For example, Module:PillNavbox
--
-- local RANGER = require('Module:Navbox')
-- local p = {}
-- function p.main(frame)
-- return RANGER.build(RANGER.mergeArgs(frame), true, {
-- default_navbox_class = 'pill', -- use "pill" style by default.
-- })
-- end
-- return p
--
function p.mergeArgs(frame)
local inputArgs = {}
for k, v in pairs(frame.args) do
v = mw.text.trim(tostring(v))
if v ~= '' then
inputArgs[k] = v
end
end
for k, v in pairs(frame:getParent().args) do
v = mw.text.trim(v)
if v ~= '' then
inputArgs[k] = v
end
end
return inputArgs
end
------------------------------------------------------------------------
-- equivalent to mw.text.split(str, div, true) for non-empty separator, but can be over 60x faster, since the latter is Unicode-aware.
-- Original version credit: http://richard.warburton.it.
function h.explode(div, str)
if (div=='') then return nil end
local pos,arr = 0,{}
-- for each divider found
for st,sp in function() return string.find(str,div,pos,true) end do
arr[#arr+1] = string.sub(str,pos,st-1) -- Attach chars left of current divider
pos = sp+1 -- Jump past current divider
end
arr[#arr+1] = string.sub(str,pos) -- Attach chars right of last divider
return arr
end
function h.parseArgs(inputArgs)
h.runHook('onSanitizeArgsStart', inputArgs)
local args = {}
for k, v in pairs(inputArgs) do
if type(k) == 'string' then
-- all named args have already been trimmed
local key = h.normalizeKey(k)
args[key] = h.normalizeValue(key, v)
else
args[k] = mw.text.trim(v) -- keep number-index arguments (for {{navbox|child|...}})
end
end
h.runHook('onSanitizeArgsEnd', args, inputArgs)
return args
end
-- Normalize the name string of arguments.
-- the normalized form is (index:)?name, in which:
-- index is number index such as 1, 1.3, 1.2.45,
-- name is in lowercase underscore-case, such as group, group_style
-- e.g: header_state, 1.3:list_style
-- the input argument name can be:
-- * camel-case: listStyle, ListStyle
-- * space separated: list style
-- * prefix+index+postfix?, and can be in camel-case or space/hyphen separated or mixed: list 1 style, list1, list1Style, list1_style
-- * index.name: 1.3.list
-- * index_name: 1.3_list (Space separated are treated as underscore separated, therefore 1.3 list are vaild too)
function h.normalizeKey(s)
-- camel-case to lowercase underscore-case
s = s:gsub('%l%f[%u]', '%0_') -- listStyle to list_style
s = (s:gsub(' ', '_')):lower() -- space to underscore
s = s:gsub('%l%f[%d]', '%0_') -- group1* to group_1*
s = s:gsub('%d%f[%l]', '%0_') -- *1style to *1_style
-- number format x_y_z to x.y.z
s = s:gsub('(%d)_%f[%d]', '%1%.')
-- move index to the beginning:
-- group_1.2_style to 1.2:group_style
-- group_1 to 1:group
s = s:gsub('^([%l_]+)_([%d%.]+)', '%2:%1')
-- support index.name and index_name:
-- 1.2.group / 1.2_group to 1.2:group
s = s:gsub('^([%d%.]+)[%._]%f[%l]', '%1:')
-- now the key should be in normalized form, if the origin key is vaild
-- standardize *_css to *_style
s = s:gsub('_css$', '_style')
-- standardize *collapsible to *state
s = s:gsub('collapsible$', 'state')
-- standardize all aliases to the canonical name
return CANONICAL_NAMES[s] or s
end
function h.normalizeValue(k, v)
k = tostring(k)
if k:find('_style$') then
v = (v .. ';'):gsub(';;', ';')
return v
elseif k:find('state$') then
return STATES[v]
elseif k == 'striped' then
return STRIPED[v]
elseif k == 'meta' then
return not BOOL_FALSE[v]
elseif v:sub(1, 2) == '{|' or v:match('^[*:;#]') then
-- Applying nowrap to lines in a table does not make sense.
-- Add newlines to compensate for trim of x in |parm=x in a template.
return '\n' .. v ..'\n'
end
return v
end
-- parse arguments, convert them to structured data tree
function h.buildDataTree(args)
-- parse args to a tree
local tree = h.buildTree(args)
-- build root navbox data
local data = h.buildNavboxData(tree.info)
-- Recursively build section tree
if tree.children then
data.sections = h.buildSections(tree.children, {
listClass = h.mergeAttrs(args.list_class, config.default_list_class),
listStyle = args.list_style,
groupClass = h.mergeAttrs(args.group_class, config.default_group_class),
groupStyle = args.group_style,
sectionClass = h.mergeAttrs(args.section_class, config.default_section_class),
sectionStyle = args.section_style,
headerClass = h.mergeAttrs(args.header_class, config.default_header_class),
headerStyle = args.header_style,
headerState = args.header_state or config.default_header_state,
})
end
if args[1] == 'child' then
data.CHILD_MODE = true
end
return data
end
function h.buildSections(list, defaults)
local sections = {}
local section = nil
for k, node in h.orderedPairs(list) do
local info = node.info or {}
--start a new section if needed
if info.header or not section then
section = {
class = h.mergeAttrs(info.section_class, defaults.sectionClass),
style = h.mergeAttrs(info.section_style, defaults.sectionStyle),
body = {}
}
-- Section header if needed.
-- If the value of a `|header_n=` is two or more consecutive "-" characters (e.g. --, -----),
-- it means start a new section without header, and the new section will be not collapsable.
if info.header and not string.match(info.header, '^%-%-+$') then
section.header = {
content = info.header,
class = h.mergeAttrs(info.header_class, defaults.headerClass),
style = h.mergeAttrs(info.header_style, defaults.headerStyle),
}
section.state = info.state or defaults.headerState or 'mw-collapsible'
end
sections[#sections+1] = section
end
-- above/below for this section
if info.above then
section.above = {
content = info.above,
class= h.mergeAttrs(info.above_class, config.default_above_class),
style = info.above_style,
}
end
if info.below then
section.below = {
content = info.below,
class= h.mergeAttrs(info.below_class, config.default_below_class),
style = info.below_style,
}
end
-- this group+list row
if info.group or info.list or node.children then
local row = {}
section.body[#section.body+1] = row
if info.group then
row.group = {
content = info.group,
class = h.mergeAttrs(info.group_class, defaults.groupClass),
style = h.mergeAttrs(info.group_style, defaults.groupStyle),
}
end
if info.list then
if string.sub(info.list, 1, NAVBOX_CHILD_INDICATOR_LENGTH) == NAVBOX_CHILD_INDICATOR then
-- it is from {{navbox|child| ... }}
row.sections = mw.text.jsonDecode(string.sub(info.list, NAVBOX_CHILD_INDICATOR_LENGTH+1))
else
row.list = {
content = info.list,
class = h.mergeAttrs(info.list_class, defaults.listClass),
style = h.mergeAttrs(info.list_style, defaults.listStyle),
}
end
end
-- sub-nodes, will override {{navbox|child| ... }}
if node.children then
row.sections = h.buildSections(node.children, defaults)
end
end
end
-- flatten if needed:
-- If a section has only one list with no content and no corresponding group but has sublists, these sublists will be moved to upper level.
if config.auto_flatten_top_level then
for _, sect in ipairs(sections) do
if #sect.body == 1 then
local node = sect.body[1]
if not node.group and not node.list and node.sections and #node.sections == 1 and not node.sections[1].header then
sect.body = node.sections[1].body
end
end
end
end
return sections
end
function h.buildNavboxData(info)
local data = {
state = info.state or 'mw-collapsible', -- here we need a default value for empty input
striped = info.striped,
class = h.mergeAttrs(info.navbox_class, config.default_navbox_class),
style = info.navbox_style,
}
-- data for titlebar
if info.title or info.meta or data.state ~= '' then
data.title = {
content = info.title,
class = h.mergeAttrs(info.title_class, config.default_title_class),
style = info.title_style,
}
if info.meta then
data.metaLinks = {
link = info.meta_link, -- will be used as [[$link|$text]]
url = info.meta_url, -- will be used as [$url $text], only if there is no data.metaLinks.link
text = info.meta_text, --hovertext
}
if not info.meta_link and not info.meta_url then
-- default link target
local title = mw.title.new(info.template or mw.getCurrentFrame():getParent():getTitle(), 'Template')
if not title then
error('Invalid title ' .. info.template)
end
data.metaLinks.link = title.fullText
end
if not info.meta_text then
local msg = mw.message.new(config.editlink_hover_message_key)
data.metaLinks.text = msg:exists() and msg:plain() or 'View or edit this template'
end
end
end
-- above/below
if info.above then
data.above = {
content = info.above,
class= h.mergeAttrs(info.above_class, config.default_above_class),
style = info.above_style,
}
end
if info.below then
data.below = {
content = info.below,
class= h.mergeAttrs(info.below_class, config.default_below_class),
style = info.below_style,
}
end
return data
end
-- parse arguments, convert them into a tree based on their index
-- each node on tree is { info = { #data for this node# }, children = {#children nodes#} }
function h.buildTree(args, defaults)
local tree = { info = {} }
local check = function(key, value)
local index, name = string.match(key, '^([%d%.]+):(.+)$')
-- no number index found, for root node
if not index then
tree.info[key] = value
return
end
-- filter invalid number index
if string.match(index, '^%.') or string.match(index, '%.$') or string.match(index, '%.%.') then
return
end
-- find the node that matches the index in the tree
local arr = h.explode('.', index)
local node = tree
for _, v in ipairs(arr) do
v = tonumber(v)
if not node.children then
node.children = {}
end
if not node.children[v] then
node.children[v] = { info = {} }
end
node = node.children[v]
end
node.info[name] = value
end
for k,v in pairs(args) do
check(k, v)
end
return tree
end
function h.render(data)
-- handle {{navbox|child|...}} syntax
if data.CHILD_MODE then
return NAVBOX_CHILD_INDICATOR..mw.text.jsonEncode(data.sections)
end
----- normal case -----
local out = mw.html.create()
-- build navbox container
local navbox = out:tag('div')
:attr('role', 'navigation'):attr('aria-label', 'Navbox')
:addClass(CLASS_PREFIX..'navbox')
:addClass(data.class)
:addClass(data.striped)
:addClass(data.state)
:cssText(data.style)
--title bar
if data.title then
local titlebar = navbox:tag('div'):addClass(CLASS_PREFIX..'title')
titlebar:tag('div'):addClass('mw-collapsible-toggle-placeholder')
if data.metaLinks then
titlebar:node(h.renderMetaLinks(data.metaLinks))
end
if data.title then
titlebar:addClass(data.title.class):tag('div')
:addClass(CLASS_PREFIX..'title-text')
:addClass(data.title.class)
:cssText(data.title.style)
:wikitext(data.title.content)
end
end
--above
if data.above then
navbox:tag('div')
:addClass(CLASS_PREFIX..'above mw-collapsible-content')
:addClass(data.above.class)
:cssText(data.above.style)
:wikitext(data.above.content)
:attr('id', (not data.title) and mw.uri.anchorEncode(data.above.content) or nil) -- id for aria-labelledby attribute, if no title
end
-- sections
if data.sections then
h.renderSections(data.sections, navbox, 0, true)
else
-- Insert a blank section for completely empty navbox to ensure it behaves correctly when collapsed.
if not data.above and not data.below then
navbox:tag('div'):addClass(CLASS_PREFIX..'section mw-collapsible-content')
end
end
--below
if data.below then
navbox:tag('div')
:addClass(CLASS_PREFIX..'below mw-collapsible-content')
:addClass(data.below.class)
:cssText(data.below.style)
:wikitext(data.below.content)
end
return tostring(out)..'[[Category:Pages with navboxes]]' -- suggest to use HIDDENCAT here; will be used for maintenance & gadget imports
end
function h.renderSections(data, container, level, even)
for i,sect in ipairs(data) do
--section box
local section = container:tag('div')
:addClass(CLASS_PREFIX..'section mw-collapsible-content')
:addClass(sect.class)
:addClass(sect.state)
:cssText(sect.style)
-- section header
if sect.header then
section:tag('div')
:addClass(CLASS_PREFIX..'header')
:addClass(sect.header.class)
:cssText(sect.header.style)
:tag('div'):addClass('mw-collapsible-toggle-placeholder'):done()
:tag('div'):addClass(CLASS_PREFIX..'header-text'):wikitext(sect.header.content)
end
-- above:
if sect.above then
section:tag('div')
:addClass(CLASS_PREFIX..'above mw-collapsible-content')
:addClass(sect.above.class)
:cssText(sect.above.style)
:wikitext(sect.above.content)
end
-- body: groups&lists
local box = section:tag('div'):addClass(CLASS_PREFIX..'section-body mw-collapsible-content')
even = h.renderBody(sect.body, box, level, (level==0) and true or even) -- reset even status each section
-- below:
if sect.below then
section:tag('div')
:addClass(CLASS_PREFIX..'below mw-collapsible-content')
:addClass(sect.below.class)
:cssText(sect.below.style)
:wikitext(sect.below.content)
end
end
return even
end
function h.renderMetaLinks(info)
local box = mw.html.create('span'):addClass(CLASS_PREFIX..'meta')
local meta = box:tag('span'):addClass('nv nv-view')
if info.link then
meta:wikitext('[['..info.link..'|')
:tag('span'):wikitext(info.text):attr('title', info.text):done()
:wikitext(']]')
elseif info.url then
meta:wikitext('['..info.url..' ')
:tag('span'):wikitext(info.text):attr('title', info.text):done()
:wikitext(']')
end
return box
end
function h.renderBody(info, box, level, even)
local count = 0
for _,v in h.orderedPairs(info) do
if v.group or v.list or v.sections then
count = count + 1
-- row container
local row = box:tag('div'):addClass(CLASS_PREFIX..'row')
-- group cell
if v.group or (v.sections and level > 0 and not v.list) then
local groupCell = row:tag('div')
:addClass(CLASS_PREFIX..'group level-'..level)
:addClass((level > 0) and CLASS_PREFIX..'subgroup' or nil)
local groupContentWrap = groupCell:tag('div'):addClass(CLASS_PREFIX..'wrap')
if v.group then
groupCell:addClass(v.group.class):cssText(v.group.style)
groupContentWrap:wikitext(v.group.content)
else
groupCell:addClass('empty')
row:addClass('empty-group-list')
end
else
row:addClass('empty-group')
end
-- list cell
local listCell = row:tag('div'):addClass(CLASS_PREFIX..'listbox')
if not v.list and not v.sections then
listCell:addClass('empty')
row:addClass('empty-list')
end
if v.list or (v.group and not v.sections) then
--listCell:node(h.renderList(v['list'] or '', k, level, args))
even = not even -- flip even/odd status
local cell = listCell:tag('div')
:addClass(CLASS_PREFIX..'wrap')
:addClass(even and CLASS_PREFIX..'even' or CLASS_PREFIX..'odd')
if v.list then
cell:addClass(v.list.class):cssText(v.list.style)
:tag('div'):addClass(CLASS_PREFIX..'list'):wikitext(v.list.content)
end
end
if v.sections then
local sublistBox = listCell:tag('div'):addClass(CLASS_PREFIX..'sublist level-'..level)
even = h.renderSections(v.sections, sublistBox, level+1, even)
end
end
end
if count > 0 then
box:css('--count', count) -- for flex-grow
end
return even
end
-- pairs, but sort the keys alphabetically
function h.orderedPairs(t, f)
local a = {}
for n in pairs(t) do table.insert(a, n) end
table.sort(a, f)
local i = 0 -- iterator variable
local iter = function () -- iterator function
i = i + 1
if a[i] == nil then return nil
else return a[i], t[a[i]]
end
end
return iter
end
-- For cascading parameters, such as style or class, they are merged in exact order (from general to specific).
-- Any parameter starting with multiple hyphens(minus signs) will terminate the cascade.
-- An example:
-- For group_1.1, its style is affected by parameters |group_1.1_style=... , |subgroup_level_1_style=... , and |subgroup_style=... .
-- If we have |group_1.1_style= color:red; |subgroup_level_1_style= font-weight: bold; and |subgroup_style= color: green; ,
-- the style of group_1.1 will be style="color:green; font-weight: bold; color: red;" ;
-- if we have |group_1.1_style= -- color:red; |subgroup_level_1_style= font-weight: bold; and |subgroup_style= color: green; ,
-- the style of group_1.1 will be style="color: red;" only, and the cascade is no longer performed for |subgroup_level_1_style and |subgroup_style.
function h.mergeAttrs(...)
local trim = mw.text.trim
local s = ''
for i=1, select('#', ...) do
local v = trim(select(i, ...) or '')
local str = string.match(v, '^%-%-+(.*)$')
if str then
s = trim(str..' '..s)
break
else
s = trim(v..' '..s)
end
end
if s == '' then s = nil end
return s
end
function h.runHook(key, ...)
if hooks[key] then
hooks[key](...)
end
end
-----------------------------------------------
return p
9dddb0f4a65fa1907b3503052e13630ad4bc8bb2
Module:ArgsUtil
828
13
21
2025-08-20T01:22:28Z
ARTIFICER
564804
Importing default loadout
Scribunto
text/plain
local p = {}
function p.merge()
local f = mw.getCurrentFrame()
local origArgs = f.args
local parentArgs = f:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = mw.text.trim(tostring(v))
if v ~= '' then
args[k] = v
end
end
for k, v in pairs(parentArgs) do
v = mw.text.trim(v)
if v ~= '' then
args[k] = v
end
end
return args
end
return p
1d1b2105bd857dcc5e33c8c0a8a780f67cbae72e
Module:ArgsUtil/doc
828
14
22
2025-08-20T01:22:28Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This is a basic module for processing args. Usage:
<syntaxhighlight lang="lua">
local util_args = require('Module:ArgsUtil')
local p = {}
function p.main(frame)
local args = util_args.merge() -- it is not necessary to pass a `frame` object; `merge` will generate its own
mw.logObject(args)
-- `args` now contains args passed via the template merged with defaults provided directly via the invoke.
-- anything the user sent via the template will be given priority.
end
return p
</syntaxhighlight>
== Extending this module ==
By design, {{ml|ArgsUtil}} is shipped with only a single function and no customization available; this simplifies documentation and covers nearly all use cases. An extended version of this module is available at [[support:Module:ArgsUtil|Module:ArgsUtil on the support wiki]] if you want additional functionality; and you can of course feel free to modify this module on your own wiki as needed.
6fc2a23dcff62ac5a222903e46bc56c07b0a2b1f
Module:Template link
828
15
23
2025-08-20T01:22:29Z
ARTIFICER
564804
Importing default loadout
Scribunto
text/plain
-- This code is adapted from Wikipedia
-- For the original, please see: https://en.wikipedia.org/wiki/Module:Template_link_general
-- This implements Template:Tlg
local getArgs = require('Module:ArgsUtil').merge
local p = {}
-- Is a string non-empty?
local function _ne(s)
return s ~= nil and s ~= ""
end
local nw = mw.text.nowiki
local function addTemplate(s)
local i, _ = s:find(':', 1, true)
if i == nil then
return 'Template:' .. s
end
local ns = s:sub(1, i - 1)
if ns == '' or mw.site.namespaces[ns] then
return s
else
return 'Template:' .. s
end
end
local function trimTemplate(s)
local needle = 'template:'
if s:sub(1, needle:len()):lower() == needle then
return s:sub(needle:len() + 1)
else
return s
end
end
local function linkTitle(args)
if _ne(args.nolink) then
return args[1]
end
local titleObj
local titlePart = '[['
if args[1] then
-- This handles :Page and other NS
titleObj = mw.title.new(args[1], 'Template')
else
titleObj = mw.title.getCurrentTitle()
end
titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or
addTemplate(args[1]))
local textPart = args.alttext
if not _ne(textPart) then
if titleObj ~= nil then
textPart = titleObj:inNamespace("Template") and args[1] or titleObj.fullText
else
-- redlink
textPart = args[1]
end
end
if _ne(args.subst) then
-- HACK: the ns thing above is probably broken
textPart = 'subst:' .. textPart
end
if _ne(args.brace) then
textPart = nw('{{') .. textPart .. nw('}}')
elseif _ne(args.braceinside) then
textPart = nw('{') .. textPart .. nw('}')
end
titlePart = titlePart .. '|' .. textPart .. ']]'
if _ne(args.braceinside) then
titlePart = nw('{') .. titlePart .. nw('}')
end
return titlePart
end
function p.main(frame)
local args = getArgs()
return p._main(args)
end
function p._main(args)
local bold = _ne(args.bold) or _ne(args.boldlink) or _ne(args.boldname)
local italic = _ne(args.italic) or _ne(args.italics)
local dontBrace = _ne(args.brace) or _ne(args.braceinside)
local code = _ne(args.code) or _ne(args.tt)
local show_result = _ne(args._show_result)
local expand = _ne(args._expand)
-- Build the link part
local titlePart = linkTitle(args)
if bold then titlePart = "'''" .. titlePart .. "'''" end
if _ne(args.nowrapname) then titlePart = '<span class="nowrap">' .. titlePart .. '</span>' end
-- Build the arguments
local textPart = ""
local textPartBuffer = "|"
local codeArguments = {}
local codeArgumentsString = ""
local i = 2
local j = 1
while args[i] do
local val = args[i]
if val ~= "" then
if _ne(args.nowiki) then
-- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will
-- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up
val = nw(mw.text.unstripNoWiki(val))
end
local k, v = string.match(val, "(.*)=(.*)")
if not k then
codeArguments[j] = val
j = j + 1
else
codeArguments[k] = v
end
codeArgumentsString = codeArgumentsString .. textPartBuffer .. val
if italic then
val = '<span style="font-style:italic;">' .. val .. '</span>'
end
textPart = textPart .. textPartBuffer .. val
end
i = i + 1
end
-- final wrap
local ret = titlePart .. textPart
if not dontBrace then ret = nw('{{') .. ret .. nw('}}') end
if _ne(args.a) then ret = nw('*') .. ' ' .. ret end
if _ne(args.kbd) then ret = '<kbd>' .. ret .. '</kbd>' end
if code then
ret = '<code>' .. ret .. '</code>'
elseif _ne(args.plaincode) then
ret = '<code style="border:none;background:transparent;">' .. ret .. '</code>'
end
if _ne(args.nowrap) then ret = '<span class="nowrap">' .. ret .. '</span>' end
--[[ Wrap as html??
local span = mw.html.create('span')
span:wikitext(ret)
--]]
if _ne(args.debug) then ret = ret .. '\n<pre>' .. mw.text.encode(mw.dumpObject(args)) .. '</pre>' end
if show_result then
local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}
ret = ret .. " → " .. result
end
if expand then
local query = mw.text.encode('{{' .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, "|") .. '}}')
local url = mw.uri.fullUrl('special:ExpandTemplates', 'wpInput=' .. query)
mw.log()
ret = ret .. " [" .. tostring(url) .. "]"
end
return ret
end
return p
45d40a4bff9a1d0eb4274f56fb2f17849aa68728
Module:Template link/doc
828
16
24
2025-08-20T01:22:30Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{From Wikipedia|Module:Template link general}}
1a395265ccbd055518c1d14b52362cc148b89c81
Module:Main page
828
17
25
2025-08-20T01:22:31Z
ARTIFICER
564804
Importing default loadout
Scribunto
text/plain
local p = {}
local h = {}
-- merge args from frame and frame:getParent()
function h.mergeArgs(frame)
local inputArgs = {}
for k, v in pairs(frame.args) do
v = mw.text.trim(tostring(v))
if v ~= '' then
inputArgs[k] = v
end
end
for k, v in pairs(frame:getParent().args) do
v = mw.text.trim(v)
if v ~= '' then
inputArgs[k] = v
end
end
return inputArgs
end
--------------------------------------------------------------------
function p.main(frame)
local args = h.mergeArgs(frame)
-- use the rootpage parameter if given, otherwise use the current page name
local rootpage = args['rootpage'] or mw.title.getCurrentTitle().fullText
local layouts = {'desktop', 'tablet', 'mobile'}
for _,layout in pairs(layouts) do
-- collapse consecutive line breaks and spaces, then trim
-- we need to check for permutations of " \n" because trim can't clean that up if it's in the middle of the string
args[layout] = mw.text.trim(args[layout]):gsub("\n\n+", "\n"):gsub(" +", " "):gsub(" \n", "\n"):gsub("\n ", "\n")
end
-- parse the arguments into CSS variables that contain legal syntax for grid-template-areas
local desktop = "--main-page-layout--desktop: '" .. string.gsub(args['desktop'], '\n', "' '") .. "';"
local tablet = "--main-page-layout--tablet: '" .. string.gsub(args['tablet' ], '\n', "' '") .. "';"
local mobile = "--main-page-layout--mobile: '" .. string.gsub(args['mobile' ], '\n', "' '") .. "';"
-- grid-template-columns overrides
local desktop_cols = mw.text.trim(string.gsub(args['desktop-columns'] or '', ';', ''))
local tablet_cols = mw.text.trim(string.gsub(args[ 'tablet-columns'] or '', ';', ''))
local mobile_cols = mw.text.trim(string.gsub(args[ 'mobile-columns'] or '', ';', ''))
-- set the variables used by grid-template-columns
if desktop_cols ~= '' then
desktop = desktop .. '--main-page-layout-columns--desktop: '.. desktop_cols ..';'
end
if tablet_cols ~= '' then
tablet = tablet .. '--main-page-layout-columns--tablet: '.. tablet_cols ..';'
end
if mobile_cols ~= '' then
mobile = mobile .. '--main-page-layout-columns--mobile: '.. mobile_cols ..';'
end
local boxes = {} -- list of all boxes as a simple list, used to set the order of appearance
local seen_boxes = {} -- list of all boxes as a k:v pair, used to filter out duplicates
local boxes_in_layout = {} -- list of layouts, then list of all boxes in that layout
local missing_boxes = {} -- list of layouts, then list of boxes that are *not* included in that layout
-- add every box referenced in the layout rules once
function parse_layout(layout)
for _,name in pairs(mw.text.split(mw.text.trim(args[layout]), '%s')) do
if not seen_boxes[name] then
boxes[#boxes+1] = name -- table with numerical keys for set html order
seen_boxes[name] = true
end
boxes_in_layout[layout][name] = true
end
end
-- loop through the layouts the first time to set up the box lists
for _,layout in pairs(layouts) do
boxes_in_layout[layout] = {}
missing_boxes[layout] = {}
parse_layout(layout)
end
-- then loop through the layouts a second time because we need to compare those completed lists to check for missing boxes
for _,layout in pairs(layouts) do
for _,name in pairs(boxes) do
if boxes_in_layout[layout][name] ~= true then
mw.addWarning( 'WARNING: the \"' .. name .. '\" box is missing in the ' .. layout .. ' layout. If this is intentional, you can ignore this warning.')
missing_boxes[layout][name] = true
end
end
end
-- start our mp-container wrapper, and add our variables from earlier as inline styles to declare them
-- the rootpage is added to the dataset so it's easily accessible by mp-edit-links.js and it doesn't need to make its own API call
local output = mw.html.create()
local container = output:tag('div'):attr('id', 'mp-container'):cssText(desktop .. tablet .. mobile):attr('data-rootpage', rootpage)
-- loop through boxes and add the relevant main page subpages into the output
for _,box in pairs(boxes) do
mw.ext.VariablesLua.vardefine('imp-variable-id', box) -- using a vardefine lets us pass this directly to the template without going through the user-facing box
local pre_vardefine = ''
for _,layout in pairs(layouts) do
pre_vardefine = pre_vardefine .. (missing_boxes[layout][box] and '0' or '1') .. ','
end
-- formatted as a psuedo-bitmask to reduce variable usage, "<display-on-destop>, <display-on-tablet>, <display-on-mobile>," each value is 0 or 1 (trailing comma is insignificant)
-- expected to be used with #explode in the template receiving the variable
mw.ext.VariablesLua.vardefine('imp-variable-display-box', pre_vardefine)
if mw.title.new(rootpage .. '/' .. box).exists then
container:wikitext(frame:expandTemplate{ title = ':' .. rootpage .. '/' .. box})
else
container:wikitext(frame:expandTemplate{ title = 'Main page box/missing', args = { box, rootpage = rootpage}}) -- See [[Template:Main page box/missing]]
end
end
return output
end
return p
c6237f93b472a243ae7393913c285b3ae62c08f5
Module:Navbox/Hooks
828
18
26
2025-08-20T01:22:32Z
ARTIFICER
564804
Importing default loadout
Scribunto
text/plain
-- as of Module:Navbox version 1.2.5
local p = {}
---------------------------------------------------
-- Runs before RANGER does args sanitizing
-- `inputArgs` is the merged input arguments from the template (frame.args + frame:getParent().args)
function p.onSanitizeArgsStart(inputArgs)
end
-- Runs after RANGER does args sanitizing
-- `args` parameter is the sanitized arguments table with normalized keys (in lowercase underscore-case with canonical names) and normalized values.
function p.onSanitizeArgsEnd(args, inputArgs)
end
-- Runs when RANGER loads config table (after onSanitizeArgsEnd and before onBuildTreeStart)
-- `config` parameter is the default config table.
-- `args` parameter is the sanitized arguments table (has not yet merged the DEFAUT_ARGS table).
function p.onLoadConfig(config, args)
end
-- Runs before RANGER converts sanitized arguments table to structured data tree
-- `args` parameter is the sanitized arguments table that has the DEFAUT_ARGS merged.
function p.onBuildTreeStart(args)
end
-- Runs after RANGER converts sanitized arguments table to structured data tree
-- `tree` parameter is the structured data.
-- `args` parameter is the sanitized arguments table.
function p.onBuildTreeEnd(tree, args)
end
---------------------------------------------------
return p
a124a9f396b4a5a6c91de416c6cb8af5342f41fb
Module:Navbox/doc
828
19
27
2025-08-20T01:22:32Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This module is used by [[Template:Navbox]].
87d5c562165cd75b963e03aa428c80413bacff30
Template:Documentation
10
20
28
2025-08-20T01:22:33Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
--><div class="documentation"><!--
--><div class="documentation-header"><!--
-->[[File:Template-{{#ifexist:{{#vardefineecho:docpage|{{{1|Template:{{#replace:{{{1|{{PAGENAME}}/doc}}}|Template:|}}}}}<!-- end vde -->}}|{{#if:{{{baddoc|}}}|bad}}|no}}info.svg|50px|link=]] <!--
--><span style="font-weight: bold; font-size: 125%; margin-right: 10px;">Documentation</span> <!--
-->{{#ifeq:{{SUBPAGENAME}}|doc|<!--nothing-->|<!--
-->{{#ifexist:{{#var:docpage}}|<!--
--><span style="font-size: 90%; font-style: italic;"><!--
-->[{{fullurl:{{#var:docpage}}|action=edit}} Edit] this documentation at [{{fullurl:{{#var:docpage}}|redirect=no}} {{FULLPAGENAMEE:{{#var:docpage}}}}].<!--
--></span><!--
-->}}<!--
-->}}<!--
--><div style="text-align: right; margin-left: 5px;"><!--
-->([{{fullurl:{{FULLPAGENAMEE}}/doc|action=edit}} edit] • [{{fullurl:{{FULLPAGENAMEE}}/doc|action=history}} history] • [{{fullurl:{{FULLPAGENAMEE}}|action=purge}} purge])<!--
--></div><!--
--></div><!--
<!-- leave line break here -->
{{#if:{{{lua|}}}|{{UsesLua|{{{lua}}} }} }}
<!-- documentation text/error box begins here -->
<div style="border-radius: 5px; border: 2px solid var(--wiki-content-border-color); margin: 0.5em auto 1em; padding: 0.8em 1.2em; background: var(--wiki-content-background-color--secondary);">
<!--
-->{{#ifexist:{{#var:docpage}}|<!--
If there is documentation
-->
{{ {{#var:docpage}} }}
<!--
Else
-->|<!--
-->No documentation subpage exists yet for this template. [{{fullurl:{{FULLPAGENAMEE:Template:{{{1|{{PAGENAME}}}}}}}/doc|action=edit&preload=Template:Documentation/preload}} Create one now].<!--
-->[[Category:Templates with no documentation]]<!--
-->}}<!-- leave line break here -->
<!-- documentation text/error box ends here -->
</div>
<!-- -->{{#ifeq:{{SUBPAGENAME}}|doc|<!--
-->{{#ifeq:{{BASEPAGENAME}}|Doc|<!--nothing-->|<!-- only if page is not Template:Documentation
-->This is the documentation page, it should be transcluded into the main template page. See {{tlx|doc}} for more information. <!--
-->[[Category:Template documentation]]<!--
-->}}<!--
-->}}<!--
--></div><!--
--></includeonly><!--
--><noinclude>{{Documentation}}
[[Category:Documentation templates| ]]
</noinclude>
c4c3117e700d89854599fb352f60792ed2165be0
Template:Luadoc
10
21
29
2025-08-20T01:22:33Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<noinclude>[[Category:Documentation templates]]</noinclude>{{#ifeq:{{int:scribunto-doc-page-name|{{ROOTPAGENAME}}}}|{{FULLPAGENAME}}||<div class="luadoc">Edit the [[{{int:scribunto-doc-page-name|{{ROOTPAGENAME}}}}|documentation or categories]] for this module. {{#ifexist:{{FULLPAGENAME}}/i18n|This module has an [[/i18n|i18n file]].}}</div>}}
37de49949dfa0f16975ff4e9850b4573ec388cb6
Template:MP link
10
22
30
2025-08-20T01:22:34Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
Variables
-->{{#vardefine:link|{{{link|{{{1|}}}}}}}}<!--
Image-->{{#if:{{{image|}}}|[[File:{{#replace:{{{image|}}}|File:}}|{{{size|42px}}}|link={{#var:link}}{{#if:{{{altText|}}}|{{!}}alt={{{altText|}}}}}|class={{{imageClass|}}}]]}}<!--
Link below the image
-->{{#if:{{{1|}}}|<!--
If it's an external link, use external link syntax -->{{#if:{{#pos:{{{link|}}}|http}}|[{{{link|}}} {{{1|}}}]|<!--
Otherwise use normal syntax
the ifeq, pos, sub combo is filtering out a leading :, so that we can add our own without doubling up, allowing easy category linking
-->[[:{{#ifeq:{{#pos:{{#var:link}}|:}}|0|{{#sub:{{#var:link}}|1}}|{{#var:link}}}}|{{{1|}}}]]}}
}}</includeonly><noinclude>
{{doc}}
[[Category:Main page templates]]
</noinclude>
be5325327a3e6c626069e9f98a5dd2b9f283042c
Template:MP link/doc
10
23
31
2025-08-20T01:22:35Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This creates one of the stylized and formatted links on the [[{{MediaWiki:Mainpage}}|main page]].
== Usage ==
Groups of this template should be wrapped inside of <code><nowiki><div class="mp-links"></div></nowiki></code> and each entry should be a separate line in an [[wikipedia:Help:Lists#Basically|unordered list]]. This div can be given one of the classes <code>columns-x</code> where x is a number from 1 to 8, and the links will line up in that many columns if space permits (default is 3). The div can also optionally be given the class <code>stretch</code> and it will stretch the list vertically to fill empty space. See [[Mediawiki:Common.css]] for the full definitions of these classes and styling for this template.
===Parameters===
<templatedata>
{
"description": {
"en": "Creates stylized and formatted links on the main page."
},
"format": "inline",
"params": {
"1": {
"label": {
"en": "Text"
},
"description": {
"en": "The text to display. If the link parameter is not given, this will also be the link target."
},
"example": "Stuff",
"type": "string",
"suggested": true
},
"link": {
"label": {
"en": "Link"
},
"description": {
"en": "The target page for the link, if different than the display text."
},
"required": false,
"example": "Main Page",
"type": "wiki-page-name"
},
"image": {
"label": {
"en": "Image"
},
"description": {
"en": "An image to display with the link."
},
"required": false,
"suggested": true,
"type": "wiki-file-name"
},
"size": {
"label": {
"en": "Image size"
},
"description": {
"en": "The size of the image, in px."
},
"required": false,
"default": "42px",
"type": "string"
},
"imageClass": {
"label": "Image class",
"description": "A class to give directly to the image",
"example": "invert-on-dark",
"type": "string",
"suggestedvalues": [
"invert-on-dark",
"invert-on-light"
]
},
"altText": {
"label": "Alt text",
"description": "Alt text to describe the image",
"example": "Wiki logo",
"type": "string",
"suggested": true
}
},
"paramOrder": [
"1",
"link",
"image",
"size",
"imageClass",
"altText"
]
}
</templatedata>
==Examples==
<pre>
<div class="mp-links columns-3">
* {{MP link|Stuff|link=Special:Random|image=Site-logo.png|size=42px}}
* {{MP link|Things|link=Special:Random}}
* {{MP link|Other stuff|link=Special:Random|image=Site-logo.png|size=42px}}
</div>
</pre>
Produces:
<div class="mp-links columns-3">
* {{MP link|Stuff|link=Special:Random|image=Site-logo.png|size=42px}}
* {{MP link|Things|link=Special:Random}}
* {{MP link|Other stuff|link=Special:Random|image=Site-logo.png|size=42px}}
</div>
<noinclude>
[[Category:Template documentation]]
</noinclude>
0df5d36904353428acb21882bd8923560f77a142
Template:Doc
10
24
32
2025-08-20T01:22:36Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:Documentation]]
041222999c2c4765a4663432058f50686fb65f40
Template:Uses Lua
10
25
33
2025-08-20T01:22:36Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = darkblue
| icon = Lua logo.svg
| title= This template uses one or more modules written in the Lua programming language.
| message = For more information, see [[wikipedia:Wikipedia:Lua|Wikipedia:Lua]] or the [[mw:Extension:Scribunto/Lua reference manual|Lua reference manual on mediawiki.org]]. Modules used include: {{#if:{{{1|}}}|{{#arraymap:{{{1|}}}|,|%s|'''[[Module:%s|%s]]'''}}|''None provided''}}.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
}}</includeonly><noinclude>{{doc|Template:Ambox/doc}}</noinclude>
1930c9b36136a5562cfaf7584f811d62b114a58a
Template:Ambox
10
26
34
2025-08-20T01:22:37Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
--><div class="ambox {{{class|}}} {{#ifeq:{{lc:{{{tiny|}}}}}|yes|tiny}} noexcerpt"<!--
--> style="{{#if:{{{color|}}}|--ambox-color: {{{color|}}};<!-- /if -->}}"><!--
--><div class="ambox-icon metadata <!-- the metadata class stops it from showing in MediaViewer -->">[[File:{{{icon|Ambox banner content.svg}}}{{!}}{{#ifeq:{{lc:{{{tiny|}}}}}|yes|48x20px|48x48px}}|alt=|link=]]</div><!--
--><div class="ambox-content"><!-- start ambox content
-->{{#if: {{{title|}}} | <p class="ambox-title">{{{title}}}</p> }}<!--
--><p class="ambox-text">{{{message|No text provided.}}}{{#if: {{{date|}}} |<nowiki> </nowiki>(Message added: {{{date}}}) }}</p><!--
--></div><!-- end ambox content
--></div><!-- end ambox
--></includeonly><noinclude>
{{doc}}
[[Category:Notice templates]]</noinclude>
11c1d0a1c9c2fcd4b89b27313303decfae03dea7
Template:((
10
27
35
2025-08-20T01:22:37Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{<noinclude>{{documentation}}</noinclude>
a506ba66cf7c806baae7faecb221b3a946721f6a
Template:Tlx
10
28
36
2025-08-20T01:22:38Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:Tl]]
af3906f239c45d791753d3170c656eddd6d1af5f
Template:Tl
10
29
37
2025-08-20T01:22:38Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{#invoke:Template link|main|code=on}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
1c13b1daaf7b7e8ce1e45cc03b4baf31c09bc6cd
Template:Tl/doc
10
30
38
2025-08-20T01:22:39Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{From Wikipedia|Module:Template link general,Template:Tlx}}
{{Uses Lua|Template link}}
This template returns an exemplaric use of a template while linking to the template description page, if the template exists.
== Usage ==
<pre>
{{tl|<Template name>}}
{{tl|<Template name>|<Template parameters>}}
</pre>
; ''unnamed parameter'' 1
: Template name (without <code>Template:</code> prefix)
; ''unnamed parameter'' 2 - 9
: Optional. Template parameters
; nl
: Optional flag to display an un-linked template usage.
== Examples ==
: <code><nowiki>{{tl|stub}}</nowiki></code> returns {{tl|stub}}
: <code><nowiki>{{tl|stub|1}}</nowiki></code> returns {{tl|stub|1}}
: <code><nowiki>{{tl|stub|1|2|nl{{=}}y}}</nowiki></code> returns {{tl|stub|1|2|nl{{=}}y}}
: <code><nowiki>{{tl|for|page|t1{{=}}alt text}}</nowiki></code> returns {{tl|for|page|t1{{=}}alt text}}
== See also ==
<includeonly>
[[Category:Formatting templates]]
</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
7cb4f0fa749ef8a18a48c4b5816357a225f4acee
Template:Nowrap
10
31
39
2025-08-20T01:22:39Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<span class="nowrap">{{{1}}}</span><noinclude>
{{documentation}}
</noinclude>
8817bafce418a08a72f3425283fc03d04a2d8d44
Template:))
10
32
40
2025-08-20T01:22:40Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
}}<noinclude>
{{documentation}}
</noinclude>
85ca77d4d6ff71d8e6396ebd798f87fa7f45dc02
Template:))/doc
10
33
41
2025-08-20T01:22:41Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:No wrap
10
34
42
2025-08-20T01:22:41Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:Nowrap]]
269180d5083536bbbf72d889477805cfde7aac9e
Template:Normal
10
35
43
2025-08-20T01:22:42Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<span style{{=}}"font-weight:normal; font-style:normal">{{{1}}}</span><noinclude>
{{documentation}}
</noinclude>
f1d74e033cde1ce3b2efdc98b78fb863b8524fcf
Template:((/doc
10
36
44
2025-08-20T01:22:42Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{| class="wikitable" style="text-align:center"
|-
! scope="col" style="width:7.0em;" | {{no wrap|Template call}}<br>{{normal|('''m''' for magic word)}}
! scope="col" style="width:5.75em;" | {{no wrap|Output}} {{normal|(delayed interpretation as wikimarkup)}}
! scope="col" style="width:9.0em;" | {{no wrap|HTML alternative}} {{normal|(never interpreted as wikimarkup)}}
! Why you might want to use this
|- style="vertical-align:top"
| <code><nowiki>{{!}}</nowiki></code> '''(m)'''
| <nowiki>|</nowiki>
| &#124; or {{tl|pipe}}
| Displaying pipe characters inside of a parser function
|- style="vertical-align:top"
| <code><nowiki>{{=}}</nowiki></code> '''(m)'''
| <nowiki>=</nowiki>
| &#61;
| Displaying equal signs inside of unnamed parameters (e.g. <code><nowiki>{{MyTemplate|1+1=2}}</nowiki></code> will assign <code>2</code> to <code><nowiki>{{{1+1|}}}</nowiki></code>; <code><nowiki>{{MyTemplate|1+1{{=}}2}}</nowiki></code> will do what you want)
|- style="vertical-align:top"
| {{tlx|!!}}
| <nowiki>||</nowiki>
| &#124;&#124;
| Displaying a break between two table cells inside of a parser function
|- style="vertical-align:top"
| {{tlx|!(}}
| {{!(}}
| &#91;
| Displaying a bracket inside of an external link
|- style="vertical-align:top"
| {{tlx|)!}}
| {{)!}}
| &#93;
| Displaying a bracket inside of an external link
|- style="vertical-align:top"
| {{tlx|!((}}
| {{!((}}
| &#91;&#91;
| Displaying a bracket inside of a link
|- style="vertical-align:top"
| {{tlx|))!}}
| {{))!}}
| &#93;&#93;
| Displaying a bracket inside of a link
|- style="vertical-align:top"
| {{tlx|(}}
| {{(}}
| &#123;
| Escaping a single brace immediately next to a template or parser function to avoid turning it into a parameter
|- style="vertical-align:top"
| {{tlx|)}}
| {{)}}
| &#125;
| Escaping a single brace immediately next to a template or parser function to avoid turning it into a parameter
|- style="vertical-align:top"
| {{tlx|((}}
| {{((}}
| &#123;&#123;
| Displaying open braces for a template without actually transcluding that template
|- style="vertical-align:top"
| {{tlx|))}}
| {{))}}
| &#125;&#125;
| Displaying closed braces for a template without actually transcluding that template
|- style="vertical-align:top"
| {{tlx|(((}}
| {{(((}}
| &#123;&#123;&#123;
| Displaying a template parameter's open curly braces without actually using that variable
|- style="vertical-align:top"
| {{tlx|)))}}
| {{)))}}
| &#125;&#125;&#125;
| Displaying a template parameter's closed curly braces without actually using that variable
|- style="vertical-align:top"
| {{tlx|(!}}
| <nowiki>{|</nowiki>
| &#123;&#124;
| Starting a table inside of a parser function
|- style="vertical-align:top"
| {{tlx|!-}}
| <nowiki>|-</nowiki>
| &#124;&#45;
| Starting a new table row inside of a parser function
|- style="vertical-align:top"
| {{tlx|!)}}
| <nowiki>|}</nowiki>
| &#124;&#125;
| Closing a table inside of a parser function
|}<includeonly>
[[Category:Formatting templates]]
</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
9e1eb11bc0644d97b4cc9bc4445c3f0bacdd339d
Template:!(
10
37
45
2025-08-20T01:22:43Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[<noinclude>
{{documentation}}</noinclude>
1b058774deae9a7e511a0486a04647d6a3b9af62
Template:!(/doc
10
38
46
2025-08-20T01:22:44Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:)!
10
39
47
2025-08-20T01:22:44Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
]<noinclude>
{{documentation}}</noinclude>
016897dfd1af3b146bed2b47e7aa58c0bbf6f23d
Template:)!/doc
10
40
48
2025-08-20T01:22:45Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:!((
10
41
49
2025-08-20T01:22:46Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[<noinclude>
{{documentation}}</noinclude>
a331374acf15177afbb3ffc0ec7bd5ada14c582e
Template:!((/doc
10
42
50
2025-08-20T01:22:46Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:))!
10
43
51
2025-08-20T01:22:47Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
]]<noinclude>
{{documentation}}</noinclude>
3d84066ce45d0c1fca0bb04608a4e73c6ea54324
Template:))!/doc
10
44
52
2025-08-20T01:22:47Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:Navbox
10
45
53
2025-08-20T01:22:48Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{#invoke:Navbox|main}}</includeonly><noinclude>[[Category:Navigation templates]] {{documentation}}</noinclude>
11355a4514de8aa6c0ae686240591d267101c58c
Template:Navbox/doc
10
46
54
2025-08-20T01:22:48Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{no direct use}}
{{UsesLua|Navbox}}
This template is designed to set up navigational templates relatively quickly with one or more lists of links. We highly recommend using this template for standardizing navigational templates and ease of use, especially for mobile devices.
See [[support:RANGER navboxes|the support wiki]] for more information, including installation steps and further examples.
== Basic example ==
The following example demonstrates the core functionality of this template: the title text, one standard link group, and one link group that contains two sub-groups. The rows are striped for easier readability.
{{Navbox
| title = Items
| striped = even
| group1 = Consumables
| list1 =
* Health Potion
* Mana Potion
| group2 = Weapons
| group2.1 = Swords
| list2.1 =
* Wooden Sword
* Rusted Sword
* Steel Sword
| group2.2 = Bows
| list2.2 =
* Shortbow
* Crossbow
* Longbow
}}
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Navbox
| template = <template_title> <!-- Required. e.g. `|template=Items` for template:Items -->
| title = Items
| striped = even
| group1 = Consumables
| list1 =
* Health Potion
* Mana Potion
| group2 = Weapons
| group2.1 = Swords
| list2.1 =
* Wooden Sword
* Rusted Sword
* Steel Sword
| group2.2 = Bows
| list2.2 =
* Shortbow
* Crossbow
* Longbow
}}
</syntaxhighlight>
== Parameters ==
=== Main ===
The following parameters modify the navbox as a whole.
{| class="wikitable"
! Parameter
! Description
|-
! <code>template</code><br><code>name</code>
| ('''Required''') Title of the template that the edit icon links to. e.g. <code>Items</code> for template:Items.
|-
! <code>title</code>
| Text that appears at the top of the navbox.
|-
! <code>state</code><br><code>collapsible</code>
| Controls if a navbox should be expanded or collapsed when the page loads. This only affects the whole navbox; if [[#Sections|sections]] are used, they are treated differently.
* <code>expanded</code> ('''default''') - the navbox will start open and readers can collapse it.
* <code>collapsed</code> - the navbox will start closed and readers can expand it.
* <code>off</code>, <code>no</code>, or <code>plain</code> - the navbox will start open and cannot be collapsed.
Advanced users can modify this on a page-by-page basis; see [[support:RANGER navboxes#Controlling the collapsible|the support wiki]] for more information.
|-
! <code>editlinks</code>
| Controls if an edit icon should be displayed at the top-left of the navbox, making it easier for users to interact with the template itself.
* unset ('''default''') - displays the edit icon
* <code>off</code> or <code>no</code> - hides the edit icon
|-
! <code>above</code>
| Text that appears above all list groups, directly below the title.
|-
! <code>below</code>
| Text that appears below all list groups, at the bottom of the navbox.
|-
! <code>striped</code><br><code>evenodd</code>
| Controls if the navbox rows should have zebra striping on even or odd rows, making it easier for users to distinguish two rows apart from each other. If [[#Sections|sections]] are used, each section resets the even/odd counter.
*unset ('''default''') - all rows have the same background
*<code>y</code>, <code>yes</code>, <code>on</code>, <code>striped</code>, or <code>even</code> - even-numbered rows are highlighted
*<code>swap</code> or <code>odd</code> - odd-numbered rows are highlighted
|}
=== Sections ===
The following parameters define sections within the navbox with their own titles.
{| class="wikitable"
! Parameter
! Description
|-
! <code>header''n''</code>
| Text that appears at the top of the section, where ''n'' is any positive integer. If the value is set to two or more <code>-</code> (e.g. <code>--</code>, <code>-----</code>, etc.) the new section will have no header bar and cannot be collapsed.
All groups and lists that are ''n'' or higher will appear in this section unless there is a higher <code>header''n''</code> later in the template. For example, if a navbox defines <code>header1</code> and <code>header4</code>, the first section will include <code>list1</code>, <code>list2</code>, and <code>list3</code> (and any of their sub-lists), while the second section will include all remaining lists starting at <code>list4</code> and their sub-lists.
|-
! <code>header_state</code><br><code>state''n''</code>
| <code>header_state</code> controls if all sections, by default, should be expanded or collapsed when the page loads.
<code>state''n''</code> overrides <code>header_state</code> for the specific section defined by <code>header''n''</code> (where ''n'' is a matching integer).
* <code>expanded</code> ('''default''') - the section will start open and readers can collapse it.
* <code>collapsed</code> - the section will start closed and readers can expand it.
* <code>off</code> or <code>plain</code> - the section will start open and cannot be collapsed.
Advanced users can modify these on a page-by-page basis; see [[support:RANGER navboxes#Controlling the collapsible|the support wiki]] for more information.
Both parameters have no effect on sections with headers set to two or more <code>-</code>, which are always expanded and cannot be collapsed.
|}
=== List groups ===
The following parameters define the list groups.
{| class="wikitable"
! Parameter
! Description
|-
! <code>group''n''</code>
| Text label for a list, which appears on the left on desktop or at the top on mobile, where ''n'' is any positive integer.
This parameter is optional; if a <code>list''n''</code> does not have a matching <code>group''n''</code>, the list will take the full width on desktop.
|-
! <code>list''n''</code>
| A wikitext list, where ''n'' is any positive integer.
|-
! <code>group''n''.''x''</code><br><code>group''n''.''x''.''y''</code><br>etc.
| Text label for sub-lists that appear under <code>group''n''</code>, <code>group''n''.''x''</code>, etc.
|-
! <code>list''n''.''x''</code><br><code>list''n''.''x''.''y''</code><br>etc.
| Wikitext sub-lists.
|}
=== Styling ===
The following parameters add inline styling or your custom CSS classes to specific elements of the navbox.
To assist with text alignment, three default classes are available: <code>align-left</code>, <code>align-center</code>, and <code>align-right</code>.
{| class="wikitable"
! Parameter
! Description
|-
! <code>navbox_style</code><br><code>navbox_class</code>
| Modifies the parent navbox element; <code>class</code> can be used as a shorthand for <code>navbox_class</code>
Two default classes are available:
*<code>pill</code> changes the links to pill-styled rather than dot-separated
*<code>pill-mobile</code> only changes the links to pill-styled on mobile devices
|-
! <code>title_style</code><br><code>title_class</code>
| Modifies the title bar
|-
! <code>above_style</code><br><code>above_class</code>
| Modifies the <code>above</code> text row
|-
! <code>below_style</code><br><code>below_class</code>
| Modifies the <code>below</code> text row
|-
! <code>header_style</code><br><code>header_class</code>
| Modifies all section headers (''not'' the title bar)
|-
! <code>header''n''_style</code><br><code>header''n''_class</code>
| Modifies the specific section header ''n''
|-
! <code>section''n''_style</code><br><code>section''n''_class</code>
| Modifies the container holding the section defined by a matching <code>header''n''</code>
|-
! <code>group_style</code><br><code>group_class</code>
| Modifies all base groups (<code>group''n''</code>), but ''not'' any subgroups (<code>group''n''.''x''</code>, etc.)
|-
! <code>subgroup_style</code><br><code>subgroup_class</code>
| Modifies all subgroups at all levels (<code>group''n''.''x''</code>, <code>group''n''.''x''.''y''</code>, etc.)
|-
! <code>group''A''_style</code><br><code>group''A''_class</code>
| Modifies the specific group ''A'', where ''A'' is any ''n'', ''n''.''x'', ''n''.''x''.''y'', etc.
|-
! <code>list_style</code><br><code>list_class</code>
| Modifies all lists. Note, in this context, "list" refers to the container of a <code>list''n''</code> parameter, not a <code>ul</code> or <code>ol</code> element inside the parameter
|-
! <code>list''A''_style</code><br><code>list''A''_class</code>
| Modifies the specific list ''A'', where ''A'' is any ''n'', ''n''.''x'', ''n''.''x''.''y'', etc.
|}
<noinclude>[[Category:Template documentation]]</noinclude>
e35c990efd00644e63b9735d72ff65818357a1fb
Template:(
10
47
55
2025-08-20T01:22:49Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{<noinclude>
{{documentation}}</noinclude>
490a0c9c85eff213addd7272fe40f8627a637c75
Template:(/doc
10
48
56
2025-08-20T01:22:49Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:)
10
49
57
2025-08-20T01:22:50Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
}<noinclude>
{{documentation}}</noinclude>
3bf19eb36f7371f1b4b61b8efbba67dfb0e8cfd4
Template:)/doc
10
50
58
2025-08-20T01:22:51Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:(((
10
51
59
2025-08-20T01:22:51Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{{<noinclude>
{{documentation}}</noinclude>
fa33084b57c1f33c82290de279827b973ab2fba8
Template:(((/doc
10
52
60
2025-08-20T01:22:52Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:)))
10
53
61
2025-08-20T01:22:52Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
}}}<noinclude>
{{documentation}}</noinclude>
585d94f6fe636b77087dc0d06bfbe6cb69b29987
Template:)))/doc
10
54
62
2025-08-20T01:22:53Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:Documentation/doc
10
55
63
2025-08-20T01:22:53Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
Use {{tl|documentation}} inside of the <code><nowiki><noinclude></noinclude></nowiki></code> section on your template. Then create your template at the <code>/doc</code> subpage of your template.
<noinclude>[[Category:Template documentation]]</noinclude>
055b0481a1967951c59f15a09b92767c90baa8dd
Template:License/CC-BY-NC-ND
10
56
64
2025-08-20T01:22:54Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-NC-ND
| icon = [[File:CC-BY-NC-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nc-nd/3.0/|CC-BY-NC-ND]]
| text = This file is under the [https://creativecommons.org/licenses/by-nc-nd/3.0/ Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-NC-ND}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
4ed8a6372d14a167dd9d26f1ae865b1593b76604
65
64
2025-08-20T01:22:55Z
ARTIFICER
564804
Protected "[[Template:License/CC-BY-NC-ND]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-NC-ND
| icon = [[File:CC-BY-NC-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nc-nd/3.0/|CC-BY-NC-ND]]
| text = This file is under the [https://creativecommons.org/licenses/by-nc-nd/3.0/ Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-NC-ND}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
4ed8a6372d14a167dd9d26f1ae865b1593b76604
Template:License/CC-BY-SA
10
57
66
2025-08-20T01:22:55Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-SA
| icon = [[File:CC-BY-SA.svg|x50px|link=https://creativecommons.org/licenses/by-sa/3.0/|CC-BY-SA]]
| text = This file is under the [https://creativecommons.org/licenses/by-sa/3.0/ Creative Commons Attribution-ShareAlike 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-SA}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
1e471ba76ef084e99bff87e9356d439d400f73de
67
66
2025-08-20T01:22:55Z
ARTIFICER
564804
Protected "[[Template:License/CC-BY-SA]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-SA
| icon = [[File:CC-BY-SA.svg|x50px|link=https://creativecommons.org/licenses/by-sa/3.0/|CC-BY-SA]]
| text = This file is under the [https://creativecommons.org/licenses/by-sa/3.0/ Creative Commons Attribution-ShareAlike 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-SA}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
1e471ba76ef084e99bff87e9356d439d400f73de
Template:License/fairuse
10
58
68
2025-08-20T01:22:56Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = fairuse
| darkIcon = yes
| icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]]
| text = This file is copyrighted. It will be used in a way that qualifies as fair use under [https://en.wikipedia.org/wiki/Fair_use#Fair_use_under_United_States_law US copyright law].
}}</includeonly><noinclude>
This template currently looks like: {{License/fairuse}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
3662b685c4d9fa43d4f9342fae34b2f43ba925ef
69
68
2025-08-20T01:22:57Z
ARTIFICER
564804
Protected "[[Template:License/fairuse]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = fairuse
| darkIcon = yes
| icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]]
| text = This file is copyrighted. It will be used in a way that qualifies as fair use under [https://en.wikipedia.org/wiki/Fair_use#Fair_use_under_United_States_law US copyright law].
}}</includeonly><noinclude>
This template currently looks like: {{License/fairuse}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
3662b685c4d9fa43d4f9342fae34b2f43ba925ef
Template:License
10
59
70
2025-08-20T01:22:57Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/{{{1|nolicense}}}|source={{{source|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
4b84fc940507f8fccb9c60b7f70b5a800a62fe59
71
70
2025-08-20T01:22:57Z
ARTIFICER
564804
Protected "[[Template:License]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/{{{1|nolicense}}}|source={{{source|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
4b84fc940507f8fccb9c60b7f70b5a800a62fe59
Template:License/CC-PD
10
60
72
2025-08-20T01:22:57Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-PD
| icon = [[File:CC-PD.svg|x50px|link=|Public Domain]]
| text = This file has been released into the public domain by the copyright holder, its copyright has expired, or it is ineligible for copyright. This applies worldwide.
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-PD}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
23b76ae521833f5a34f0bf73426a53aad8fa9923
73
72
2025-08-20T01:22:58Z
ARTIFICER
564804
Protected "[[Template:License/CC-PD]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-PD
| icon = [[File:CC-PD.svg|x50px|link=|Public Domain]]
| text = This file has been released into the public domain by the copyright holder, its copyright has expired, or it is ineligible for copyright. This applies worldwide.
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-PD}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
23b76ae521833f5a34f0bf73426a53aad8fa9923
Template:License/CC-SRR
10
61
74
2025-08-20T01:22:58Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-SRR
| icon = [[File:CC-SRR.svg|link=|CC-Some Rights Reserved]]
| text = This file is under the Creative Commons Some Rights Reserved License.
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-SRR}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
1ce36d04e501144e6a089ff194fee2b82732e85a
75
74
2025-08-20T01:22:59Z
ARTIFICER
564804
Protected "[[Template:License/CC-SRR]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-SRR
| icon = [[File:CC-SRR.svg|link=|CC-Some Rights Reserved]]
| text = This file is under the Creative Commons Some Rights Reserved License.
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-SRR}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
1ce36d04e501144e6a089ff194fee2b82732e85a
Template:License/CC-BY
10
62
76
2025-08-20T01:22:59Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY
| icon = [[File:CC-BY.svg|x50px|link=https://creativecommons.org/licenses/by/3.0/|CC-BY]]
| text = This file is under the [https://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
49f4317b802ef04c92f4edc474581035768c252e
77
76
2025-08-20T01:22:59Z
ARTIFICER
564804
Protected "[[Template:License/CC-BY]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY
| icon = [[File:CC-BY.svg|x50px|link=https://creativecommons.org/licenses/by/3.0/|CC-BY]]
| text = This file is under the [https://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
49f4317b802ef04c92f4edc474581035768c252e
Template:License/CC-BY-ND
10
63
78
2025-08-20T01:23:00Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-ND
| icon = [[File:CC-BY-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nd/3.0/|CC-BY-ND]]
| text = This file is under the [https://creativecommons.org/licenses/by-nd/3.0/ Creative Commons Attribution-NoDerivs 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-ND}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
c77af748cb3aab2fce9bfd947149cb3e1ef0a3f0
79
78
2025-08-20T01:23:01Z
ARTIFICER
564804
Protected "[[Template:License/CC-BY-ND]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-ND
| icon = [[File:CC-BY-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nd/3.0/|CC-BY-ND]]
| text = This file is under the [https://creativecommons.org/licenses/by-nd/3.0/ Creative Commons Attribution-NoDerivs 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-ND}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
c77af748cb3aab2fce9bfd947149cb3e1ef0a3f0
Template:License/game
10
64
80
2025-08-20T01:23:01Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:rightsholder|<!--
***************************************
***************************************
Step 1/2 [required]
Enter the name of the rightsholder, optionally with a link.
Example without link: indie.io
Example with a URL: [https://www.indie.io/ indie.io]
Edit on the line below this************-->
<!--Edit on the line above this********
***************************************
***************************************
-->}}<!--
continue to step 2
***************************************
***************************************
Step 2/2 [optional]
Enter the TOS link.
Example link: https://www.indie.io/terms-of-service
-->{{#vardefine:tos|<!--
Edit on the line below this************-->
<!--Edit on the line above this********
***************************************
***************************************
-->}}<!--
DON'T EDIT ANYTHING BELOW THIS
-->{{License/template
| source = {{{source|}}}
| type = developer
| darkIcon = yes
| icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]]
| text = {{#if:{{#var:rightsholder}}|
<!-- Specific: -->This file is owned by {{#var:rightsholder}} and/or its licensors{{#if:{{#var:tos}}|, and is licensed under the {{#var:rightsholder}} [{{#var:tos}} Terms of Use]}}.<br/>All trademarks and registered trademarks present in the file are proprietary to {{#var:rightsholder}} and/or its licensors.
|
<!-- Generic: -->This file is owned by the applicable game studio and/or its licensors.
}}
}}</includeonly><noinclude>
This template currently looks like: {{License/game}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
f1283ce43eda0d523b8e1f249ebc02470d957b34
81
80
2025-08-20T01:23:01Z
ARTIFICER
564804
Protected "[[Template:License/game]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:rightsholder|<!--
***************************************
***************************************
Step 1/2 [required]
Enter the name of the rightsholder, optionally with a link.
Example without link: indie.io
Example with a URL: [https://www.indie.io/ indie.io]
Edit on the line below this************-->
<!--Edit on the line above this********
***************************************
***************************************
-->}}<!--
continue to step 2
***************************************
***************************************
Step 2/2 [optional]
Enter the TOS link.
Example link: https://www.indie.io/terms-of-service
-->{{#vardefine:tos|<!--
Edit on the line below this************-->
<!--Edit on the line above this********
***************************************
***************************************
-->}}<!--
DON'T EDIT ANYTHING BELOW THIS
-->{{License/template
| source = {{{source|}}}
| type = developer
| darkIcon = yes
| icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]]
| text = {{#if:{{#var:rightsholder}}|
<!-- Specific: -->This file is owned by {{#var:rightsholder}} and/or its licensors{{#if:{{#var:tos}}|, and is licensed under the {{#var:rightsholder}} [{{#var:tos}} Terms of Use]}}.<br/>All trademarks and registered trademarks present in the file are proprietary to {{#var:rightsholder}} and/or its licensors.
|
<!-- Generic: -->This file is owned by the applicable game studio and/or its licensors.
}}
}}</includeonly><noinclude>
This template currently looks like: {{License/game}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
f1283ce43eda0d523b8e1f249ebc02470d957b34
Template:License/nolicense
10
65
82
2025-08-20T01:23:02Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = nolicense
| icon = [[File:Warning-red.svg|50px|link=|No license has been selected.]]
| text = Please select the proper license for this file by adding the proper parameter to <nowiki>{{License}}</nowiki>. See [[Template:License]] for details.
}}</includeonly><noinclude>
This template currently looks like: {{License/nolicense}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
9ddcfb97af577d7f8454e20f985b9456e7a95c77
83
82
2025-08-20T01:23:02Z
ARTIFICER
564804
Protected "[[Template:License/nolicense]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = nolicense
| icon = [[File:Warning-red.svg|50px|link=|No license has been selected.]]
| text = Please select the proper license for this file by adding the proper parameter to <nowiki>{{License}}</nowiki>. See [[Template:License]] for details.
}}</includeonly><noinclude>
This template currently looks like: {{License/nolicense}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
9ddcfb97af577d7f8454e20f985b9456e7a95c77
Template:License/CC-BY-NC
10
66
84
2025-08-20T01:23:02Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-NC
| icon = [[File:CC-BY-NC.svg|x50px|link=https://creativecommons.org/licenses/by-nc/3.0/|CC-BY-NC]]
| text = This file is under the [https://creativecommons.org/licenses/by-nc/3.0/ Creative Commons Attribution-NonCommercial 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-NC}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
535d8d725e53a0e8f94922ed597baed1353cec21
85
84
2025-08-20T01:23:03Z
ARTIFICER
564804
Protected "[[Template:License/CC-BY-NC]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-NC
| icon = [[File:CC-BY-NC.svg|x50px|link=https://creativecommons.org/licenses/by-nc/3.0/|CC-BY-NC]]
| text = This file is under the [https://creativecommons.org/licenses/by-nc/3.0/ Creative Commons Attribution-NonCommercial 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-NC}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
535d8d725e53a0e8f94922ed597baed1353cec21
Template:License/CC-BY-NC-SA
10
67
86
2025-08-20T01:23:03Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-NC-SA
| icon = [[File:CC-BY-NC-SA.svg|x50px|link=https://creativecommons.org/licenses/by-nc-sa/3.0/|CC-BY-NC-SA]]
| text = This file is under the [https://creativecommons.org/licenses/by-nc-sa/3.0/ Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-NC-SA}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
385fc8e61d98dd5ed6d4fa25b0eacf17cbca1218
87
86
2025-08-20T01:23:04Z
ARTIFICER
564804
Protected "[[Template:License/CC-BY-NC-SA]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC-BY-NC-SA
| icon = [[File:CC-BY-NC-SA.svg|x50px|link=https://creativecommons.org/licenses/by-nc-sa/3.0/|CC-BY-NC-SA]]
| text = This file is under the [https://creativecommons.org/licenses/by-nc-sa/3.0/ Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC-BY-NC-SA}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
385fc8e61d98dd5ed6d4fa25b0eacf17cbca1218
Template:License/CC0
10
68
88
2025-08-20T01:23:04Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC0
| icon = [[File:CC-0.svg|x50px|link=https://creativecommons.org/publicdomain/zero/1.0/|CC0]]
| text = This file is under the [https://creativecommons.org/publicdomain/zero/1.0/ CC0 1.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC0}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
a6ae218b1382bcbe6f0e6e98ef272e4355dd7205
89
88
2025-08-20T01:23:04Z
ARTIFICER
564804
Protected "[[Template:License/CC0]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = CC0
| icon = [[File:CC-0.svg|x50px|link=https://creativecommons.org/publicdomain/zero/1.0/|CC0]]
| text = This file is under the [https://creativecommons.org/publicdomain/zero/1.0/ CC0 1.0 License].
}}</includeonly><noinclude>
This template currently looks like: {{License/CC0}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
a6ae218b1382bcbe6f0e6e98ef272e4355dd7205
Template:License/doc
10
69
90
2025-08-20T01:23:04Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template is to be used under a ''Licensing'' heading on file pages to denote the file's license.
== Available licenses ==
=== Game ===
* Usage: <nowiki>{{License|game}}</nowiki>
{{License|game}}
=== Fairuse ===
* Usage: <nowiki>{{License|fairuse}}</nowiki>
{{License|fairuse}}
=== CC0 ===
* Usage: <nowiki>{{License|CC0}}</nowiki>
{{License|CC0}}
=== CC-BY-NC-ND ===
* Usage: <nowiki>{{License|CC-BY-NC-ND}}</nowiki>
{{License|CC-BY-NC-ND}}
=== CC-BY-NC-SA ===
* Usage: <nowiki>{{License|CC-BY-NC-SA}}</nowiki>
{{License|CC-BY-NC-SA}}
=== CC-BY-NC ===
* Usage: <nowiki>{{License|CC-BY-NC}}</nowiki>
{{License|CC-BY-NC}}
=== CC-BY-ND ===
* Usage: <nowiki>{{License|CC-BY-ND}}</nowiki>
{{License|CC-BY-ND}}
=== CC-BY-SA ===
* Usage: <nowiki>{{License|CC-BY-SA}}</nowiki>
{{License|CC-BY-SA}}
=== CC-BY ===
* Usage: <nowiki>{{License|CC-BY}}</nowiki>
{{License|CC-BY}}
=== CC-PD ===
* Usage: <nowiki>{{License|CC-PD}}</nowiki>
{{License|CC-PD}}
=== CC-SRR ===
* Usage: <nowiki>{{License|CC-SRR}}</nowiki>
{{License|CC-SRR}}
=== Permission ===
* Usage: <nowiki>{{License|permission}}</nowiki>
{{License|permission}}
=== No license ===
'''Providing no parameter (or invalid one) defaults to the nolicense notice:'''
<nowiki>{{License}}</nowiki>{{License}}
== Specifying source ==
'''Source parameter (optional):'''
The source parameter accepts a url to the source where the file came from if necessary for attribution.
Example:
<nowiki>{{License|game|source=https://indie.io/}}</nowiki>
{{License|game|source=https://indie.io/}}
<includeonly>
[[Category:License templates]]
</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
5b334ee591fa6a0867f5d8e685e580b5b6c21334
Template:License/Fairuse
10
70
91
2025-08-20T01:23:05Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:License/fairuse]]
ecb7db41961bb5256d571593ca3f90ae1e199a3e
Template:Clear
10
71
92
2025-08-20T01:23:05Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<div style="clear:{{{1|both}}};" class={{{class|}}}></div><noinclude>
{{documentation}}
</noinclude>
5b24b9fd5cc166a8c486e2422d5df465206ed39c
Template:Ml
10
72
93
2025-08-20T01:23:06Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<code>{{[[Module:{{{1}}}|{{{1}}}]]}}<sup>m</sup>{{#if:{{{2|}}}|.{{{2}}}()}}</code><noinclude>
* <code><nowiki>{{Ml|Infobox}}</nowiki></code> generates {{Ml|Infobox}}.
* <code><nowiki>{{Ml|ArgsUtil|merge}}</nowiki></code> generates {{Ml|ArgsUtil|merge}}.
[[Category:Formatting templates]]
</noinclude>
0c69bf8d7c3319f1cf2aa68f4b80261257291560
Template:(!
10
73
94
2025-08-20T01:23:07Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{|<noinclude>{{documentation}}</noinclude>
86e51fe1f06ae532410029eb39fa936d68880bc8
Template:!-
10
74
95
2025-08-20T01:23:07Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
|-<noinclude>{{documentation}}</noinclude>
636f9e440c24f4a3fe28b49cebd1808c3de8a814
Template:!)
10
75
96
2025-08-20T01:23:08Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
|}<noinclude>{{documentation}}</noinclude>
b2debea163716e114d1ea46e65a63d7a1ae84bc0
Template:(!/doc
10
76
97
2025-08-20T01:23:08Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:!-/doc
10
77
98
2025-08-20T01:23:09Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:!)/doc
10
78
99
2025-08-20T01:23:10Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:Pipe
10
79
100
2025-08-20T01:23:10Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
|<noinclude>{{documentation}}</noinclude>
9d1875aa686e4e25a0994448a39d057e91541788
Template:Pipe/doc
10
80
101
2025-08-20T01:23:11Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:!!
10
81
102
2025-08-20T01:23:12Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
||<noinclude>{{documentation}}</noinclude>
02fb31115eef5c15d6612ac334bf5a5d83155c0a
Template:!!/doc
10
82
103
2025-08-20T01:23:17Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:License/template
10
83
104
2025-08-20T01:23:17Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
--><div class="license {{{type|}}}" style="border: 1px solid var(--wiki-content-border-color); background: var(--wiki-content-background-color--secondary); align-items: center; padding: 5px; display: flex; gap: 1em;">
<div class="icon {{#if:{{{darkIcon|}}}|invert-on-dark}}">{{{icon|}}}</div>
<div class="text">{{{text|}}}{{#if:{{{source|}}}|<br/><span class="source">Source: {{{source|}}}</span>}}{{{text2|}}}</div>
</div><!--
--></includeonly><noinclude>{{documentation|Template:License/doc}}</noinclude>
7d0e694e6a42a5368b4b62ce6c01bfa2fb4e67b8
105
104
2025-08-20T01:23:18Z
ARTIFICER
564804
Protected "[[Template:License/template]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly><!--
--><div class="license {{{type|}}}" style="border: 1px solid var(--wiki-content-border-color); background: var(--wiki-content-background-color--secondary); align-items: center; padding: 5px; display: flex; gap: 1em;">
<div class="icon {{#if:{{{darkIcon|}}}|invert-on-dark}}">{{{icon|}}}</div>
<div class="text">{{{text|}}}{{#if:{{{source|}}}|<br/><span class="source">Source: {{{source|}}}</span>}}{{{text2|}}}</div>
</div><!--
--></includeonly><noinclude>{{documentation|Template:License/doc}}</noinclude>
7d0e694e6a42a5368b4b62ce6c01bfa2fb4e67b8
Template:*
10
84
106
2025-08-20T01:23:18Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
• <noinclude>
{{doc}}
[[Category:Formatting templates]]
</noinclude>
81a7f0051da7b8f4a0548d91c5eb429a974fac91
Template:*/doc
10
85
107
2025-08-20T01:23:19Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This is the '''bullet''' template; it looks like this: [ • ]
It works similarly to the HTML markup sequence: [<code>'''&nbsp;&bull;&nbsp;'''</code>], that is, a non-breaking space, a bullet and a non-breaking space.
This template is used when you want a larger bullet than a bold middot ['''·'''], but something smaller than an en dash [–].
<noinclude>[[Category:Template documentation]]</noinclude>
ea04fe63a10dc333ed9c48bfc397debb11682f1e
Template:Key
10
86
108
2025-08-20T01:23:20Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:platform | {{#if: {{{2|}}} | {{#switch: {{lc:{{{1|}}}}}
<!-- Desktop -->
|mouse
|keyboard=keyboard
<!-- Mobile -->
|gesture=gesture
<!-- Microsoft -->
|xboxseries
|xbox=Xbox
|xbox one
|xbone
|xbox1
|xboxone=xboxone
|xbox 360
|xb360
|xbox360
|360=360
<!-- Sony -->
|ps
|ps5
|playstation
|ds
|dualsense=DualSense
|playstation 4
|ps4=PS4
|playstation 3
|ps3=ps3
<!-- Nintendo -->
|ns
|switch=Switch
|wii=wii
}} | undefined }} }}<!--
-->{{#vardefine:key | {{#if: {{{2|}}} | {{ucfirst:{{{2}}}}} | {{ucfirst:{{{1}}}}} }} }}<!--
-->{{#vardefine:img | {{#if: {{{2|}}} | [[File:{{#var:platform}} {{#var:key}}.png|x25px|link=]] }} | Undefined }}<!--
--><span class="key">{{#var:img}}</span><!--
--></includeonly><!--
--><noinclude>{{doc}}</noinclude>
45576cb62a8104687b5b7ac26b042283c80ecae6
Template:Key/doc
10
87
109
2025-08-20T01:23:20Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<tabber>
|-|Desktop={{:Template:Key/doc/Keyboard}}
|-|Mobile={{:Template:Key/doc/Gesture}}
|-|Xbox={{:Template:Key/doc/Xbox}}
|-|DualSense={{:Template:Key/doc/DualSense}}
|-|PlayStation 4={{:Template:Key/doc/PS4}}
|-|Nintendo Switch={{:Template:Key/doc/Nintendo Switch}}
</tabber>
<noinclude>[[Category:Key template documentation]]</noinclude>
19eb9be1ca2c7112f63dd11c58d3888327dcca75
Template:Key/doc/Gesture
10
88
110
2025-08-20T01:23:21Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
Images source: [[dev:Category:Gesture input images]]
=== Fingers ===
<code><nowiki>{{key|gesture|Finger Front}}</nowiki></code>
{{key|gesture|Finger Front}}
<code><nowiki>{{key|gesture|Finger Side}}</nowiki></code>
{{key|gesture|Finger Side}}
=== Tap & hold ===
<code><nowiki>{{key|gesture|Tap}}</nowiki></code>
{{key|gesture|Tap}}
<code><nowiki>{{key|gesture|Double Tap}}</nowiki></code>
{{key|gesture|Double Tap}}
<code><nowiki>{{key|gesture|Hold}}</nowiki></code>
{{key|gesture|Hold}}
=== Swipe motions ===
<code><nowiki>{{key|gesture|Swipe Bottom Left}}</nowiki></code>
{{key|gesture|Swipe Bottom Left}}
<code><nowiki>{{key|gesture|Swipe Bottom Right}}</nowiki></code>
{{key|gesture|Swipe Bottom Right}}
<code><nowiki>{{key|gesture|Swipe Down}}</nowiki></code>
{{key|gesture|Swipe Down}}
<code><nowiki>{{key|gesture|Swipe Left}}</nowiki></code>
{{key|gesture|Swipe Left}}
<code><nowiki>{{key|gesture|Swipe Right}}</nowiki></code>
{{key|gesture|Swipe Right}}
<code><nowiki>{{key|gesture|Swipe Top Left}}</nowiki></code>
{{key|gesture|Swipe Top Left}}
<code><nowiki>{{key|gesture|Swipe Top Right}}</nowiki></code>
{{key|gesture|Swipe Top Right}}
<code><nowiki>{{key|gesture|Swipe Up}}</nowiki></code>
{{key|gesture|Swipe Up}}
=== Zoom & scroll ===
<code><nowiki>{{key|gesture|Zoom In}}</nowiki></code>
{{key|gesture|Zoom In}}
<code><nowiki>{{key|gesture|Zoom Out}}</nowiki></code>
{{key|gesture|Zoom Out}}
<code><nowiki>{{key|gesture|Scroll Down}}</nowiki></code>
{{key|gesture|Scroll Down}}
<code><nowiki>{{key|gesture|Scroll Left}}</nowiki></code>
{{key|gesture|Scroll Left}}
<code><nowiki>{{key|gesture|Scroll Right}}</nowiki></code>
{{key|gesture|Scroll Right}}
<code><nowiki>{{key|gesture|Scroll Up}}</nowiki></code>
{{key|gesture|Scroll Up}}
=== Circular motions ===
<code><nowiki>{{key|gesture|Double Rotate}</nowiki></code>
{{key|gesture|Double Rotate}}
<code><nowiki>{{key|gesture|Full Circle}}</nowiki></code>
{{key|gesture|Full Circle}}
<code><nowiki>{{key|gesture|Half Circle}}</nowiki></code>
{{key|gesture|Half Circle}}
<code><nowiki>{{key|gesture|Quarter Circle}}</nowiki></code>
{{key|gesture|Quarter Circle}}
__NOTOC__
<noinclude>[[Category:Key template documentation]]</noinclude>
0a595b125cc6dbd6ad531c1e989d1929eaf1c6e2
Template:Key/doc/PS4
10
89
111
2025-08-20T01:23:21Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
Images source: [[dev:Category:PS4 input images]]
=== D-pad & sticks ===
<code><nowiki>{{key|PS4|Dpad}}</nowiki></code>
{{key|PS4|Dpad}}
<code><nowiki>{{key|PS4|Left}}</nowiki></code>
{{key|PS4|Left}}
<code><nowiki>{{key|PS4|Right}}</nowiki></code>
{{key|PS4|Right}}
<code><nowiki>{{key|PS4|Up}}</nowiki></code>
{{key|PS4|Up}}
<code><nowiki>{{key|PS4|Down}}</nowiki></code>
{{key|PS4|Down}}
<code><nowiki>{{key|PS4|Left Stick}}</nowiki></code>
{{key|PS4|Left Stick}}
<code><nowiki>{{key|PS4|Right Stick}}</nowiki></code>
{{key|PS4|Right Stick}}
<code><nowiki>{{key|PS4|Touch Pad}}</nowiki></code>
{{key|PS4|Touch Pad}}
=== Front buttons ===
<code><nowiki>{{key|PS4|Circle}}</nowiki></code>
{{key|PS4|Circle}}
<code><nowiki>{{key|PS4|Cross}}</nowiki></code>
{{key|PS4|Cross}}
<code><nowiki>{{key|PS4|Square}}</nowiki></code>
{{key|PS4|Square}}
<code><nowiki>{{key|PS4|Triangle}}</nowiki></code>
{{key|PS4|Triangle}}
<code><nowiki>{{key|PS4|Share}}</nowiki></code>
{{key|PS4|Share}}
<code><nowiki>{{key|PS4|Options}}</nowiki></code>
{{key|PS4|Options}}
=== Rear buttons ===
<code><nowiki>{{key|PS4|L1}}</nowiki></code>
{{key|PS4|L1}}
<code><nowiki>{{key|PS4|R1}}</nowiki></code>
{{key|PS4|R1}}
<code><nowiki>{{key|PS4|L2}}</nowiki></code>
{{key|PS4|L2}}
<code><nowiki>{{key|PS4|R2}}</nowiki></code>
{{key|PS4|R2}}
<noinclude>[[Category:Key template documentation]]</noinclude>
1672e7f0dcd4db09545c96936cfbabcab681cfeb
Template:Key/doc/Nintendo Switch
10
90
112
2025-08-20T01:23:22Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
Images source: [[dev:Category:Nintendo Switch input images]]
=== Nintendo Switch ===
<code><nowiki>{{Key|Switch|a}}</nowiki></code>
{{Key|Switch|a}}
<code><nowiki>{{Key|Switch|b}}</nowiki></code>
{{Key|Switch|b}}
<code><nowiki>{{Key|Switch|x}}</nowiki></code>
{{Key|Switch|x}}
<code><nowiki>{{Key|Switch|y}}</nowiki></code>
{{Key|Switch|y}}
<code><nowiki>{{Key|Switch|Left Stick}}</nowiki></code>
{{Key|Switch|Left Stick}}
<code><nowiki>{{Key|Switch|Right Stick}}</nowiki></code>
{{Key|Switch|Right Stick}}
<code><nowiki>{{Key|Switch|Left Stick Press}}</nowiki></code>
{{Key|Switch|Left Stick Press}}
<code><nowiki>{{Key|Switch|Right Stick Press}}</nowiki></code>
{{Key|Switch|Right Stick Press}}
<code><nowiki>{{Key|Switch|-}}</nowiki></code>
{{Key|Switch|-}}
<code><nowiki>{{Key|Switch|+}}</nowiki></code>
{{Key|Switch|+}}
<code><nowiki>{{Key|Switch|Capture}}</nowiki></code>
{{Key|Switch|Capture}}
<code><nowiki>{{Key|Switch|HOME}}</nowiki></code>
{{Key|Switch|HOME}}
<code><nowiki>{{Key|Switch|L}}</nowiki></code>
{{Key|Switch|L}}
<code><nowiki>{{Key|Switch|R}}</nowiki></code>
{{Key|Switch|R}}
<code><nowiki>{{Key|Switch|ZL}}</nowiki></code>
{{Key|Switch|ZL}}
<code><nowiki>{{Key|Switch|ZR}}</nowiki></code>
{{Key|Switch|ZR}}
=== Pro Controller ===
<code><nowiki>{{Key|Switch|Pro Control Pad}}</nowiki></code>
{{Key|Switch|Pro Control Pad}}
<code><nowiki>{{Key|Switch|Pro Control Pad Left}}</nowiki></code>
{{Key|Switch|Pro Control Pad Left}}
<code><nowiki>{{Key|Switch|Pro Control Pad Right}}</nowiki></code>
{{Key|Switch|Pro Control Pad Right}}
<code><nowiki>{{Key|Switch|Pro Control Pad Up}}</nowiki></code>
{{Key|Switch|Pro Control Pad Up}}
<code><nowiki>{{Key|Switch|Pro Control Pad Down}}</nowiki></code>
{{Key|Switch|Pro Control Pad Down}}
=== Joy-Con ===
<code><nowiki>{{Key|Switch|Directional Left}}</nowiki></code>
{{Key|Switch|Directional Left}}
<code><nowiki>{{Key|Switch|Directional Right}}</nowiki></code>
{{Key|Switch|Directional Right}}
<code><nowiki>{{Key|Switch|Directional Up}}</nowiki></code>
{{Key|Switch|Directional Up}}
<code><nowiki>{{Key|Switch|Directional Down}}</nowiki></code>
{{Key|Switch|Directional Down}}
==== Diagrams ====
<code><nowiki>{{Key|Switch|Joy-Con}}</nowiki></code>
{{Key|Switch|Joy-Con}}
<code><nowiki>{{Key|Switch|Joy-Con Separate}}</nowiki></code>
{{Key|Switch|Joy-Con Separate}}
<code><nowiki>{{Key|Switch|Joy-Con Left}}</nowiki></code>
{{Key|Switch|Joy-Con Left}}
<code><nowiki>{{Key|Switch|Joy-Con Right}}</nowiki></code>
{{Key|Switch|Joy-Con Right}}
__NOTOC__
<noinclude>[[Category:Key template documentation]]</noinclude>
34ef402e3bd539920ee4247d68882ecb53fc6eda
Template:Spoiler
10
91
113
2025-08-20T01:23:23Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
Base code written for Terraria Wiki: https://terraria.wiki.gg/wiki/Template:Spoiler
NOTE: This template needs a JavaScript function in MediaWiki:Common.js or MediaWiki:Vector.js to work, as well as styling in MediaWiki:Common.css or MediaWiki:Vector.css for the related classes
-->{{#vardefine:element|{{#if:{{{block|}}}|div|span}}}}<!--
-->{{#tag:{{#var:element}}|{{#tag:{{#var:element}}|{{{1|}}}}}|class=spoiler-content {{{class|}}}|id={{{id|}}}|style={{{css|{{{style|}}}}}} }}<!--
-->[[Category:Pages with spoilers]]<!--
--></includeonly><noinclude>
{{doc}}
[[Category:Formatting templates]]
</noinclude>
2da5f6bb4ec1204941f5ba21a2196cd35eccdb23
Template:Spoiler/doc
10
92
114
2025-08-20T01:23:24Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template is used to mark text and other elements as spoilers. Users can click or optionally hover to reveal their content.
== The hoverShowSpoilers gadget ==
Users can enable the <code>[[MediaWiki:Gadgets/hoverShowSpoilers|hoverShowSpoilers]]</code> gadget to make spoilers show on hover, not just on click. The code for this gadget can be found at [[MediaWiki:Gadgets/hoverShowSpoilers/main.css]].
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{spoiler|spoiler text}}</nowiki></code> (Click to toggle) || {{spoiler|spoiler text}}
|-
| <code><nowiki>{{spoiler|spoiler text with a [[Template:Navbox|link]]}}</nowiki></code> (Click to toggle) || {{spoiler|spoiler text with a [[Template:Navbox|link]]}}
|-
| <pre>
{{spoiler|block=y|Really long spoiler that spans multiple lines
It even has a bulleted list inside it:
* Item a
* Item b
* [[Special:Random|Item c]]
}}</pre>
|{{spoiler|block=y|Really long spoiler that spans multiple lines
It even has a bulleted list inside it:
* Item a
* Item b
* [[Special:Random|Item c]]
}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The <code>spoilers</code> gadget with JavaScript code for toggling the <code>.spoiler</code> class on/off on click:
** [[MediaWiki:Gadgets/spoilers]]
** [[MediaWiki:Gadgets/spoilers/main.js]]
* The <code>.spoiler-content</code> and any related classes, found in [[MediaWiki:Common.css]].
== Source ==
Base code adapted from [[wgg:terraria:Template:Spoiler|Template:Spoiler on Terraria Wiki]].
==TemplateData==
<templatedata>
{
"params": {
"1": {
"aliases": [
"text"
],
"label": "Text",
"description": "The text to be shown.",
"example": "Character A died during the battle.",
"type": "content",
"required": true
},
"hover": {
"label": "Show on Hover?",
"description": "Show spoiler text on mouse hover.",
"example": "hover=yes",
"type": "boolean",
"default": "hover=no"
},
"block": {
"label": "Display as block?",
"description": "If given, display the spoiler as a block instead of inline. Useful for long spoilers spanning multiple lines or using block-level elements like lists.",
"example": "y",
"type": "boolean",
"suggested": true
},
"class": {
"label": "Class",
"description": "A class or classes to apply to the spoiler",
"type": "string"
},
"id": {
"label": "ID",
"description": "A CSS ID to apply to the spoiler.",
"type": "string"
},
"style": {
"description": "Inline CSS styles to pass in.",
"type": "string",
"aliases": [
"css"
],
"label": "Style"
}
},
"description": "This template can be used to mark text as a spoiler.",
"maps": {
"1": {}
},
"paramOrder": [
"1",
"hover",
"block",
"class",
"id",
"style"
],
"format": "inline"
}
</templatedata>
<noinclude>[[Category:Template documentation]]</noinclude>
bae231a84e57129ec12ba47e554ed42e76c185e0
Template:Link icon
10
93
115
2025-08-20T01:23:24Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{#vardefine:target|{{{1|}}}<!-- end vd -->}}<!--
-->{{#vardefine:display|{{#if:{{{2|}}}|{{{2}}}|{{{1}}}<!-- end if -->}}<!-- end vd -->}}<!--
-->{{#vardefine:iconSize|1.2em}}<!--
-->{{#vardefine:lineHeight|1lh}}<!--
-->{{#vardefine:fileExists|{{filepath:{{#var:target}} ({{{type}}}).png}}}}<!--
-->{{#ifeq: {{{2|}}} | notext <!-- start if notext
-->|<span class="link-icon notext" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start notext icon element
-->{{#if: {{#var:fileExists}} <!-- start icon if
-->| <span class="regular">[[File:{{#var:target}} ({{{type}}}).png|link={{#var:target}}|alt=]]</span><!-- end regular icon
-->| <span class="fallback">[[File:{{{1}}} ({{{type}}}).png|?]]</span><!-- end fallback icon (?)
-->}}<!-- end icon if
--></span><!-- end notext icon
-->|<span class="link-icon" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start icon + text element
-->{{#if: {{#var:fileExists}} <!-- start icon if
-->| <span class="regular">[[File:{{#var:target}} ({{{type}}}).png|link={{#var:target}}|alt=]]</span><!-- end regular icon
-->| <span class="fallback">[[File:{{{1}}} ({{{type}}}).png|?]]</span><!-- end fallback icon (?)
-->}} <!-- end icon if
--><span class="display-text">[[{{#var:target}}|{{#var:display}}]]</span><!-- end display text
--></span> <!-- end icon + text element
-->}}<!-- end if notext
--></includeonly><noinclude>{{Documentation}}[[Category:Formatting templates]]</noinclude>
a8fc86aa3dc0f0085e5d1236a47e8d04e8685684
Template:Link icon/doc
10
94
116
2025-08-20T01:23:25Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{No direct use}}
== List of link icon templates ==
* {{tl|Character icon}}
* {{tl|Item icon}}
== Dependencies==
For this template to work properly, you need the following:
* The <code>.link-icon</code> class and any related classes, found in [[MediaWiki:Common.css]].
<noinclude>[[Category:Template documentation]]</noinclude>
654dfb540ea31a810ef53c3820862942e63b2e8a
Template:I
10
95
117
2025-08-20T01:23:25Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Link icon]]
6ebdedb4de95efaa3e6ca27590e79aca674f2364
Template:Quote
10
96
118
2025-08-20T01:23:26Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
--><div class="quote"><!-- start quote wrapper
--><div class="marks-wrapper"><!-- start marks wrapper
--><div class="block"><!-- start quote block
-->{{#if:{{{title|}}}|<div class="title">{{{title}}}</div>|}}<!--
-->{{#if:{{{text|{{{1|}}}}}}|<div class="text">{{{text|{{{1|}}}}}}</div>|}}<!--
--></div><!-- end quote block
--></div><!-- end marks wrapper
-->{{#if:{{{author|{{{2|}}}}}}|<div class="author">― {{#if:{{{authorpage|}}}| [[{{{authorpage}}}|{{{author|{{{2|}}}}}}]] | {{{author|{{{2|}}}}}} }}</div>|}}<!--
--></div><!--
-->[[Category:Pages with quotes]]</includeonly><noinclude>{{Documentation}}[[Category:Formatting templates]]</noinclude>
095258ceee92819a4e7b83c26fba3761bf9c41a9
Template:Item icon
10
97
119
2025-08-20T01:23:26Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Link icon|{{{1|}}}|{{{2|}}}|type=Item}}</includeonly><noinclude>{{documentation}}[[Category:Formatting templates]]</noinclude>
6564279e3808e659b8034ad4b96f4f9e9e498b57
Template:Item icon/doc
10
98
120
2025-08-20T01:23:27Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
== Summary ==
<templatedata>
{
"params": {
"1": {
"aliases": [
"page"
],
"label": "Page Name",
"description": "The name for the target page.",
"example": "Page Name",
"type": "wiki-page-name",
"required": true
},
"2": {
"aliases": [
"label"
],
"label": "Link Label",
"description": "The text to the be displayed on the link icon's label.",
"example": "Alternative Page Name",
"type": "line"
}
},
"description": "Use this template to display an icon next to a page link.\n\nThis template assumes that each page has an icon uploaded at a specific location, namely \"File:Page Name (Item).png\".",
"format": "inline"
}
</templatedata>
== Examples ==
For the examples below, <code><nowiki>File:Mystic Feather (Item).png</nowiki></code> was used as the icon for a page called <code>Mystic Feather</code>.
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Item icon|Mystic Feather}}</nowiki></code> || {{Item icon|Mystic Feather}}
|-
| <code><nowiki>{{Item icon|Mystic Feather|Mystic Feathers}}</nowiki></code> || {{Item icon|Mystic Feather|Mystic Feathers}}
|-
| <code><nowiki>{{Item icon|Mystic Feather|notext}}</nowiki></code> || {{Item icon|Mystic Feather|notext}}
|-
| <code><nowiki>{{Item icon|Missing Item}}</nowiki></code> (Missing Page Icon) || {{Item icon|Missing Item}}
|}
== Dependencies==
For this template to work properly, you need the following:
* The base {{tl|Link icon}} template.
* The <code>.link-icon</code> class and any related classes, found in [[MediaWiki:Common.css]].
4dfcab6f3d3c88596068607685645f29666f0141
Template:Character icon
10
99
121
2025-08-20T01:23:28Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Link icon|{{{1|}}}|{{{2|}}}|type=Character}}</includeonly><noinclude>{{documentation}}[[Category:Formatting templates]]</noinclude>
24bad84fd5dea93cab210dfd592fda86af09eb87
Template:Character icon/doc
10
100
122
2025-08-20T01:23:28Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
== Summary ==
<templatedata>
{
"params": {
"1": {
"aliases": [
"page"
],
"label": "Page Name",
"description": "The name for the target page.",
"example": "Page Name",
"type": "wiki-page-name",
"required": true
},
"2": {
"aliases": [
"label"
],
"label": "Link Label",
"description": "The text to the be displayed on the link icon's label.",
"example": "Alternative Page Name",
"type": "line"
}
},
"description": "Use this template to display an icon next to a page link.\n\nThis template assumes that each page has an icon uploaded at a specific location, namely \"File:Page Name (Character).png\".",
"format": "inline"
}
</templatedata>
== Examples ==
For the examples below, <code><nowiki>File:Invisible Boy (Character).png</nowiki></code> was used as the icon for a page called <code>Invisible Boy</code>.
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Character icon|Invisible Boy}}</nowiki></code> || {{Character icon|Invisible Boy}}
|-
| <code><nowiki>{{Character icon|Invisible Boy|The Invisible Boy}}</nowiki></code> || {{Character icon|Invisible Boy|The Invisible Boy}}
|-
| <code><nowiki>{{Character icon|Invisible Boy|notext}}</nowiki></code> || {{Character icon|Invisible Boy|notext}}
|-
| <code><nowiki>{{Character icon|Missing Boy}}</nowiki></code> (Missing Page Icon) || {{Character icon|Missing Boy}}
|}
== Dependencies==
For this template to work properly, you need the following:
* The base {{tl|Link icon}} template.
* The <code>.link-icon</code> class and any related classes, found in [[MediaWiki:Common.css]].
0999a706143c16f5ed970816e7825239cfce9547
Template:Quote/doc
10
101
123
2025-08-20T01:23:29Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <pre>{{Quote|text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre>
| {{Quote|text=Now is the winter of our discontent made glorious summer by this sun of York}}
|-
| <pre>{{Quote
|title=Opening lines of ''Richard III''
|text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre>
| {{Quote
|title=Opening lines of ''Richard III''
|text=Now is the winter of our discontent made glorious summer by this sun of York}}
|-
| <pre>{{Quote
|title=Opening lines of ''Richard III''
|author=William Shakespeare
|text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre>
| {{Quote
|title=Opening lines of ''Richard III''
|author=William Shakespeare
|text=Now is the winter of our discontent made glorious summer by this sun of York}}
|-
| <pre>{{Quote
|title=Opening lines of ''Richard III''
|author=William Shakespeare
|authorpage=wikipedia:William Shakespeare
|text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre>
| {{Quote
|title=Opening lines of ''Richard III''
|author=William Shakespeare
|authorpage=wikipedia:William Shakespeare
|text=Now is the winter of our discontent made glorious summer by this sun of York}}
|-
| <pre>{{Quote
|author=William Shakespeare
|authorpage=wikipedia:William Shakespeare
|text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre>
| {{Quote
|author=William Shakespeare
|authorpage=wikipedia:William Shakespeare
|text=Now is the winter of our discontent made glorious summer by this sun of York}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The <code>.quote</code> and any related classes, found in [[MediaWiki:Common.css]].
<noinclude>[[Category:Template documentation]]</noinclude>
== Template data (for Visual Editor) ==
<templatedata>
{
"params": {
"title": {
"label": "Title",
"description": "If the quote has a title, put it here.",
"example": "Richard III's soliloquy",
"type": "line"
},
"text": {
"label": "Quoted Text",
"description": "The quoted text to be displayed.",
"example": "Now is the winter of our discontent made glorious summer by this sun of York",
"type": "string",
"required": true
},
"author": {
"label": "Quote's Author",
"description": "The author of the displayed quote.",
"example": "William Shakespeare",
"type": "line",
"suggested": true
},
"authorpage": {
"label": "Author's Page",
"description": "If the quote's author has a page on the Wiki, put the page name here.",
"example": "William Shakespeare (playwright)",
"type": "wiki-page-name",
"suggested": true
}
},
"description": "This template creates a styled block element for quotes.",
"paramOrder": [
"text",
"author",
"authorpage",
"title"
],
"format": "block"
}
</templatedata>
8a10e77de70ff704435282ce0f2ba792a13404a5
Template:Hatnote
10
102
124
2025-08-20T01:23:29Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->[[Category:Pages with hatnotes]]<!--
--><div class="hatnote {{#if:{{{icon|}}}|icon}} noexcerpt">{{#if:{{{icon|}}}|[[File:{{{icon}}}|x22px]]<nowiki> </nowiki>}}{{{1|}}}</div><!--
--></includeonly><!--
--><noinclude>{{doc}}[[Category:Hatnote templates| ]]</noinclude>
7d46b899835bfd29a8fbee088499bc7a6acb2587
Template:Hatnote/doc
10
103
125
2025-08-20T01:23:30Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{No direct use}}
== List of hatnote templates ==
* {{tl|Disambiguation}}
* {{tl|Distinguish}}
* {{tl|For}}
* {{tl|Main}}
== Dependencies ==
For this template to work properly, you need the following:
* The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]].
* The <code>--wiki-content-border-color--secondary</code> CSS variable, defined in [[MediaWiki:Common.css]].
<noinclude>[[Category:Template documentation]]</noinclude>
464f2f866befaf4cfa47f68ab0ad4f170c13463d
Template:Disambiguation (wiki.gg)/doc
10
104
126
2025-08-20T01:23:31Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<templatedata>
{
"params": {
"1": {
"label": "Disambiguation Page",
"description": "A custom disambiguation page name.",
"example": "Disambiguation Page",
"type": "wiki-page-name"
},
"2": {
"label": "Link Label",
"description": "A label for the custom disambiguation page.",
"example": "Alternative Page Name",
"type": "line"
},
"topic": {
"label": "Custom Topic",
"description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic",
"example": "a custom topic",
"default": "{{PAGENAME}}",
"type": "line"
}
},
"description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.",
"paramOrder": [
"1",
"2",
"topic"
],
"format": "inline"
}
</templatedata>
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Disambiguation}}</nowiki></code> || {{Disambiguation|topic=Example}}
|-
| <code><nowiki>{{Disambiguation|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation|Special:Random|topic=Example}}
|-
| <code><nowiki>{{Disambiguation|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation|Special:Random|Page Label|topic=this particular topic}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The {{tl|Hatnote}} base template.
* The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]].
== Source ==
Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]].
<noinclude>[[Category:Template documentation]]</noinclude>
5fce9c689120c57454571ff0e60a2cd447df5713
Template:Disambiguation (wiki.gg)
10
105
127
2025-08-20T01:23:31Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:topic|<!-- start vd
-->{{#if:{{{topic|}}} | {{{topic}}} | {{PAGENAME}} }}<!-- end if
-->}}<!-- end vd
-->{{#vardefine:disambig|<!-- start vd
-->{{#if:{{{1|}}}<!-- start custom disambig if
-->|{{{1}}}<!-- start label if -->{{#if:{{{2|}}} | {{!}}{{{2}}} }}<!-- end label if
-->|{{#var:topic}} (disambiguation)<!-- else; use regular disambig
-->}}<!-- end custom disambig if
-->}}<!-- end vd
-->{{Hatnote|<!--
-->This page is about '''{{#var:topic}}'''. For other uses, see [[{{#var:disambig}}]].<!--
-->|icon=Disambig.svg<!--
-->}}<!--
--></includeonly><!--
--><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude>
c4c62e7a1876492eb970ea182cf4ac0bcad97913
Template:Distinguish
10
106
128
2025-08-20T01:23:32Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:text|<!-- start vd
-->{{#if:{{{text|}}} | {{{text}}} |<!-- start top if
-->{{#if:{{{2|}}}<!-- if more than one page
-->|[[{{{1}}}]]{{#if:{{{3|}}}<!-- start concat if
-->|, [[{{{2}}}]] or [[{{{3}}}]]<!-- concat two
-->|<nowiki> </nowiki>or [[{{{2}}}]]<!-- else; concat one
-->}}<!-- end concat if
-->|[[{{{1}}}]]<!-- else; one page only
-->}}<!-- end custom disambig if
-->}}<!-- end if
-->}}<!-- end vd
-->{{Hatnote|<!--
-->Not to be confused with {{#var:text}}.<!--
-->}}<!--
--></includeonly><!--
--><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude>
67ae5406ffd29bec56cfe7ad6527bb09a9733496
Template:Distinguish/doc
10
107
129
2025-08-20T01:23:32Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<templatedata>
{
"params": {
"1": {
"label": "Alternative",
"description": "The alternative page.",
"example": "Alternative Page",
"type": "wiki-page-name",
"suggested": true
},
"2": {
"label": "Second Alternative",
"description": "A second alternative page.",
"example": "Second Alternative Page",
"type": "wiki-page-name"
},
"3": {
"label": "Third Alternative",
"description": "A third alternative page.",
"example": "Third Alternative Page",
"type": "wiki-page-name"
},
"text": {
"label": "Alternative Text",
"description": "Instead of using pages, you can provide a full alternative text. This parameter overrides other provided parameters.",
"example": "the alternative page, [[Alternative Page]]",
"type": "line"
}
},
"description": "This hatnote template is meant to be used to indicate possible alternatives to what the reader wants to find.",
"paramOrder": [
"1",
"2",
"3",
"text"
],
"format": "inline"
}
</templatedata>
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Distinguish|Special:Uncategorizedpages}}</nowiki></code> || {{Distinguish|Special:Uncategorizedpages}}
|-
| <code><nowiki>{{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles}}</nowiki></code> || {{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles}}
|-
| <code><nowiki>{{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles|Special:Uncategorizedcategories}}</nowiki></code> || {{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles|Special:Uncategorizedcategories}}
|-
| <code><nowiki>{{Distinguish|Special:Uncategorizedpages{{!}}Page 1}}</nowiki></code> (Custom link label) || {{Distinguish|Special:Uncategorizedpages{{!}}Page 1}}
|-
| <code><nowiki>{{Distinguish|text = Page 1, another name for [[Special:Uncategorizedpages]]}}</nowiki></code> || {{Distinguish|text = Page 1, another name for [[Special:Uncategorizedpages]]}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The {{tl|Hatnote}} base template.
* The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]].
== Source ==
Roughly based on [[wikipedia:Template:Distinguish|Wikipedia's Distinguish Template]].
<noinclude>[[Category:Template documentation]]</noinclude>
2a06ed576ae6479add20834628f9378c657cb4fb
Template:For
10
108
130
2025-08-20T01:23:33Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:text|<!-- start vd
-->{{#if:{{{3|}}}<!-- if more than one page
-->|[[{{{2}}}]]{{#if:{{{4|}}}<!-- start concat if
-->|, [[{{{3}}}]] and [[{{{4}}}]]<!-- concat two
-->|<nowiki> </nowiki>and [[{{{3}}}]]<!-- else; concat one
-->}}<!-- end concat if
-->|[[{{{2}}}]]<!-- else; one page only
-->}}<!-- end if
-->}}<!-- end vd
-->{{Hatnote|<!--
-->For {{{1}}}, see {{#var:text}}.<!--
-->}}<!--
--></includeonly><!--
--><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude>
1899e48855153617f7c0bf3087b781bc80f0395c
Template:For/doc
10
109
131
2025-08-20T01:23:34Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<templatedata>
{
"params": {
"1": {
"label": "Topic",
"description": "The topic the following pages are about.",
"example": "more information",
"type": "line",
"required": true
},
"2": {
"label": "Related Page",
"description": "A related page.",
"example": "Related Page",
"type": "wiki-page-name",
"required": true
},
"3": {
"label": "Second Page",
"description": "A second related page.",
"example": "Second Related Page",
"type": "wiki-page-name"
},
"4": {
"label": "Third Page",
"description": "A third related page.",
"example": "Third Related Page",
"type": "wiki-page-name"
}
},
"description": "This hatnote template is meant to be used to show pages related to a topic the reader might want to visit.",
"paramOrder": [
"1",
"2",
"3",
"4"
],
"format": "inline"
}
</templatedata>
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{For|more information|Special:WantedPages}}</nowiki></code> || {{For|more information|Special:WantedPages}}
|-
| <code><nowiki>{{For|more information|Special:WantedPages|Special:UncategorizedPages}}</nowiki></code> || {{For|more information|Special:WantedPages|Special:UncategorizedPages}}
|-
| <code><nowiki>{{For|more information|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}}</nowiki></code> || {{For|more information|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}}
|-
| <code><nowiki>{{For|more information|Special:WantedPages{{!}}Page 1}}</nowiki></code> (Custom link label) || {{For|more information|Special:WantedPages{{!}}Page 1}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The {{tl|Hatnote}} base template.
* The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]].
== Source ==
Roughly based on [[wikipedia:Template:For|Wikipedia's For Template]].
<noinclude>[[Category:Template documentation]]</noinclude>
b2a30a9bf8acff259d5e86654a2de69c2d5e4fff
Template:Main
10
110
132
2025-08-20T01:23:34Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:text|<!-- start vd
-->{{#if:{{{2|}}}<!-- if more than one page
-->|[[{{{1}}}]]{{#if:{{{3|}}}<!-- start concat if
-->|, [[{{{2}}}]] and [[{{{3}}}]]<!-- concat two
-->|<nowiki> </nowiki>and [[{{{2}}}]]<!-- else; concat one
-->}}<!-- end concat if
-->|[[{{{1}}}]]<!-- else; one page only
-->}}<!-- end if
-->}}<!-- end vd
-->{{Hatnote|<!--
-->{{#if:{{{2|}}}|Main articles|Main article}}: {{#var:text}}<!--
-->}}<!--
--></includeonly><!--
--><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude>
e02ac04db1bbce6b71a9aa8a5064182f662d8470
Template:Main/doc
10
111
133
2025-08-20T01:23:35Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<templatedata>
{
"params": {
"1": {
"label": "Article",
"description": "A main article.",
"example": "Article",
"type": "wiki-page-name",
"required": true
},
"2": {
"label": "Second Article",
"description": "A second main article.",
"example": "Second Article",
"type": "wiki-page-name"
},
"3": {
"label": "Third Article",
"description": "A third main article.",
"example": "Third Article",
"type": "wiki-page-name"
}
},
"description": "This hatnote template is meant to be in sections of an article mentioning information about another existing main article.",
"paramOrder": [
"1",
"2",
"3"
],
"format": "inline"
}
</templatedata>
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Main|Special:WantedPages}}</nowiki></code> || {{Main|Special:WantedPages}}
|-
| <code><nowiki>{{Main|Special:WantedPages#Section Title}}</nowiki></code> || {{Main|Special:WantedPages#Section Title}}
|-
| <code><nowiki>{{Main|Special:WantedPages|Special:UncategorizedPages}}</nowiki></code> || {{Main|Special:WantedPages|Special:UncategorizedPages}}
|-
| <code><nowiki>{{Main|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}}</nowiki></code> || {{Main|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}}
|-
| <code><nowiki>{{Main|Special:WantedPages{{!}}Page 1}}</nowiki></code> (Custom link label) || {{Main|Special:WantedPages{{!}}Page 1}}
|}
== Dependencies ==
This template requires the {{tl|Hatnote}} metatemplate.
== Source ==
Roughly based on [[wikipedia:Template:For|Wikipedia's For Template]].
<noinclude>[[Category:Template documentation]]</noinclude>
dd762adeece0f944821cb81ee14a8bd9cb539b22
Template:Ambox/doc
10
112
134
2025-08-20T01:23:35Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{#ifeq:{{ROOTPAGENAME}}|Ambox|"Ambox" is an abbreviation for '''A'''rticle '''m'''essage '''box'''. You can use amboxes in articles to indicate something important about the current page, often in the header.|
This '''message template''' is an [[Template:Ambox|article message box]], or '''ambox'''. The documentation below discusses how to use each ambox provided by the wiki.
}}
== Premade amboxes ==
=== Problem notice amboxes ===
These amboxes are used temporarily to notify other editors and visitors about a problem with an article. These amboxes support the following parameters:
* <code>|tiny=</code>: If set to <code>yes</code>, the box will have less padding and the icon will be much smaller than default.
* <code>|class=</code>: Any additional CSS classes to add to the ambox container element.
* <code>|date=</code>: The date the ambox was added to the page.
* <code>|nocat=</code>: If set to <code>yes</code>, no category will be added to the page. Use this only when creating documentation.
'''Note:''' Premade amboxes need the base {{tl|Ambox}} template to work.
{| class="wikitable"
! Code !! Result
|-
| {{tl|Cleanup}} || {{Cleanup|nocat=yes}}
|-
| {{tl|Delete}} || {{Delete|nocat=yes}}
|-
| {{tl|Merge|Example}} || {{Merge|Template:Ambox{{!}}Example|nocat=yes}}
|-
| {{tl|Move|Example}} || {{Move|Template:Ambox{{!}}Example|nocat=yes}}
|-
| {{tl|Split|Example}}<br/>{{tl|Split|Example 1|Example 2|Example 3}} || {{Split|Template:Ambox{{!}}Example|nocat=yes}}
{{Split|Template:Ambox{{!}}Example 1|Template:Ambox{{!}}Example 2|Template:Ambox{{!}}Example 3|nocat=yes}}
|-
| {{tl|Stub}} || {{Stub|nocat=yes}}
|-
|}
=== Informational amboxes ===
These amboxes are intended as permanent fixtures to a page, to notify visitors about some piece of information relevant to the page. These amboxes support the following parameters in addition to any listed:
* <code>|tiny=</code>: If set to <code>yes</code>, the box will have less padding and the icon will be much smaller than default.
* <code>|class=</code>: Any additional CSS classes to add to the ambox container element.
{| class="wikitable"
! Code !! Additional parameters !! Result
|-
| {{tl|Spoiler warning}} || || {{Spoiler warning|nocat=yes}}
|-
| {{tl|No direct use}} || || {{No direct use|nocat=yes}}
|-
| {{tl|Uses Lua}} || <code><nowiki>|1=</nowiki></code>, a comma-separated list of modules used || {{Uses Lua|nocat=yes}}
|}
=== Optional parameters ===
You can use optional parameters to further customize a premade ambox. The example below is using <code>tiny=yes</code> and <code>date=01/01/2021</code>.
{{Cleanup|tiny=yes|date=01/01/2021|nocat=yes}}
== Creating a custom ambox ==
You can create additional ambox templates as needed using the following parameters:
<pre>
{{Ambox
| color = The left border color.
| icon = The icon image to be displayed.
| title = The optional title.
| message = The explanation text displayed.
| tiny = If you want the tiny version of the ambox, fill the parameter with "yes".
| date = An optional date of creation for the message.
| class = An optional CSS class for the ambox.
}}
</pre>
== Dependencies ==
For this template to work properly, you need the following:
* <code>.ambox</code> and any related classes, found in [[MediaWiki:Common.css]].
<includeonly>[[Category:Notice templates]]</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
d4fda481c06177d59ff39364bf17e15d7f1adfbc
Template:Cleanup
10
113
135
2025-08-20T01:23:36Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = gold
| icon = Cleanup.svg
| message = This page does not meet '''{{SITENAME}}'''<nowiki/>'s page quality standards. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit it] to help fix grammar, formatting, or code issues.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Pages in need of improvement]]}}</includeonly><!--
--><noinclude>{{Cleanup|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
9c9fb940d733227f74a7ce12720d22f569bd4d3e
Template:Delete
10
114
136
2025-08-20T01:23:37Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = grey
| icon = Delete.svg
| title = Candidate for Deletion
| message = This page lacks relevance for '''{{SITENAME}}''' and is a candidate for '''deletion'''.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for deletion]]}}</includeonly><!--
--><noinclude>{{Delete|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
6c827de94518d7f5f1635b13425be0d0fb4078da
Template:No direct use
10
115
137
2025-08-20T01:23:37Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{ambox|icon=Warning-red.svg|title=Don't call this template directly from any content page!
|message=This template is intended to be used inside of another template. Then that template in turn may be used on content pages.
|color=red
|tiny={{{tiny|}}}
|class={{{class|}}}
}}</includeonly><noinclude>{{doc|Template:Ambox/doc}}
[[Category:Notice templates]]</noinclude>
22c9c1b0d6c05220eb6d7ad84073f7d878b60b68
Template:UsesLua
10
116
138
2025-08-20T01:23:38Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Uses Lua]]
9675a92267565619bc6418ec4e88163985302408
Template:Cleanup/doc
10
117
139
2025-08-20T01:23:39Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Ambox/doc]]
286a3914c1d2770ff27394ac3d3f36a685542cb8
Template:Delete/doc
10
118
140
2025-08-20T01:23:40Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Ambox/doc]]
286a3914c1d2770ff27394ac3d3f36a685542cb8
Template:Spoiler warning
10
119
141
2025-08-20T01:23:40Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Ambox
| color = red
| icon = Warning-red.svg
| title = Spoiler Warning
| message = This page contains '''spoilers'''. View at your own discretion.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
}}<noinclude>{{doc|Template:Ambox/doc}}</noinclude>
d46344bae30adce89ead1cf12e8c3ff904e95203
Template:Spoiler warning/doc
10
120
142
2025-08-20T01:23:41Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Ambox/doc]]
286a3914c1d2770ff27394ac3d3f36a685542cb8
Template:Uses Lua/doc
10
121
143
2025-08-20T01:23:42Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Ambox/doc]]
286a3914c1d2770ff27394ac3d3f36a685542cb8
Template:Stub
10
122
144
2025-08-20T01:23:42Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = gold
| icon = Stub.svg
| message = This page is a [[support:Stub|stub]]. You can help '''{{SITENAME}}''' by [{{fullurl:{{FULLPAGENAME}}|action=edit}} expanding it].
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Stubs]]}}</includeonly><!--
--><noinclude>{{Stub|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
1effeb7d6eb04a0b11c76b8bfa871703461c9344
Template:Stub/doc
10
123
145
2025-08-20T01:23:43Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:Ambox/doc]]
68bfb03f8f28c95443c7b1997f252c236bf87256
Template:NoDirectUse
10
124
146
2025-08-20T01:23:43Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:No direct use]]
8448af1f61f0d64a84806b006c70670d9296acde
Template:No direct use/doc
10
125
147
2025-08-20T01:23:44Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:Ambox/doc]]
68bfb03f8f28c95443c7b1997f252c236bf87256
Template:Merge
10
126
148
2025-08-20T01:23:44Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = purple
| icon = Merge.svg
| message = It has been proposed that this page be [[support:Merge|merged]] with [[{{{1}}}]].
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for merging]]}}</includeonly><!--
--><noinclude>{{Merge|Template:Merge|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
9975c110e793cc1943eac9ea8e62257d704ab853
Template:Merge/doc
10
127
149
2025-08-20T01:23:45Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Ambox/doc]]
286a3914c1d2770ff27394ac3d3f36a685542cb8
Template:Move
10
128
150
2025-08-20T01:23:46Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = darkorange
| icon = Move.svg
| message = It has been proposed that this page be moved to [[{{{1}}}]].
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for moving]]}}</includeonly><!--
--><noinclude>{{Move|Template:Ambox{{!}}Example|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
dc4fd9090208e453457d6d2df193b9a7ee3b562d
Template:Move/doc
10
129
151
2025-08-20T01:23:47Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Ambox/doc]]
286a3914c1d2770ff27394ac3d3f36a685542cb8
Template:Split
10
130
152
2025-08-20T01:23:47Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:pages|<!-- start vd
-->{{#if:{{{2|}}}<!-- if more than one page
-->|new pages titled [[{{{1}}}]]{{#if:{{{3|}}}<!-- start concat if
-->|, [[{{{2}}}]] and [[{{{3}}}]]<!-- concat two
-->|<nowiki> </nowiki>and [[{{{2}}}]]<!-- else; concat one
-->}}<!-- end concat if
-->|a new page titled [[{{{1}}}]]<!-- else; one page only
-->}}<!-- end if
-->}}<!-- end vd
-->{{Ambox
| color = purple
| icon = Split.svg
| message = It has been proposed that this page be split into {{#var:pages}}.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for splitting]]}}</includeonly><!--
--><noinclude>{{Split|Template:Ambox{{!}}Example|nocat=yes}}
{{Split|Template:Ambox{{!}}Example 1|Template:Ambox{{!}}Example 2|Template:Ambox{{!}}Example 3|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
73f5044c8b972e18c3b7880f94b0644e4a0e6ac7
Template:Split/doc
10
131
153
2025-08-20T01:23:48Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Ambox/doc]]
286a3914c1d2770ff27394ac3d3f36a685542cb8
Template:Anchor
10
132
154
2025-08-20T01:23:48Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
--><span id="{{{1}}}"></span><!--
--></includeonly><!--
--><noinclude>{{doc}}
[[Category:Navigation templates]]</noinclude>
08ccba46722925866447768d344bf540b0b55e79
Template:Anchor/doc
10
133
155
2025-08-20T01:23:49Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
== Summary ==
This template can be used to insert an invisible anchor (reference points) into a page that can later be used by internal wiki links.
== Usage ==
To create a custom anchor, use <code><nowiki>{{Anchor|Anchor Name}}</nowiki></code> anywhere in the page.
For example, if you create the anchor <code><nowiki>{{Anchor|Example Anchor}}</nowiki></code> in the page <code><nowiki>[[Example]]</nowiki></code>, you can access it through the internal link <code><nowiki>[[Example#Example Anchor]]</nowiki></code>.
Remember that you can create a [[support:Redirect|redirect]] to this template so that you can call it more easily, such as with <code><nowiki>{{a|Anchor Name}}</nowiki></code>.
<noinclude>[[Category:Template documentation]]</noinclude>
4b0ddb50416a354db262e62617d9b45056f4d526
Template:Key/doc/Xbox
10
134
156
2025-08-20T01:23:50Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
Images source: [[dev:Category:Xbox input images]]
=== Series & One ===
<code><nowiki>{{Key|Xbox|A}}</nowiki></code>
{{Key|Xbox|A}}
<code><nowiki>{{Key|Xbox|B}}</nowiki></code>
{{Key|Xbox|B}}
<code><nowiki>{{Key|Xbox|X}}</nowiki></code>
{{Key|Xbox|X}}
<code><nowiki>{{Key|Xbox|Y}}</nowiki></code>
{{Key|Xbox|y}}
<code><nowiki>{{Key|Xbox|Left Thumbstick}}</nowiki></code>
{{Key|Xbox|Left Thumbstick}}
<code><nowiki>{{Key|Xbox|Right Thumbstick}}</nowiki></code>
{{Key|Xbox|Right Thumbstick}}
<code><nowiki>{{Key|Xbox|Left Thumbstick Press}}</nowiki></code>
{{Key|Xbox|Left Thumbstick Press}}
<code><nowiki>{{Key|Xbox|Right Thumbstick Press}}</nowiki></code>
{{Key|Xbox|Right Thumbstick Press}}
<code><nowiki>{{Key|Xbox|LB}}</nowiki></code>
{{Key|Xbox|LB}}
<code><nowiki>{{Key|Xbox|RB}}</nowiki></code>
{{Key|Xbox|RB}}
<code><nowiki>{{Key|Xbox|View}}</nowiki></code>
{{Key|Xbox|View}}
<code><nowiki>{{Key|Xbox|Menu}}</nowiki></code>
{{Key|Xbox|Menu}}
<code><nowiki>{{Key|Xbox|Button}}</nowiki></code>
{{Key|Xbox|Button}}
=== Xbox Series ===
<code><nowiki>{{Key|Xbox|D-pad}}</nowiki></code>
{{Key|Xbox|D-pad}}
<code><nowiki>{{Key|Xbox|D-pad Left}}</nowiki></code>
{{Key|Xbox|D-pad Left}}
<code><nowiki>{{Key|Xbox|D-pad Right}}</nowiki></code>
{{Key|Xbox|D-pad Right}}
<code><nowiki>{{Key|Xbox|D-pad Up}}</nowiki></code>
{{Key|Xbox|D-pad Up}}
<code><nowiki>{{Key|Xbox|D-pad Down}}</nowiki></code>
{{Key|Xbox|D-pad Down}}
<code><nowiki>{{Key|Xbox|LT}}</nowiki></code>
{{Key|Xbox|LT}}
<code><nowiki>{{Key|Xbox|RT}}</nowiki></code>
{{Key|Xbox|RT}}
<code><nowiki>{{Key|Xbox|Share}}</nowiki></code>
{{Key|Xbox|Share}}
==== Diagram ====
<code><nowiki>{{Key|Xbox|Series Controller Diagram}}</nowiki></code>
{{Key|Xbox|Series Controller Diagram}}
=== Xbox One ===
<code><nowiki>{{Key|Xbox|One D-pad}}</nowiki></code>
{{Key|Xbox|D-pad}}
<code><nowiki>{{Key|Xbox|One D-pad Left}}</nowiki></code>
{{Key|Xbox|D-pad Left}}
<code><nowiki>{{Key|Xbox|One D-pad Right}}</nowiki></code>
{{Key|Xbox|D-pad Right}}
<code><nowiki>{{Key|Xbox|One D-pad Up}}</nowiki></code>
{{Key|Xbox|D-pad Up}}
<code><nowiki>{{Key|Xbox|One D-pad Down}}</nowiki></code>
{{Key|Xbox|D-pad Down}}
<code><nowiki>{{Key|Xbox|One Left Trigger}}</nowiki></code>
{{Key|Xbox|One Left Trigger}}
<code><nowiki>{{Key|Xbox|One Right Trigger}}</nowiki></code>
{{Key|Xbox|One Right Trigger}}
==== Diagram ====
<code><nowiki>{{Key|Xbox|One Controller Diagram}}</nowiki></code>
{{Key|Xbox|One Controller Diagram}}
__NOTOC__
<noinclude>[[Category:Key template documentation]]</noinclude>
adce81e2e9eafcf930052a8993d3e5625665202e
Template:Key/doc/DualSense
10
135
157
2025-08-20T01:23:50Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
Images source: [[dev:Category:DualSense input images]]
=== Buttons ===
<code><nowiki>{{Key|PS|Directional}}</nowiki></code>
{{Key|PS|Directional}}
<code><nowiki>{{Key|PS|Directional Left}}</nowiki></code>
{{Key|PS|Directional Left}}
<code><nowiki>{{Key|PS|Directional Right}}</nowiki></code>
{{Key|PS|Directional Right}}
<code><nowiki>{{Key|PS|Directional Up}}</nowiki></code>
{{Key|PS|Directional Up}}
<code><nowiki>{{Key|PS|Directional Down}}</nowiki></code>
{{Key|PS|Directional Down}}
<code><nowiki>{{Key|PS|Left Stick}}</nowiki></code>
{{Key|PS|Left Stick}}
<code><nowiki>{{Key|PS|Right Stick}}</nowiki></code>
{{Key|PS|Right Stick}}
<code><nowiki>{{Key|PS|Touch Pad}}</nowiki></code>
{{Key|PS|Touch Pad}}
<code><nowiki>{{Key|PS|Circle}}</nowiki></code>
{{Key|PS|Circle}}
<code><nowiki>{{Key|PS|Cross}}</nowiki></code>
{{Key|PS|Cross}}
<code><nowiki>{{Key|PS|Square}}</nowiki></code>
{{Key|PS|Square}}
<code><nowiki>{{Key|PS|Triangle}}</nowiki></code>
{{Key|PS|Triangle}}
<code><nowiki>{{Key|PS|Create}}</nowiki></code>
{{Key|PS|Create}}
<code><nowiki>{{Key|PS|Options}}</nowiki></code>
{{Key|PS|Options}}
<code><nowiki>{{Key|PS|L1}}</nowiki></code>
{{Key|PS|L1}}
<code><nowiki>{{Key|PS|R1}}</nowiki></code>
{{Key|PS|R1}}
<code><nowiki>{{Key|PS|L2}}</nowiki></code>
{{Key|PS|L2}}
<code><nowiki>{{Key|PS|R2}}</nowiki></code>
{{Key|PS|R2}}
<code><nowiki>{{Key|PS|L3}}</nowiki></code>
{{Key|PS|L3}}
<code><nowiki>{{Key|PS|R3}}</nowiki></code>
{{Key|PS|R3}}
<code><nowiki>{{Key|PS|Mute}}</nowiki></code>
{{Key|PS|Mute}}
<code><nowiki>{{Key|PS|PS}}</nowiki></code>
{{Key|PS|PS}}
=== Diagram ===
<code><nowiki>{{Key|PS|Controller Diagram}}</nowiki></code>
{{Key|PS|Controller Diagram}}
<noinclude>[[Category:Key template documentation]]</noinclude>
84fa5123f9494d3572fef65e1aa63dd95ef476be
Template:Gad
10
136
158
2025-08-20T01:23:51Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<code>Gadget-[[MediaWiki:Gadget-{{{1}}}|{{{1}}}]]</code><noinclude>[[Category:Formatting templates]]</noinclude>
dd027468a6022472506b1fc2973d6299ec01e854
Template:From Wikipedia
10
137
159
2025-08-20T01:23:52Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = darkblue
| icon = Wikipedia.svg
| title= This code is adapted from [[wikipedia:Main Page|Wikipedia]].
| message = For the original code, see the following pages: {{#arraymap:{{{1|}}}|,|%s|[[wikipedia:%s|%s]]}}
| tiny = {{{tiny|}}}
| class = {{{class|}}}
}}</includeonly><noinclude>{{doc}}</noinclude>
0bb256ef5acc38fb0cfbdacc22e75aab89bd6e2c
Template:!-!
10
138
160
2025-08-20T01:23:52Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
|-|<noinclude>{{documentation}}</noinclude>
c634369c1e88b95ebe6a6d827cb32dc1e9c61fec
Template:!-!/doc
10
139
161
2025-08-20T01:23:56Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:((/doc]]
509bb731d447456a18489848c8a1ce38feddabcc
Template:Color
10
140
162
2025-08-20T01:23:56Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><span class="color">{{{1}}} <span class="color__splotch" style="background-color: {{{1}}};" title="{{{1}}}"></span></span>[[Category:Pages with colors]]</includeonly><noinclude>
{{doc}}
[[Category:Formatting templates]]
</noinclude>
8d576236ad82770d3c04720d4ac105edcb835874
Template:Color/doc
10
141
163
2025-08-20T01:23:57Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template creates a small color splotch with a given background color next to a plaintext color code. This is useful for previewing colors.
==Usage==
{{tlx|color|<color>}}
Where <code><color></code> is any valid [https://developer.mozilla.org/en-US/docs/Web/CSS/color_value CSS color].
==Examples==
<pre>
My favorite color is {{color|darkgreen}}
I think the current {{color|#6d8afb}} of links should be changed to a {{color|#6df4fb}}
RGB is cool too, you can do {{color|rgb(128,255,128)}}, or even transparency with {{color|rgba(128,255,128,0.5)}}.
</pre>
Produces:
My favorite color is {{color|darkgreen}}
I think the current {{color|#6d8afb}} of links should be changed to a {{color|#6df4fb}}
RGB is cool too, you can do {{color|rgb(128,255,128)}}, or even transparency with {{color|rgba(128,255,128,0.5)}}.
<noinclude>[[Category:Template documentation]]</noinclude>
cb66b177cf785e1b3f60e28e36852b253e4b3d82
Template:Example character infobox
10
142
164
2025-08-20T01:23:57Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
<!-- See https://support.wiki.gg/wiki/DRUID_infoboxes for extra documentation -->
<!-- the "kind" categorizes this type of infobox. For example, you might want to write `Character`, `Level`, or `Item`. -->
<!-- This `kind` value should be unique to this template, and no other infobox template should have the same value -->
|kind=example-1
<!-- You can almost certainly leave the separator alone, unless one of your *section names* has a comma in it -->
|sep=,
<!-- feel free to edit the 300px but mostly try to avoid changing this next line unless you are adding tabs -->
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
<!-- every infobox needs a |sections= parameter, which lists the groups of sections, in order top to bottom -->
|sections=General Info, Stats
<!-- for each section, specify the list of fields that you want to show up in that section, top to bottom -->
<!-- empty fields (not specified on the content page) will not show up -->
|General Info=Region,Element
|Stats=Attack, HP, Armor, Attack Speed
<!-- this field formats the `Attack Speed` parameter when it's specified by the content page, adding a % sign to the end of it. -->
<!-- this is an optional operation to do, only do it if you need to provide some extra formatting -->
|Attack Speed={{#if:{{{Attack Speed|}}}|{{{Attack Speed}}}%}}
}}<!--
Here is the above code without comments for easier copy-pasting:
{{#invoke:Infobox|main
|kind=example-1
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=General Info, Stats
|General Info=Region,Element
|Stats=Attack, HP, Armor, Attack Speed
|Attack Speed={{#if:{{{Attack Speed|}}}|{{{Attack Speed}}}%}}
}}
--></includeonly><noinclude>
{{documentation}}
[[Category:Infobox templates]]</noinclude>
f49d0f82d5a212306ff66b8fee112ecf88123576
Template:Example character infobox/doc
10
143
165
2025-08-20T01:23:58Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<noinclude>Are you trying to edit [[Template:Example character infobox]]? If so, you may be in the wrong place - this is the '''documentation page''', not the template itself. To edit the template, please go here: {{fullurl:Template:Example character infobox|action=edit}}
</noinclude>This is an example character infobox using the [[support:DRUID infoboxes|DRUID infoboxes]] framework. You can edit it, rename it, or delete it as desired.
== Modify this template ==
To see how DRUID works, please '''edit this page'''! It has several comments explaining the different parts of how to make an infobox.
== Copyable code for use on other content pages ==
If you want to create pages using this infobox, you can use the snippet below. Please understand, this code is for CONTENT PAGES ONLY!! It does not have anything to do with changing what the template supports.
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Example character infobox
|title=
|image=
|Region=
|Element=
|Attack=
|HP=
|Armor=
|Attack Speed=
}}
</syntaxhighlight><noinclude>[[Category:Template documentation]]</noinclude>
cc625bd426cde7dbdfa16b8330ff21cd1ef2e942
Template:License/indie.io
10
144
166
2025-08-20T01:23:58Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = developer
| darkIcon = yes
| icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]]
| text = This file is owned by [https://indie.io indie.io] and/or its licensors, and is licensed under the [https://indie.io indie.io] [https://www.indie.io/terms-of-service Terms of Use].<br/>
All trademarks and registered trademarks present in the file are proprietary to [https://indie.io indie.io] and/or its licensors.
}}</includeonly><noinclude>
This template currently looks like: {{License/indie.io}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
49823bdf8d378ff755fa7b6493afde40f6a4e19a
167
166
2025-08-20T01:23:59Z
ARTIFICER
564804
Protected "[[Template:License/indie.io]]" ([Edit=Allow only wiki.gg staff] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = developer
| darkIcon = yes
| icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]]
| text = This file is owned by [https://indie.io indie.io] and/or its licensors, and is licensed under the [https://indie.io indie.io] [https://www.indie.io/terms-of-service Terms of Use].<br/>
All trademarks and registered trademarks present in the file are proprietary to [https://indie.io indie.io] and/or its licensors.
}}</includeonly><noinclude>
This template currently looks like: {{License/indie.io}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
49823bdf8d378ff755fa7b6493afde40f6a4e19a
Template:-
10
145
168
2025-08-20T01:23:59Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:Clear]]
1a2aa4a9ba7478e54a2b21cbce68887ea297ea86
Template:Clear/doc
10
146
169
2025-08-20T01:24:00Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template allows you to [https://developer.mozilla.org/en-US/docs/Web/CSS/clear clear] the left side, the right side, or both by adding <code><div style="clear:left/right/both;"></div></code>
==Usage==
{{tlx|Clear}}: Makes content wait until existing content is completed in all columns. Often used to stop text from flowing next to unrelated images. An optional <code>class</code> parameter can additionally be given for custom functionality.
To clear the left, simply put {{tlx|Clear|left}}. To clear the right, put {{tlx|Clear|right}}. To clear both sides, put {{tlx|Clear}}.
This template can also be called with {{tlx|-}} for short.
<templatedata>
{
"params": {
"1": {
"label": "Direction",
"description": "Which direction to clear",
"type": "string",
"default": "both",
"suggestedvalues": [
"left",
"right",
"both"
]
},
"class": {
"label": "Class",
"description": "A class to give to the clear",
"type": "string"
}
},
"description": "Clears the left, right, or both.",
"format": "inline"
}
</templatedata>
<noinclude>
[[Category:Template documentation]]
</noinclude>
30e700cb1ba6902a86860319bd230680193d3b04
Template:Discord
10
147
170
2025-08-20T01:24:01Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|{{{id|}}}}}}|<!--
-->{{#ifeq: {{lc:{{{full|}}}<!-- -->}} | yes<!--
display the full widget:
-->|<div class="DiscordIntegrator" style="width: {{#or:{{{width|}}}|100%}}; height: {{#or:{{{height|}}}|300px}}"
data-id="{{{1|{{{id}}}}}}"
data-logged-in="{{{loggedIn}}}"
data-theme="{{{theme|}}}"
data-width="100%"
data-height="100%"><!--
-->If you see this, your JavaScript might be disabled or DiscordIntegrator plugin isn't working. If the latter, please contact a wiki administrator.</div><!--
display only the small widget:
-->|<div id="discord-compact-widget" data-id="{{{1|{{{id}}}}}}"></div><!--
-->}}<!--
case: id is not supplied
-->|<strong class="error">DiscordIntegrator error: ID of the server isn't supplied.</strong> For instructions on how to find a Discord server ID, see [https://support.discord.com/hc/articles/206346498 this Discord Help Center article]<!--
-->}}</includeonly><!--
-->[[Category:Pages with Discord embeds]]<noinclude>{{Documentation}}
[[Category:Templates]]</noinclude>
7d39c3a9d1b4eb8e95becaf418c16ec30cb9c077
Template:Discord/doc
10
148
171
2025-08-20T01:24:02Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template allows you to either use [[support:DiscordCompact|DiscordCompact]] or [[support:DiscordWidget|DiscordWidget]] to display information about a certain Discord server.
== Usage ==
In order to be able to show a Discord server widget on your wiki, first go to your Discord server and do the following:
* Open the <code>Server Settings</code>, then go to the <code>Engagement</code> section.
* Scroll down to <code>Server Widget</code>.
* Enable the widget.
* Copy the <code>Server ID</code>.
Then, do the following depending on the type of widget you want to use (compact or full).
=== Compact widget (default) ===
{{main|support:DiscordCompact{{!}}DiscordCompact}}
The compact widget is the default one.
To use it, simply add the template with the server ID either as the '''first''' parameter or as the <code>id</code> parameter:
* <code><nowiki>{{Discord|serverID}}</nowiki></code>
* <code><nowiki>{{Discord|id=serverID}}</nowiki></code>
=== Full widget ===
{{main|support:DiscordWidget{{!}}DiscordWidget}}
To use the full version of the Discord widget, you have to specify <code>full=yes</code> as one of the template parameters, with the ID either as the '''first''' parameter or as the <code>id</code> parameter:
* <code><nowiki>{{Discord|serverID|full=yes}}</nowiki></code>
* <code><nowiki>{{Discord|full=yes|id=serverID}}</nowiki></code>
You can further customize the widget with the <code>width</code>, <code>height</code> and other parameters. See the Examples section and the full documentation for DiscordWidget on the [[support:DiscordWidget|Support Wiki]].
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Discord|951501892553424917}}</nowiki></code><br/><code><nowiki>{{Discord|id=951501892553424917}}</nowiki></code> || {{Discord|951501892553424917}}
|-
| <code><nowiki>{{Discord|951501892553424917}|full=yes}</nowiki></code> || {{Discord|951501892553424917|full=yes}}
|-
| <pre><nowiki>{{Discord|full=yes
|id = 951501892553424917
|width = 300px
|height = 500px
}}</nowiki></pre> || {{Discord|full=yes|id=951501892553424917|width=300px|height=500px}}
|}
== Dependencies ==
* As stated before, both Compact and Widget require the given Discord server to have Widgets enabled in its Server Settings.
* Both Compact and Widget require the <code>discordTemplate</code> gadget:
** [[MediaWiki:Gadgets/discordTemplate]]
** [[MediaWiki:Gadgets/discordTemplate/main.js]]
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"aliases": [
"id"
],
"label": "Server ID",
"description": "The Discord server's ID.",
"example": "951501892553424917",
"type": "line",
"required": true
},
"full": {
"label": "Use full widget",
"example": "yes",
"type": "boolean",
"description": "Do you want to use the full widget?"
},
"width": {
"label": "Width (full widget only)",
"description": "A custom width for the full widget.",
"example": "300px",
"type": "line"
},
"height": {
"label": "Height (full widget only)",
"description": "A custom height for the full widget.",
"example": "500px",
"type": "line"
}
},
"description": "This template allows you to either use DiscordCompact or DiscordWidget to display information about a certain Discord server.",
"paramOrder": [
"1",
"full",
"width",
"height"
],
"format": "block"
}
</templatedata>
2b1165b9383a06a5766054d0d38b8b045cf83b25
Template:Main page box/end
10
149
172
2025-08-20T01:24:02Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly></div>
</div></includeonly><noinclude>
{{doc}}
[[Category:Main page templates]]
</noinclude>
506617faba565eb65144b21c3ead8fe5c2010b55
Template:Main page box/start
10
150
173
2025-08-20T01:24:03Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><div class="mp-box <!--
These variables are used to determine if certain layouts should hide certain boxes.
The variable is created in and passed from [[Module:Main page]], and is formatted as a pseudo bitmask to reduce variable usage
An example of this variable would be "1,1,0," which would mean display on desktop and tablet but not on mobile
-->{{#ifeq:{{#explode:{{#var:imp-variable-display-box}}|,|0}}|0|mp-hide-on-desktop}} <!--
-->{{#ifeq:{{#explode:{{#var:imp-variable-display-box}}|,|1}}|0|mp-hide-on-tablet}} <!--
-->{{#ifeq:{{#explode:{{#var:imp-variable-display-box}}|,|2}}|0|mp-hide-on-mobile}} <!--
-->{{{class|}}}" style="grid-area:{{#var:imp-variable-id}}; {{{style|}}}" id="mp-box-{{#var:imp-variable-id}}" data-box-id="{{#var:imp-variable-id}}"><!--
-->{{#if:{{{title|{{{1|}}}}}}|
<h2> {{{title|{{{1|}}}}}} </h2>
}}<div class="mp-body"></includeonly><noinclude>
{{doc}}
[[Category:Main page templates]]
</noinclude>
62eedb503b63a36fc31a301f8ea6b15f6ff9bf60
Template:Main page box/preload
10
151
174
2025-08-20T01:24:04Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Main page box/start
| title = $1
}}
Content goes here, between the start and end templates.
Feel free to use wikitext, tables, templates, new lines, whatever.
{{Main page box/end}}<includeonly><no<noinclude></noinclude>include>[[Category:Main page boxes]]</no<noinclude></noinclude>include></includeonly><!-- don't edit this line --><noinclude>
[[Category:Main page templates]]
</noinclude>
9b16288e15e3c8c9ede76b4dc76e538d2253cf23
Template:Main page
10
152
175
2025-08-20T01:24:04Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{#invoke:Main page|main}}
__NOTOC__
__NOEDITSECTION__
[[Category:{{SITENAME}}| ]]</includeonly><noinclude>
{{doc}}
[[Category:Main page templates]]
</noinclude>
64a0dbb502a75c44e4b3f474772d8502bdf44e40
Template:Main page box/create
10
153
176
2025-08-20T01:24:05Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{#tag: inputbox |
type = create
width = 40
default = {{{1|}}}
buttonlabel = Create this box
prefix = {{#or:{{{rootpage|}}}|{{MediaWiki:Mainpage}}}}/
placeholder = box name (no spaces)
preload = Template:Main page box/preload
summary = Created using preload
preloadparams[] = {{ucfirst:{{{1|Example}}}}}
}}<noinclude>[[Category:Main page templates]]</noinclude>
da58eca98a44a09e476c5b4a5cafde116b6cdac9
Template:Main page box
10
154
177
2025-08-20T01:24:05Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><code>Template:Main page box</code> is not intended to be used directly, please use [[Template:Main page box/start]] and [[Template:Main page box/end]].</includeonly><noinclude>
This template is used to create the boxes of the IMProved Main Page (IMP) framework. '''It should not be called directly''', instead using {{tl|Main page box/start}} and {{tl|Main page box/end}}.
<div style="text-align:center;">
Use the box below to create a page with the required templates already in place, ready for you to add your content.
{{/create}}
The box name can not contain spaces or start with a number. Those are probably the only restrictions you'll run into, but for a full list see [https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident <custom-ident> on MDN web docs].
</div>
==Parameters==
These are the parameters used by {{tl|Main page box/start}}. All parameters are optional.
{| class="wikitable"
! Name !! Data type !! Description
|-
| title || Wikitext || The title of the box. This can be empty, in which case the box will contain only the content.
|-
| class || CSS classes || A list of classes to be passed to the box, separated by spaces and without quotes. Standard options are <code>centered-content</code> to vertically center contents, and <code>has-floating-image</code> in case floating images are needed in the box (normally the flex layout disallows this).
|-
| style || CSS declarations || Inline CSS to be applied directly to the box, without quotes. A common usage is <code>text-align:center;</code> for cases where it's desired for individual boxes to have centered text.
|}
[[Category:Main page templates]]
[[Category:Template documentation]]
</noinclude>
cbbd25d1eb0105a8be55d0cc174f385fc467ffad
Template:Main page box/start/doc
10
155
178
2025-08-20T01:24:06Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
See [[Template:Main page box]] for information on how to use this.
==TemplateData==
<templatedata>
{
"params": {
"class": {
"label": "Class",
"description": "Additional classes to give to the box wrapping this box.",
"example": "centered-content",
"suggestedvalues": [
"centered-content",
"has-floating-image"
]
},
"style": {
"label": "Style",
"description": "Inline CSS to add to the box wrapping this box",
"example": "text-align:center;",
"type": "string"
},
"title": {
"aliases": [
"1"
],
"label": "Title",
"description": "The title of this box.",
"example": "Welcome to the wiki!",
"type": "content",
"suggested": true
}
},
"description": "Creates a box for use on the main page.",
"paramOrder": [
"title",
"class",
"style"
],
"format": "block"
}
</templatedata>
<noinclude>[[Category:Template documentation]]</noinclude>
860e1be8fbf205ab2b3214cb91860a77fd3ef52b
Template:Main page box/end/doc
10
156
179
2025-08-20T01:24:07Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
See [[Template:Main page box]] for information on how to use this.
<noinclude>[[Category:Template documentation]]</noinclude>
e73182bed655118b10da971b634dc9c3bf3e3d39
Template:Main page/doc
10
157
180
2025-08-20T01:24:07Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template is used to create an IMP Main Page. It uses [[Module:Main page]] to arrange a series of [[Template:Main page box]]es in a [https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout CSS grid].
==Simple explanation==
The layout is made using keywords arranged in a grid. This grid has 3 columns on desktop-width screens, 2 columns on tablet, and 1 on mobile. Each can have as many rows as you want. Each keyword represents the same section and can span multiple rows and/or columns, but ''must'' form a contiguous rectangle of any dimension (1x1, 1x2, 2x2, 2x3, etc.).
For example, the following input to desktop:
<pre style="display:table;">
welcome welcome welcome
about links links
about contribute contribute
</pre>
would produce a grid resembling the following:
{| class="wikitable"
| style="background-color:rgba(0,255,0,0.15)" | welcome
| style="background-color:rgba(0,255,0,0.15)" | welcome
| style="background-color:rgba(0,255,0,0.15)" | welcome
|-
| style="background-color:rgba(255,0,255, 0.15)" | about
| style="background-color:rgba(0,0,255, 0.15)" | links
| style="background-color:rgba(0,0,255, 0.15)" | links
|-
| style="background-color:rgba(255,0,255, 0.15)" | about
| style="background-color:rgba(255,255,0, 0.15)" | contribute
| style="background-color:rgba(255,255,0, 0.15)" | contribute
|}
Where <code>welcome</code> is the contents of [[{{MediaWiki:Mainpage}}/welcome]], <code>about</code> is the contents of [[{{MediaWiki:Mainpage}}/about]], and so on. See [[Template:Main page box]] for more information about creating your own boxes.
If you enter a keyword that does not have a corresponding box already, you'll be prompted to create one when saving or previewing the page.
If you leave a keyword out of a certain layout, it will not be displayed on that layout. A warning will be given at the top of the edit preview in case this was an accident, but can be safely ignored if intentional.
For additional hints and information, see the comments that came on your main page or ask a wiki.gg staff member for help.
==Technical explanation==
For the CSS savvy, this section explains how it works a bit under the hood.
The input to desktop, tablet, and mobile create [https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties CSS variables] which are then used as the value of [https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas grid-template-areas] in media queries for screen widths >=1350px, >=990px, and <990px. The boxes are given an id based on their subpage name, which is then used by the module to find the template, as well as by the box templates to assign them a CSS id of <code>mp-box-<keyword></code>. Since these keywords are used directly in the grid layout, they must follow the rules of [https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident <custom-ident>] naming.
==Dependencies==
For this template to work properly, you need the following:
* [[Module:Main page]]
* All templates in [[:Category:Main page templates]].
* All CSS within the "Main page layout" section found in [[MediaWiki:Common.css]].
The <code>[[MediaWiki:Gadgets/mpEditLinks|mpEditLinks]]</code> gadget is also highly recommended. Its code can be found at [[MediaWiki:Gadgets/mpEditLinks/main.css]] and [[MediaWiki:Gadgets/mpEditLinks/main.js]].
==TemplateData==
<templatedata>
{
"params": {
"desktop": {
"label": "Desktop",
"description": "The layout for wide screens",
"required": true,
"type": "string"
},
"tablet": {
"label": "Tablet",
"description": "The layout for mid-width screens",
"required": true,
"type": "string"
},
"mobile": {
"label": "Mobile",
"description": "The layout for narrow screens",
"required": true,
"type": "string"
}
},
"description": "Creates an IMP Main Page.",
"format": "block"
}
</templatedata>
<noinclude>[[Category:Template documentation]]</noinclude>
c5052ca4c6f9f0e1e2c0a81cea00e372d4bacdca
Template:Ct
10
158
181
2025-08-20T01:24:08Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<code><nowiki>[</nowiki>[[Special:CargoTables/{{{1}}}|{{{1}}}]]<nowiki>]</nowiki>{{#if:{{{2|}}}|.{{{2}}}}}</code><noinclude>
[[Category:Formatting templates]]</noinclude>
d868545d4d3eeb1545e963d063199a68abba7836
Template:Main page box/missing
10
159
182
2025-08-20T01:24:08Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{Main page box/start
| title = {{{1}}}
| style = text-align:center;
| class = missing
}}
The {{{1}}} box does not exist. Check your spelling or create it here:<br/>
{{Main page box/create|{{{1|}}}|rootpage = {{{rootpage|}}}}}<br/>
See [[Template:Main page box]] for more information.
{{Main page box/end}}<noinclude>[[Category:Main page templates]]</noinclude>
5cff88dacf33c912d4aa04c1541e684a5f3e79bb
Template:Iter
10
160
183
2025-08-20T01:24:09Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{#vardefine:varname|ITER_INDEX_{{#if:{{{1|}}}|{{{1}}}|default}}<!-- end vardefine -->}}<!--
main logic
-->{{#vardefineecho:{{#var:varname}}|
{{#expr:
{{#ifeq:{{lc:{{{reset|}}}<!-- end lc -->}}
|yes
|0
|{{#var:{{#var:varname}}|0}}
<!-- end ifeq -->}} + {{#if:{{{get|}}}|0|1}}
<!-- end expr -->}}
<!-- end vde -->}}</includeonly><noinclude>{{documentation}}
[[Category:Templates]]</noinclude>
c37a3625d58a115a140f129da248ec1c9f6cb55e
Template:Iter/doc
10
161
184
2025-08-20T01:24:09Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template helps you create indexed columns in tables (particularly [[support:Cargo|Cargo]] queries) and to retrieve iterator values when using the parser function <code><nowiki>{{#arraymaptemplate</nowiki></code> (bundled with Extension:ParserPower on wiki.gg).
== Simple counting ==
<pre>
* {{iter|}}
* {{iter|}}
* {{iter|}}
* {{iter|}}
</pre>
* {{iter|}}
* {{iter|}}
* {{iter|}}
* {{iter|}}
== Reset the counter ==
<pre>
* {{iter|reset=yes}}
* {{iter|}}
* {{iter|reset=yes}}
* {{iter|}}
</pre>
* {{iter|reset=yes}}
* {{iter|}}
* {{iter|reset=yes}}
* {{iter|}}
== Multiple counters ==
<pre>
* {{iter|key1}}
* {{iter|key2}}
* {{iter|key2}}
* {{iter|key1}}
</pre>
* {{iter|key1}}
* {{iter|key2}}
* {{iter|key2}}
* {{iter|key1}}
== Get value without incrementing ==
<pre>
* {{iter|reset=yes}}
* {{iter|}}
* {{iter|}}
* {{iter|get=yes}}
</pre>
* {{iter|reset=yes}}
* {{iter|}}
* {{iter|}}
* {{iter|get=yes}}
<noinclude>
[[Category:Template documentation]]
</noinclude>
20b5a53a6457493d2a2a9774b803511678a65760
Template:License/permission
10
162
185
2025-08-20T01:24:10Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = permission
| icon = [[File:IN COPYRIGHT.svg|50px|link=|IN COPYRIGHT WITH PERMISSION]]
| text = This file is copyrighted. The copyright holder has given permission for its use on wiki.gg.
}}</includeonly><noinclude>
This template currently looks like: {{License/permission}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
854af75c8477c36c50cb5d103ad8a933892fc322
186
185
2025-08-20T01:24:11Z
ARTIFICER
564804
Protected "[[Template:License/permission]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{License/template
| source = {{{source|}}}
| type = permission
| icon = [[File:IN COPYRIGHT.svg|50px|link=|IN COPYRIGHT WITH PERMISSION]]
| text = This file is copyrighted. The copyright holder has given permission for its use on wiki.gg.
}}</includeonly><noinclude>
This template currently looks like: {{License/permission}}
See {{tl|License}} for full license documentation
[[Category:License templates]]</noinclude>
854af75c8477c36c50cb5d103ad8a933892fc322
Template:Flag
10
163
187
2025-08-20T01:24:11Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><!--
--><span class="country-flag" title="{{{2|}}}">{{#if: {{{1|}}} | [[File:Flag {{{1|}}}.svg|x20px|link=]] | }}</span><!--
--></includeonly><!--
--><noinclude>{{doc}}[[Category:Formatting templates]]</noinclude>
9802f61bee0e36120c835608ccee85e72384341b
Template:Flag/doc
10
164
188
2025-08-20T01:24:12Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This formatting template allows you to display country flags inline.
Available country flags can be seen in [[dev:Category:Country_flags|our Commons Wiki]].
== Usage ==
The template can be used with the following formatting: <code><nowiki>{{flag|code|Legend}}</nowiki></code>, where:
* <code>code</code> is the [[wikipedia:ISO 3166-1 alpha-2|ISO 3166-1 alpha-2]] code for the country flag.
* <code>Legend</code> is the legend displayed on hover (optional).
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{flag|ca|Canada}}</nowiki></code> || {{flag|ca|Canada}}
|}
<noinclude>[[Category:Template documentation]]</noinclude>
1fb455be1ffbed259dd27df18dd447e605746ed4
Template:Disambig
10
165
189
2025-08-20T01:24:12Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#redirect [[Template:Disambiguation]]
f220bcb889e0ce686a839d64ec6c4359b0e8bfb7
Template:TOC limit
10
166
190
2025-08-20T01:24:13Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><div class="toclimit-{{{1|{{{limit|3}}}}}}">__TOC__</div></includeonly><noinclude>
{{documentation}}
[[Category:Table of contents templates]]
</noinclude>
9187098528659316936c0da0589a7745f10e38e3
Template:TOC limit/doc
10
167
191
2025-08-20T01:24:14Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This template inserts a Table of Contents that omits subheadings beyond a certain depth. The table obeys the same layout rules as the <nowiki>__TOC__</nowiki> [[mw:Help:Magic_words|magic word]]. Omitted sections still have section edit links in the article body. The main use for this template is situations where you want section edit links for ease of editing but don't want a full table of contents. '''Before using this template, consider whether and why it would be helpful to readers and other editors.'''
== Usage ==
{{tlx|TOC limit}} or {{tlx|TOC limit|3}}
The template defaults to including second- and third-level headings, e.g. those numbered "1" and "1.1" in the TOC. (Note: {{tlx|TOC limit|1}} does nothing: the first-level heading on a page is, by default, the page title.)
You can specify a different limit by adding a header level:
{{tlx|TOC limit|4}}
4 allows for fourth-level headings, e.g. "1.1.1", but omits any subheadings below that from the TOC.
The template works by hiding the lower levels with CSS. See [[Mediawiki:Common.css]].
== TOC levels versus wikitext header levels ==
The heading levels in the TOC normally correspond to the header levels in the wikitext, so a <code>== Level-2 header ==</code> will normally generate the first-level ("1") TOC headings, a <code>=== Level-3 header ===</code> will normally generate the second-level ("1.1") TOC headings, and so on. This correspondence does ''not'' hold if the page contains <code>= Level-1 headers =</code> or skips header levels. For example, wikitext like this:
<pre>
== Level-2 heading (A) ==
=== Level-3 heading (B) ===
== Level-2 heading (C) ==
====== Level-6 heading (D) ======
= Level-1 heading (E) =
== Level-2 heading (F) ==
=== Level-3 heading (G) ===
</pre>
will generate a TOC like this:
{| class="toc"
|<div style="text-align:center"><b>Contents</b></div>
<ul>
<li class="toclevel-1 tocsection-1"><span class="tocnumber">1</span> <span class="toctext">Level-2 heading (A)</span><ul>
<li class="toclevel-2 tocsection-2"><span class="tocnumber">1.1</span> <span class="toctext">Level-3 heading (B)</span></li>
</ul></li>
<li class="toclevel-1 tocsection-1"><span class="tocnumber">2</span> <span class="toctext">Level-2 heading (C)</span><ul>
<li class="toclevel-2 tocsection-2"><span class="tocnumber">2.1</span> <span class="toctext">Level-6 heading (D)</span></li>
</ul></li>
<li class="toclevel-1 tocsection-1"><span class="tocnumber">3</span> <span class="toctext">Level-1 heading (E)</span><ul>
<li class="toclevel-2 tocsection-2"><span class="tocnumber">3.1</span> <span class="toctext">Level-2 heading (F)</span><ul>
<li class="toclevel-3 tocsection-3"><span class="tocnumber">3.1.1</span> <span class="toctext">Level-3 heading (G)</span></li>
</ul></li>
</ul></li>
</ul>
|}
Using <code><nowiki>{{TOC limit}}</nowiki></code> on this page ''would not'' hide header D, because even though it is a level-6 heading it is shown at the second level in the TOC. And it ''would'' hide header G even though it is a level-3 heading just like header B, because header G is shown at the third level in the TOC while header B is shown at the second level.
== Conflicts ==
This template does not interact well with the {{tl|TOC right}} template. To achieve the correct effect, use those with a limit parameter. For example, {{tlx|TOC right|2=limit=2}} has the effect that {{tlx|TOC right}} and {{tlx|TOC limit|2}} would have - if they worked together.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"aliases": [
"limit"
],
"label": "Limit",
"description": "Maximum header depth to be included in table of contents",
"default": "3",
"suggested": true,
"type": "number"
}
},
"description": "Inserts a Table of Contents that omits subheadings beyond a certain depth."
}
</templatedata>
<noinclude>[[Category:Template documentation]]</noinclude>
8582cad25d72e508a04a81c36ef5ecb663a32bc7
Template:TOC right
10
168
192
2025-08-20T01:24:14Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly><div class="tocright {{#if:{{{limit|}}}|toclimit-{{{limit}}}}}">__TOC__</div></includeonly><noinclude>
{{documentation}}
[[Category:Table of contents templates]]
</noinclude>
8b94caa5343acd906cad9e74465f0ea5ce4e9549
Template:TOC right/doc
10
169
193
2025-08-20T01:24:15Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{tl|TOC right}} forces the auto-generated Table of Contents for an article to appear floated to the right side of the page in order to improve article layout.
==Usage==
Insert <code><nowiki>{{TOC right}}</nowiki></code> at the point in the article where you want the top of the Table of Contents box to appear. This should usually be after the text of the lead section, and just before the first section heading. Use with {{tl|clear}} to prevent collision with text. Avoid placing the TOC in a visually poor location. Crossing a section division is probably a poor idea.
;limit
: Limits the depth of subheadings shown. For instance using <code>limit=4</code> will hide the fourth level and deeper subheadings in the hierarchy. And <code>limit=2</code> will hide all subheadings leaving only the main headings. This works by hiding the lower levels with CSS. See {{tl|TOC limit}} for more information on this.
Do not place this template so that the TOC aligns with a large image or infobox; this breaks the layout on narrow screens (even users with screens as wide as 1024px wide can have problems). Also, a TOC that crosses a section division is probably a poor idea, if that can be avoided.
Unless the section in which the {{tl|TOC right}} is placed is long enough, the result may well be undesirable.
It should only be used in cases where the TOC gets in the way of other content or is detrimental to the layout of the page; it should ''not'' simply be used for aesthetics since it tampers with the standard appearance of articles.
==TemplateData==
<templatedata>
{
"params": {
"limit": {
"label": "Limit",
"description": "Limits the depth of subheadings shown. For instance using limit=4 will hide the fourth level and deeper subheadings in the hierarchy. And limit=2 will hide all subheadings leaving only the main headings. This works by hiding the lower levels with CSS",
"type": "number"
}
},
"description": "{{TOC right}} forces the auto-generated \"Table of Contents\" for an article to appear floated to the right side of the page (as seen right), in order to improve article layout.",
"paramOrder": [
"limit"
],
"format": "inline"
}
</templatedata>
<noinclude>[[Category:Template documentation]]</noinclude>
88415e28677a029fbca8963e109305c2d2d79643
Template:Toc limit
10
170
194
2025-08-20T01:24:16Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:TOC limit]]
cfa656c80245fbc1966e109758445db069c69934
Template:Toclimit
10
171
195
2025-08-20T01:24:16Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:TOC limit]]
cfa656c80245fbc1966e109758445db069c69934
Template:Toc right
10
172
196
2025-08-20T01:24:17Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:TOC right]]
fc00258b0a19738ebc9c13dbcc88881f9d5bff3e
Template:Tocright
10
173
197
2025-08-20T01:24:18Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
#REDIRECT [[Template:TOC right]]
fc00258b0a19738ebc9c13dbcc88881f9d5bff3e
Category:Documentation templates
14
174
198
2025-08-20T01:24:19Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Templates
14
175
199
2025-08-20T01:24:20Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:{{SITENAME}}]]
dd8aaa34cf600c1567d240a3f4bc615164a11592
Category:Bleak Faith: Forsaken Wiki
14
176
200
2025-08-20T01:24:20Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This is the top-level category. It contains meta categories and pages about the wiki.
8935f2b3e97edfeadd7bb206f1e17c03099ec24a
Category:Notice templates
14
177
201
2025-08-20T01:24:21Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Formatting templates
14
178
202
2025-08-20T01:24:21Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:License templates
14
179
203
2025-08-20T01:24:22Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Pages using DynamicPageList3 parser function
14
180
204
2025-08-20T01:24:22Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
d17f98d5d77b5951b7a80755914239533ad6aba6
Category:Candidates for deletion
14
181
205
2025-08-20T01:24:23Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Hidden categories
14
182
206
2025-08-20T01:24:24Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
These categories are hidden on article pages.
[[Category:Wiki maintenance]]
e4d17499a8377d3f2b4b4a618a671e53111f43ca
Category:Images
14
183
207
2025-08-20T01:24:24Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Media]]
b141d2b9971d6efe9f59bd03449781e71411c631
Category:Infobox templates
14
184
208
2025-08-20T01:24:25Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Logos
14
185
209
2025-08-20T01:24:25Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Images]]
8820b63e35aedd9d2666fe40b965d4e91ce0a106
Category:Media
14
186
210
2025-08-20T01:24:26Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:{{SITENAME}}]]
dd8aaa34cf600c1567d240a3f4bc615164a11592
Category:Pages containing omitted template arguments
14
187
211
2025-08-20T01:24:26Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages using TabberTransclude parser tag
14
188
212
2025-08-20T01:24:27Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
d17f98d5d77b5951b7a80755914239533ad6aba6
Category:Pages using Tabber parser tag
14
189
213
2025-08-20T01:24:28Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
d17f98d5d77b5951b7a80755914239533ad6aba6
Category:Pages using duplicate arguments in template calls
14
190
214
2025-08-20T01:24:28Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages where expansion depth is exceeded
14
191
215
2025-08-20T01:24:29Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages where template include size is exceeded
14
192
216
2025-08-20T01:24:29Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages where the unstrip depth limit is exceeded
14
193
217
2025-08-20T01:24:30Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages where the unstrip size limit is exceeded
14
194
218
2025-08-20T01:24:30Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with broken file links
14
195
219
2025-08-20T01:24:31Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Wiki maintenance]]
197b5fc8ebad5537759adacc0079b4b2662cb4c4
Category:Pages with ignored display titles
14
196
220
2025-08-20T01:24:31Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with math errors
14
197
221
2025-08-20T01:24:32Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with non-numeric formatnum arguments
14
198
222
2025-08-20T01:24:32Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with reference errors
14
199
223
2025-08-20T01:24:33Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with script errors
14
200
224
2025-08-20T01:24:34Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with syntax highlighting errors
14
201
225
2025-08-20T01:24:34Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with template loops
14
202
226
2025-08-20T01:24:35Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with too many expensive parser function calls
14
203
227
2025-08-20T01:24:35Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Promotional images
14
204
228
2025-08-20T01:24:36Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
Official images used for purposes of promoting the game, that may not actually represent gameplay.
[[Category:Images]]
80b893c439747ce681cf18cc579c3bc4c65cd502
Category:Stubs
14
205
229
2025-08-20T01:24:36Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Template documentation
14
206
230
2025-08-20T01:24:37Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
[[Category:Wiki maintenance]]
c1800be0da4588b3b652fa5324aade2c496fb3c5
Category:Templates with no documentation
14
207
231
2025-08-20T01:24:37Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Templates]]
[[Category:Wiki maintenance]]
b1ff76c0593194e53e6bf42f37ca337a5493c57e
Category:Wiki maintenance
14
208
232
2025-08-20T01:24:38Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
The sub-categories of this category contain pages that have been identified as needing attention for one or more of the following reasons:
* Changes have been suggested that should be discussed first or are under discussion.
* The page has flaws that need addressing by an editor with the knowledge or skills to help.
* The action the page needs requires special rights.
''See also:''
* [[Special:BrokenRedirects|Broken redirects]]
* [[Special:DoubleRedirects|Double redirects]]
* [[Special:UncategorizedCategories|Uncategorized categories]]
* [[Special:UncategorizedFiles|Uncategorized files]]
* [[Special:UncategorizedPages|Uncategorized pages]]
* [[Special:UncategorizedTemplates|Uncategorized templates]]
* [[Special:WantedCategories|Wanted categories]]
* [[Special:WantedFiles|Wanted files]]
* [[Special:WantedPages|Wanted pages]]
* [[Special:WantedTemplates|Wanted templates]]
* [[Special:TrackingCategories|Other special tracking categories]]
[[Category:{{SITENAME}}]]
4b90dc0dbd8c91e131e4ffcf22360b1c837b9717
Category:Wiki skin images
14
209
233
2025-08-20T01:24:38Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Images]]
8820b63e35aedd9d2666fe40b965d4e91ce0a106
Category:Pages using DynamicPageList3 dplvar parser function
14
210
234
2025-08-20T01:24:39Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
d17f98d5d77b5951b7a80755914239533ad6aba6
Category:Pages including data maps failing validation
14
211
235
2025-08-20T01:24:40Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
__HIDDENCAT__
[[Category:Wiki maintenance]]
57e36e9878c3eb806aa6ee6f748a5c5e0cdd5a97
Category:Pages including data maps
14
212
236
2025-08-20T01:24:40Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
d17f98d5d77b5951b7a80755914239533ad6aba6
Category:Maps failing data validation
14
213
237
2025-08-20T01:24:41Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
__HIDDENCAT__
[[Category:Wiki maintenance]]
57e36e9878c3eb806aa6ee6f748a5c5e0cdd5a97
Category:Legal notices
14
214
238
2025-08-20T01:24:41Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:{{SITENAME}}]]
dd8aaa34cf600c1567d240a3f4bc615164a11592
Category:Pages setting LuaCache keys
14
215
239
2025-08-20T01:24:42Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
__HIDDENCAT__
[[Category:Wiki maintenance]]
57e36e9878c3eb806aa6ee6f748a5c5e0cdd5a97
Category:Hatnote templates
14
216
240
2025-08-20T01:24:42Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Key template documentation
14
217
241
2025-08-20T01:24:43Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Template documentation]]
e65ecf60878d4707b3b4c1e3962615e2d5f3b2ab
Category:Navigation templates
14
218
242
2025-08-20T01:24:44Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Pages with failing Cargo queries
14
219
243
2025-08-20T01:24:44Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with math render errors
14
220
244
2025-08-20T01:24:45Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
786037995b8f7e89762a8ea13b84ade091453c00
Category:Pages with DRUID infoboxes
14
221
245
2025-08-20T01:24:46Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with a DRUID infobox. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
17ed4520e5c453209616df3c9b2306fce8ceb12f
Category:Pages with navboxes
14
222
246
2025-08-20T01:24:46Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with a {{tl|navbox}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
3e48f396fafee5d8aecf6cd0dcb554c769f485a9
Category:Pages with amboxes
14
223
247
2025-08-20T01:24:47Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with an {{tl|ambox}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
de382f794395f344d0147dbb96b9542d6f38f624
Category:Pages with hatnotes
14
224
248
2025-08-20T01:24:47Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with a {{tl|hatnote}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
4ac7721cfcffb2f181820164d95f3af8d86c4fd7
Category:Pages with spoilers
14
225
249
2025-08-20T01:24:48Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with a {{tl|spoiler}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
5822aa87e8a8897673ff589d00d2f0d622aa3be5
Category:Pages with quotes
14
226
250
2025-08-20T01:24:49Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with a {{tl|quote}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
2f764cddd1fb264f48b896ffd6e892df3c391e90
Category:Pages with colors
14
227
251
2025-08-20T01:24:49Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with a {{tl|color}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
bcca0312385263c30522c744df6a8c8856c68fab
Category:Main page templates
14
228
252
2025-08-20T01:24:50Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Main page boxes
14
229
253
2025-08-20T01:24:51Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Main page templates]]
ce086f8cfa39aeb8137ffe34e5d41aa38300cf4e
Category:Pages using the RSS extension
14
230
254
2025-08-20T01:24:51Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Wiki maintenance]]
d17f98d5d77b5951b7a80755914239533ad6aba6
Category:Pages with Discord embeds
14
231
255
2025-08-20T01:24:52Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
This category contains every page with a {{tl|Discord}} embed. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS.
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
[[Category:Categories for loading gadgets]]
11ff5616854d8913d2c371ae3c2c610278651846
Category:Categories for loading gadgets
14
232
256
2025-08-20T01:24:52Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Wiki maintenance]]
197b5fc8ebad5537759adacc0079b4b2662cb4c4
Category:Table of contents templates
14
233
257
2025-08-20T01:24:53Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
MediaWiki:Vector.css
8
234
258
2025-08-20T01:24:54Z
ARTIFICER
564804
Importing default loadout
css
text/css
/* All CSS here will be loaded for users of the Vector skin */
/*
This is the wiki.gg default loadout,
please do not modify it inline. To add your own skin customizations,
scroll down to the end of the default loadout (or search for "[END]" to jump there).
If you modify the sheet above that point, your changes may be overwritten in updates without warning!!!
If you want to maintain your own CSS for annual MediaWiki updates & be responsible for ALL bugfixes YOURSELF, change UPDATE in the following line to say NOUPDATE:
DLW: UPDATE
DLW VERSION: 2.2.1
IMPORTANT: if you are updating your wiki from a version before May 22, 2025,
you need to copy [[MediaWiki:Gadgets/vectorScripts]] and [[MediaWiki:Gadgets/vectorScripts/main.js]] as well or your navigation tabs will break.
*/
/*********************************************************
* Backwards compatibility with deprecated variable names *
**********************************************************/
:root {
--wiki-heading-color: var(--wiki-content-heading-color);
--wiki-heading-font-family: var(--wiki-content-heading-font-family);
--wiki-firstheading-font-family: var(--wiki-content-firstheading-font-family);
}
/****************************************
* End backwards compatibility variables *
*****************************************/
/************************************
* Body, head, and general framework *
*************************************/
:root{
--wiki-logo-box-width: calc(var(--wiki-sidebar-width, 10em) * (1 - var(--wiki-is-top-logo, 0)) + min( var(--wiki-logo-file-width, 160) / var(--wiki-logo-file-height, 160) * var(--wiki-logo-height, 160px), 100vw - var(--wiki-left-spacing, 0.5em) - var(--wiki-right-spacing, 0px) - 18px, var(--wiki-page-content-max-width, 9999px) ) * var(--wiki-is-top-logo, 0)); /* 18px: the scrollbar */
--wiki-logo-box-height: calc(var(--wiki-logo-file-height, 160) / var(--wiki-logo-file-width, 160) * var(--wiki-logo-box-width));
}
html, body {
height: auto;
min-height: 100%;
}
/* site background */
html {
background-color: var(--wiki-body-background-color);
background-image: var(--wiki-body-background-image);
/* the following have fallbacks for backwards compatibility with older versions of the loadout */
background-position: var(--wiki-body-background-position, top center);
background-size: var(--wiki-body-background-size, cover);
background-repeat: var(--wiki-body-background-repeat, no-repeat);
background-attachment: var(--wiki-body-background-attachment, fixed);
}
body {
background: none;
font-family: var(--wiki-body-font-family);
accent-color: var(--wiki-accent-color);
box-sizing: border-box;
padding-top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, 0px));
padding-bottom: var(--wiki-bottom-spacing, 0px);
padding-left: var(--wiki-left-spacing, 0px);
padding-right: var(--wiki-right-spacing, 0px);
box-sizing: border-box;
}
.skinpref-limited-width body, body.skinpref-limited-width {
--wiki-page-content-max-width: var(--wiki-content-reduced-max-width, 1300px);
}
/* clear fix */
body::after {
content: "";
display: table;
clear: both;
}
#mw-page-base,
#mw-head-base {
background: none;
--height: calc(var(--wiki-navigation-height, 3em) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0) + var(--wiki-is-top-logo, 0) * (var(--wiki-logo-box-height, 160px) + var(--wiki-logo-margin, 15px))); /* if not is-top-logo, height of navigation, else height of navigation + logo-height + logo-margin */
height: var(--height);
}
#mw-page-base {
max-width: var(--wiki-page-content-max-width, 9999px);
margin: auto;
}
#mw-head-base {
width: calc(min(100%, var(--wiki-page-content-max-width, 9999px)) - var(--wiki-sidebar-width, 10em) - var(--wiki-gap-between-sidebar-and-content, 0.5em));
margin-top: calc(-1 * var(--height));
margin-left: calc(max(0px, 100% - var(--wiki-page-content-max-width, 9999px)) / 2 + var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em));
}
/* let ul default to text that respects color */
ul {
list-style-image: none;
}
/************************
* End general framework *
*************************/
/**************
* Vector tabs *
***************/
/* prevent margin collapse */
.content-wrapper::before {
content: " ";
display: table;
}
.content-wrapper{
--navigation-border-bottom-width: calc(var(--wiki-navigation-border-bottom-width, calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px))));
}
/****** navbar (#mw-head) ******/
.vector-menu-tabs .mw-list-item,
#p-cactions, #p-variants {
float: unset;
line-height: 1.5; /* fallback */
line-height: round(nearest, calc(var(--wiki-navigation-font-size,0.8125em)*1.5), 1px);
box-sizing: border-box;
white-space: nowrap;
}
#mw-head {
--icon-star-filled: url("data:image/svg+xml,%3C%3Fxml version='1.0'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' id='Outlined'%3E%3Cg style='fill:%23000000;fill-opacity:1' id='Fill'%3E%3Cpath style='fill:%23000000;fill-opacity:1' id='path1380' d='M 28.61,11.67 H 20 L 17.34,3.47 C 16.920093,2.1973942 15.119907,2.1973942 14.7,3.47 L 12,11.67 H 3.39 c -1.3409796,0.0031 -1.900508,1.71581 -0.82,2.51 l 7,5.07 -2.68,8.21 C 6.5980433,28.35747 7.2662365,29.278767 8.21,29.28 8.4953889,29.267666 8.7705436,29.170143 9,29 l 7,-5.07 7,5.07 c 0.236205,0.170386 0.518805,0.264586 0.81,0.27 0.943763,-0.0012 1.611957,-0.92253 1.32,-1.82 l -2.66,-8.21 7,-5.07 c 1.075277,-0.810084 0.486081,-2.522863 -0.86,-2.5 z' /%3E%3C/g%3E%3C/svg%3E");
--icon-star-empty: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M20 7h-7L10 .5 7 7H0l5.46 5.47-1.64 7 6.18-3.7 6.18 3.73-1.63-7zm-10 6.9-3.76 2.27 1-4.28L3.5 8.5h4.61L10 4.6l1.9 3.9h4.6l-3.73 3.4 1 4.28z'/%3E%3C/svg%3E%0A");
/* icon below is from https://tabler-icons.io/ */
--icon-chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-down' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M6 9l6 6l6 -6'%3E%3C/path%3E%3C/svg%3E");
margin-left: calc(var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em));
width: auto;
height: var(--wiki-navigation-height);
margin-top: calc(-1 * (var(--wiki-navigation-height) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0)));
position: relative;
display: flex;
align-items: stretch;
z-index: 4; /* above #mw-panel and .mw-indicators */
background: var(--wiki-navigation-box-background, none);
border: calc(var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0)) var(--wiki-content-border-style, solid) var(--wiki-content-border-color);
border-bottom-width: 0;
border-radius: var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) 0 0;
border-image: var(--wiki-navigation-box-border-image, none);
backdrop-filter: var(--wiki-navigation-box-backdrop-filter, none);
}
/* top border of the content */
#mw-head::before {
content: "";
display: block;
box-sizing: border-box;
position: absolute;
top: calc(100% - min(var(--wiki-navigation-left-spacing, 0px) * 999, var(--navigation-border-bottom-width)) + var(--navigation-border-bottom-width));
left: 0;
width: calc(max(var(--wiki-navigation-left-spacing, 0px), var(--navigation-border-bottom-width)));
height: calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width)));
border: 0 var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color));
border-left-width: var(--navigation-border-bottom-width);
border-top-width: var(--navigation-border-bottom-width);
border-top-left-radius: calc(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)));
}
#left-navigation,
#right-navigation {
float: none;
margin: 0;
display: flex;
align-items: flex-end;
margin-bottom: calc(-1 * var(--navigation-border-bottom-width));
}
#left-navigation {
flex: 0 0 auto;
justify-content: flex-start;
}
#right-navigation {
flex: 1 1 auto;
justify-content: flex-end;
}
#left-navigation::before,
#left-navigation::after,
#right-navigation::before,
#right-navigation::after {
content: "";
display: block;
height: 0;
border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color));
flex: 0 0 auto;
}
#left-navigation::before {
box-sizing: border-box;
width: var(--wiki-navigation-left-spacing, 0px);
border-bottom-width: 0;
}
#left-navigation::after {
width: var(--wiki-navigation-gap-between-left-and-right);
}
#right-navigation::before {
flex: 1 1 auto;
width: auto;
}
#right-navigation::after {
width: var(--wiki-navigation-right-spacing);
display: none; /* only for desktop */
}
/*** tabs ***/
/* reset */
.vector-menu,
.vector-menu *,
.vector-menu-tabs-legacy li {
background: none;
}
.vector-menu input {
border: 0;
}
/* tabs list */
.vector-menu-tabs {
height: unset;
padding: unset;
}
.vector-menu-tabs .vector-menu-content {
height: 100%;
}
.vector-menu-tabs-legacy ul{
float: none;
}
.vector-menu-tabs .vector-menu-content-list {
display: flex;
align-items: flex-end;
}
/* tab */
.vector-menu-tabs .mw-list-item,
.vector-menu-dropdown {
/* outer box of normal tabs: border-bottom */
border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color));
position: relative;
margin-right: max(0px, var(--wiki-navigation-tab-spacing)); /* make space for gap */
height: auto;
padding-bottom: var(--wiki-navigation-bottom-spacing, 0px);
cursor: auto;
}
.vector-menu-dropdown .vector-menu-checkbox{
height: calc(100% - var(--wiki-navigation-bottom-spacing, 0px));
}
.vector-menu-tabs .mw-list-item::after,
.vector-menu-dropdown::after {
/* gap */
content: "";
display: block;
width: max(0px, var(--wiki-navigation-tab-spacing));
height: 0;
border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color));
position: absolute;
left: 100%;
bottom: calc(0px - var(--navigation-border-bottom-width));
}
.vector-menu-tabs .mw-list-item + .mw-list-item,
.vector-menu-dropdown {
margin-left: calc(min(0px, var(--wiki-navigation-tab-spacing)));
}
.vector-menu-tabs .mw-list-item a,
.vector-menu-tabs .mw-list-item a:visited,
#mw-head .vector-menu-dropdown .vector-menu-heading { /* "#mw-head " is needed here to correctly overwriting mw default css */
/* inner box of normal tabs: tab style */
float: none;
height: auto;
margin: 0;
padding: var(--wiki-navigation-tab-padding-top, 1.25em) var(--wiki-navigation-tab-padding-x, 0.75em) var(--wiki-navigation-tab-padding-bottom, 4px);
border: var(--wiki-navigation-border-width, 1px) var(--wiki-navigation-border-style, solid) var(--wiki-navigation-border-color);
border-bottom-width: calc(min(var(--wiki-navigation-bottom-spacing, 0px)*999, var(--wiki-navigation-border-width, 1px)));
border-radius: var(--wiki-navigation-border-radius) var(--wiki-navigation-border-radius) 0 0;
border-image: var(--wiki-navigation-border-image);
color: var(--wiki-navigation-text-color);
background-image: var(--wiki-navigation-background-image, none);
background-color: color-mix(in srgb, var(--wiki-navigation-background-color) var(--wiki-navigation-background-opacity), transparent);
background-size: var(--wiki-navigation-background-size, auto);
background-repeat: var(--wiki-navigation-background-repeat, repeat);
background-position: var(--wiki-navigation-background-position, center);
font-size: var(--wiki-navigation-font-size, 0.8125em);
backdrop-filter: var(--wiki-navigation-backdrop-filter, var(--wiki-navigation-selected-backdrop-filter, none));
}
.vector-menu-tabs .mw-list-item a:hover,
#mw-head .vector-menu-dropdown:hover .vector-menu-heading {
border-color: var(--wiki-navigation-border-color--hover, var(--wiki-navigation-border-color));
color: var(--wiki-navigation-text-color--hover);
border-image: var(--wiki-navigation-border-image--hover);
background-image: var(--wiki-navigation-background-image--hover, var(--wiki-navigation-background-image, none));
background-color: color-mix(in srgb, var(--wiki-navigation-background-color--hover, var(--wiki-navigation-background-color)) var(--wiki-navigation-background-opacity--hover, var(--wiki-navigation-background-opacity)), transparent);
background-size: var(--wiki-navigation-background-size--hover, var(--wiki-navigation-background-size, auto));
background-repeat: var(--wiki-navigation-background-repeat--hover, var(--wiki-navigation-background-repeat, repeat));
background-position: var(--wiki-navigation-background-position--hover, var(--wiki-navigation-background-position, center));
transform: var(--wiki-navigation-transform--hover, none);
}
.vector-menu-tabs .mw-list-item.selected {
background: none;
border-bottom-color: transparent;
}
.vector-menu-tabs .mw-list-item.selected a {
/* inner box of selected tab: tab style */
background-image: var(--wiki-navigation-selected-background-image, none);
background-color: color-mix(in srgb, var(--wiki-navigation-selected-background-color) var(--wiki-navigation-selected-background-opacity), transparent);
background-size: var(--wiki-navigation-selected-background-size, auto);
background-repeat: var(--wiki-navigation-selected-background-repeat, repeat);
background-position: var(--wiki-navigation-selected-background-position, center);
border: var(--wiki-navigation-selected-border-width, 1px) var(--wiki-navigation-selected-border-style, solid) var(--wiki-navigation-selected-border-color);
border-bottom-width: calc(min(var(--wiki-navigation-bottom-spacing, 0px)*999, var(--wiki-navigation-selected-border-width, 1px)));
border-image: var(--wiki-navigation-selected-border-image);
color: var(--wiki-navigation-selected-text-color);
backdrop-filter: var(--wiki-navigation-selected-backdrop-filter, none);
}
.vector-menu-tabs .mw-list-item.selected::before {
content: '';
display: block;
width: 100%;
box-sizing: border-box;
height: var(--navigation-border-bottom-width);
border: var(--wiki-navigation-selected-border-width, var(--wiki-content-border-width, 1px)) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color));
border-top-width: 0;
border-bottom-width: 0;
position: absolute;
bottom: calc(0px - var(--navigation-border-bottom-width));
background: var(--wiki-navigation-selected-border-bottom-background, transparent);
background-clip: padding-box;
}
/* watch/unwatch star */
.vector-menu-tabs #ca-watch.icon a,
.vector-menu-tabs #ca-unwatch.icon a {
width: var(--wiki-navigation-icon-size, 1em);
height: 100%;
box-sizing: content-box;
padding: var(--wiki-navigation-tab-padding-top, 1.25em) var(--wiki-navigation-tab-padding-x--icon, var(--wiki-navigation-tab-padding-x, 0.75em)) var(--wiki-navigation-tab-padding-bottom, 4px) var(--wiki-navigation-tab-padding-x--icon, var(--wiki-navigation-tab-padding-x, 0.75em));
color: transparent; /* for watch/unwatch, the text of <a> will be plain 'watch'/'unwatch' without <span> after clicking. */
display: flex;
align-items: center;
text-indent: 999px;
}
.vector-menu-tabs #ca-watch.icon a::before,
.vector-menu-tabs #ca-unwatch.icon a::before {
content: "";
display: block;
position: unset;
background-image: none !important;
width: var(--wiki-navigation-icon-size, 1em);
height: var(--wiki-navigation-icon-size, 1em);
flex: 0 0 auto;
--mask: var(--icon) no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: center center;
mask-position: center center;
background-color: var(--wiki-navigation-text-color);
}
.vector-menu-tabs #ca-watch.icon a:hover::before,
.vector-menu-tabs #ca-unwatch.icon a:hover::before {
background-color: var(--wiki-navigation-text-color--hover);
}
.vector-menu-tabs #ca-unwatch.icon .loading::before,
.vector-menu-tabs #ca-watch.icon .loading::before{
transform-origin: 50% 56.25%;
}
.vector-menu-tabs #ca-watch.icon {
/* line star */
--icon: var(--icon-star-empty);
}
.vector-menu-tabs #ca-unwatch.icon {
/* solid star */
--icon: var(--icon-star-filled);
}
/*** dropdown menu ***/
.vector-menu-dropdown .vector-menu-heading { /* "More" */
/* tab label */
position: relative;
display: flex;
align-items: center;
gap: 0.25em;
}
.vector-menu-dropdown .vector-menu-heading::after {
/* arrow icon */
content: "";
display: block;
width: 1em;
height: 1em;
margin-top: 1px; /* tweak offset */
--mask: var(--icon-chevron-down) no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: center center;
mask-position: center center;
background: unset;
background-color: var(--wiki-navigation-text-color);
filter: none;
}
.vector-menu-dropdown:hover .vector-menu-heading::after {
/* .vector-menu-heading is covered by .vector-menu-checkbox, therefore we can't use .vector-menu-heading:hover::after */
background-color: var(--wiki-navigation-text-color--hover);
}
.vector-menu-dropdown .mw-list-item a:not(.vector-icon) {
font-size: var(--wiki-navigation-dropdown-font-size, 0.8125em);
}
.vector-menu-dropdown .vector-menu-content {
/* dropdown list body */
border: none;
background: none;
left: 0; /* reset */
margin: 0; /* reset */
top: calc(100% - var(--wiki-navigation-bottom-spacing, 0px));
overflow: unset;
}
.vector-menu-dropdown .vector-menu-content ul {
border: var(--wiki-navigation-dropdown-border-width) solid var(--wiki-navigation-dropdown-border-color);
border-radius: 0 0 var(--wiki-navigation-dropdown-border-radius) var(--wiki-navigation-dropdown-border-radius);
border-image: var(--wiki-navigation-dropdown-border-image);
background: color-mix(in srgb, var(--wiki-navigation-dropdown-background-color, var(--wiki-content-background-color)) var(--wiki-navigation-dropdown-background-opacity, var(--wiki-content-background-opacity, 100%)), transparent);
box-shadow: var(--wiki-navigation-dropdown-box-shadow, var(--wiki-navigation-dropdown-shadow, none)); /* --wiki-navigation-dropdown-shadow is deprecated name */
backdrop-filter: var(--wiki-navigation-dropdown-backdrop-filter);
padding: var(--wiki-navigation-dropdown-padding, 0);
margin-top: var(--wiki-navigation-dropdown-offset, 0);
}
.vector-menu-dropdown .vector-menu-content li:hover {
background: var(--wiki-navigation-dropdown-item-background--hover, none);
}
.vector-menu-dropdown .vector-menu-content li a {
display: block;
padding: var(--wiki-navigation-dropdown-item-padding, 0);
}
.vector-menu-dropdown .vector-menu-content li a,
.vector-menu-dropdown .vector-menu-content li a:visited {
color: var(--wiki-navigation-dropdown-text-color, var(--wiki-navigation-text-color));
}
.vector-menu-dropdown .vector-menu-content li a:hover {
color: var(--wiki-navigation-dropdown-text-color--hover, var(--wiki-navigation-text-color--hover, var(--wiki-content-link-color--hover))); /* fallback for backwards compatibility */
}
/*** search form ***/
#p-search {
margin: 0;
padding: 0 calc(max(0px, var(--wiki-navigation-right-spacing, 0px))) calc(var(--wiki-navigation-search-bottom-spacing, 3px) + var(--navigation-border-bottom-width)) calc(max(0px, 3px - max(0px, var(--wiki-navigation-tab-spacing, -1px))));
z-index: 2;
position: relative;
font-size: var(--wiki-navigation-search-font-size, var(--wiki-navigation-font-size, 0.8125em));
}
.vector-search-box form {
margin: unset;
}
#p-search .searchButton {
background-color: transparent;
font-size: unset;
}
/*new search form */
.cdx-search-input--has-end-button .cdx-search-input__input-wrapper{
margin: 0;
}
.cdx-menu-item--enabled.cdx-menu-item--highlighted {
background-color: var(--wiki-navigation-search-highlight-background-color);
}
#p-search input{
line-height: 1.25; /* "normal" behaves inconsistently in different browsers */
}
#p-search input{
height: unset;
min-height: var(--wiki-navigation-search-height, 2em);
}
#p-search button{
height: unset;
min-height: var(--wiki-navigation-search-height, 2em);
min-width: var(--wiki-navigation-search-height, 2em);
top: 0;
bottom: 0;
right: 0;
background-color: color-mix(in srgb, var(--wiki-navigation-search-button-color, currentColor) var(--wiki-navigation-search-button-color-opacity, 80%), transparent);
opacity: 100%;
}
#p-search button:hover,
#p-search button:focus{
background-color: color-mix(in srgb, var(--wiki-navigation-search-button-color--hover, var(--wiki-navigation-search-button-color, currentColor)) var(--wiki-navigation-search-button-color-opacity--hover, 95%), transparent);
opacity: 100%;
}
/* top border of the content box */
#p-search::before {
content: "";
display: block;
width: calc(100% - calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width))));
height: 0;
border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color));
position: absolute;
bottom: 0;
left: 0;
}
/* top right border-radius of content area */
#p-search::after {
content: "";
display: block;
width: calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width)));
height: calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width)));
box-sizing: border-box;
border-width: var(--navigation-border-bottom-width) var(--navigation-border-bottom-width) 0 0;
border-style: var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid));
border-color: var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color));
border-radius: 0 calc(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0))) 0 0;
position: absolute;
top: calc(100% - var(--navigation-border-bottom-width));
right: 0;
}
/******************
* End vector tabs *
*******************/
/********
* Links *
*********/
a,
.mw-parser-output a.external,
.mw-parser-output a.extiw {
color: var(--wiki-content-link-color);
}
a:visited,
.mw-parser-output a.extiw:visited,
.mw-parser-output a.external:visited {
color: var(--wiki-content-link-color--visited);
}
a:not(.mw-selflink):hover,
a:visited:hover,
.mw-parser-output a.extiw:hover,
.mw-parser-output a.extiw:visited:hover,
.mw-parser-output a.external:hover,
.mw-parser-output a.external:visited:hover {
color: var(--wiki-content-link-color--hover);
}
a.new,
a.new:visited,
a.new:hover,
.mw-usertoollinks-contribs-no-edits {
color: var(--wiki-content-redlink-color);
}
a:not(.mw-selflink):active,
a:visited:active,
.mw-parser-output a.extiw:active,
.mw-parser-output a.extiw:visited:active,
.mw-parser-output a.external:active,
.mw-parser-output a.external:visited:active {
color: var(--wiki-warning-color);
}
/* link decorations */
/* move external marker to an after so we can filter it to link color */
.mw-parser-output a.external,
.sitenotice a.external {
background: none;
padding-right: 0;
}
.mw-parser-output a.external::after,
.sitenotice a.external::after,
a.extiw[title="wgg:globalprefs"]::after {
display: inline-block;
width: 1em;
height: 1em;
margin-left: 0px;
content: '';
vertical-align: text-top;
--mask: var(--icon) no-repeat;
--mask-size: 0.857em;
--mask-position: center right;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: var(--mask-size);
mask-size: var(--mask-size);
-webkit-mask-position: var(--mask-position);
mask-position: var(--mask-position);
background-color: currentColor;
}
.mw-parser-output a.external::after,
.sitenotice a.external::after {
--icon: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2212%22 viewBox=%220 0 12 12%22%3E %3Cpath d=%22M6 1h5v5L8.86 3.85 4.7 8 4 7.3l4.15-4.16L6 1ZM2 3h2v1H2v6h6V8h1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Z%22/%3E %3C/svg%3E");
}
a.extiw[title="wgg:globalprefs"]::after {
--icon: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20aria-hidden%3D%22true%22%3E%3C!----%3E%3Cg%3E%3Cg%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20transform%3D%22translate(10%2010)%22%3E%3Cpath%20id%3D%22cdx-icon-settings-a%22%20d%3D%22M1.5-10h-3l-1%206.5h5m0%207h-5l1%206.5h3%22%3E%3C%2Fpath%3E%3Cuse%20xlink%3Ahref%3D%22%23cdx-icon-settings-a%22%20transform%3D%22rotate(45)%22%3E%3C%2Fuse%3E%3Cuse%20xlink%3Ahref%3D%22%23cdx-icon-settings-a%22%20transform%3D%22rotate(90)%22%3E%3C%2Fuse%3E%3Cuse%20xlink%3Ahref%3D%22%23cdx-icon-settings-a%22%20transform%3D%22rotate(135)%22%3E%3C%2Fuse%3E%3C%2Fg%3E%3Cpath%20d%3D%22M10%202.5a7.5%207.5%200%20000%2015%207.5%207.5%200%20000-15v4a3.5%203.5%200%20010%207%203.5%203.5%200%20010-7%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E");
}
.plainlinks a.external::after,
.plainlinks a.extiw[title="wgg:globalprefs"]::after {
display: none;
}
/*
Using a background instead of an ::after prevents the icon from wrapping onto its own line,
but prevents it from being recolored. Use this only for icons that should not be recolored, otherwise
use the ::after method used for external links above
*/
a.extiw[title^="wikipedia:"],
a.extiw[title^="wp:"],
a.extiw[title^="mw:"],
a.extiw[title^="support:"] {
padding-right: 1em;
background-position: center right;
background-repeat: no-repeat;
background-size: 0.857em;
}
a.extiw[title^="wikipedia:"],
a.extiw[title^="wp:"] {
background-image: url(https://commons.wiki.gg/images/2/28/Wikipedia.svg?202406)
}
a.extiw[title^="mw:"] {
background-image: url(https://commons.wiki.gg/images/9/9b/MediaWiki.svg?202406)
}
a.extiw[title^="support:"] {
background-image: url(https://commons.wiki.gg/images/9/9b/Wiki.gg_icon-pink.svg)
}
.plainlinks a.extiw {
background-image:none;
}
/************
* End links *
*************/
/***************
* Left Sidebar *
****************/
#mw-panel {
width: var(--wiki-sidebar-width, 10em);
box-sizing: border-box;
position: relative;
z-index: 1; /* above #footer */
top: calc(-1 * var(--wiki-is-navigation-inside-content, 0) * (var(--wiki-navigation-height) + var(--wiki-content-border-width,1px)) + var(--wiki-sidebar-offset, 0px));
margin-top: calc((1 - var(--wiki-is-top-logo, 0)) * (var(--wiki-logo-file-height, 160) / var(--wiki-logo-file-width, 160) * var(--wiki-sidebar-width, 10em) + var(--wiki-logo-margin, 15px))); /* if is-top-logo, logo-file ratio * sidebar-width + logo-margin, else 0 */
padding: var(--wiki-sidebar-box-padding, 0);
background: var(--wiki-sidebar-box-background, none);
border: var(--wiki-sidebar-box-border, 0);
border-image: var(--wiki-sidebar-box-border-image, none);
}
#mw-panel .vector-menu-portal {
background-color: color-mix(in srgb, var(--wiki-sidebar-background-color) var(--wiki-sidebar-background-opacity), transparent);
background-image: var(--wiki-sidebar-background-image, none);
background-size: var(--wiki-sidebar-background-size, auto);
background-repeat: var(--wiki-sidebar-background-repeat, repeat);
background-position: var(--wiki-sidebar-background-position, center);
border: var(--wiki-sidebar-border-width, 1px) var(--wiki-sidebar-border-style, solid) var(--wiki-sidebar-border-color);
border-image: var(--wiki-sidebar-border-image, none);
margin: 0 var(--wiki-sidebar-margin, 0.5em);
padding: var(--wiki-sidebar-padding, 0);
filter: var(--wiki-sidebar-filter, none);
backdrop-filter: var(--wiki-sidebar-backdrop-filter, none);
overflow: hidden; /* to prevent overflow when combining border-radius with heading background */
}
#mw-panel #p-ext-discordwidget{
backdrop-filter: none;
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
#mw-panel .vector-menu-portal {
background-color: var(--wiki-sidebar-background-color);
}
}
#mw-panel .vector-menu-portal + .vector-menu-portal {
border-top-width: 0;
}
#mw-panel .vector-menu-portal:last-child {
margin-bottom: 0;
}
/* Sidebar spacing and border-radius section */
#mw-panel .vector-menu-portal:not(:last-child) {
margin-bottom: var(--wiki-sidebar-portal-spacing);
}
#mw-panel #p-logo + .vector-menu-portal,
#mw-panel #p-ext-discordwidget + .vector-menu-portal {
/*
The way this works is that if the sidebar does not have any spacing, only the top and bottom corners
of the top and bottom portals respectively should be rounded, instead of all corners of every portal.
min and calc are combined here to basically create an `if x > 0 then y else z` function.
The lower of (sidebar-border-radius) and (spacing * 999) are compared and the smaller value is taken (999 is simply an arbitrary large number).
If portal spacing is zero, multiplying it gets 0 and will be the smaller value. If it's non-zero, it will be large and sidebar-border-radius will be the smaller value.
This is only applied to the "inner" corners because we'd want the "outer" corners rounded in either scenario.
*/
border-radius: var(--wiki-sidebar-border-radius) var(--wiki-sidebar-border-radius) calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)) calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999));
}
#mw-panel .vector-menu-portal:last-child {
/* see rule above for explanation */
border-radius: calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)) calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)) var(--wiki-sidebar-border-radius) var(--wiki-sidebar-border-radius);
}
#mw-panel .vector-menu-portal {
/* see above rules for explanation */
border-radius: calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999));
}
#mw-panel .vector-menu-portal + .vector-menu-portal {
/* This keeps the border from doubling up if there is no spacing between them,
The portals other than the first only have a top border if there is spacing */
border-top-width: min(var(--wiki-sidebar-border-width, 1px), var(--wiki-sidebar-portal-spacing, 0px)); /* the 1px and 0px fallbacks are for backwards compatibility with older versions of the loadout */
}
#mw-panel #p-ext-discordwidget + .vector-menu-portal {
border-top-width: var(--wiki-sidebar-border-width, 1px);
}
/* end sidebar spacing and border-radius */
.vector-menu-portal .vector-menu-heading {
padding: var(--wiki-sidebar-heading-padding, 0.5rem 0.25rem 0.5rem 0.5rem);
margin: var(--wiki-sidebar-heading-margin, 0 0 var(--wiki-sidebar-heading-margin-bottom, -0.5rem) 0); /* --wiki-sidebar-heading-margin-bottom is deprecated */
background: var(--wiki-sidebar-heading-background, none);
border-image: var(--wiki-sidebar-heading-border-image, none);
color: var(--wiki-sidebar-heading-color);
font-family: var(--wiki-sidebar-heading-font-family);
font-size: var(--wiki-sidebar-heading-font-size, 0.75em);
font-weight: var(--wiki-sidebar-heading-font-weight, normal);
font-style: var(--wiki-sidebar-heading-font-style, normal);
text-transform: var(--wiki-sidebar-heading-text-transform, none);
line-height: var(--wiki-sidebar-heading-line-height, normal);
text-shadow: var(--wiki-sidebar-heading-text-shadow, none)
}
.vector-menu-portal .vector-menu-content {
margin: var(--wiki-sidebar-list-margin, 0);
padding: var(--wiki-sidebar-list-padding, 0.25rem);
background: var(--wiki-sidebar-list-background, none);
border-image: var(--wiki-sidebar-list-border-image, none);
}
.vector-menu-portal .vector-menu-content ul {
padding: 0;
display: flex;
flex-direction: column;
gap: var(--wiki-sidebar-list-item-spacing, 0);
}
.vector-menu-portal .vector-menu-content li {
font-size: var(--wiki-sidebar-font-size, 0.75em);
line-height: var(--wiki-sidebar-line-height, 1.125em);
padding: 0;
background: var(--wiki-sidebar-list-item-background, none);
border-image: var(--wiki-sidebar-list-item-border-image, none);
}
.vector-menu-portal .vector-menu-content li:hover {
background: var(--wiki-sidebar-list-item-background--hover, var(--wiki-sidebar-list-item-background, none));
border-image: var(--wiki-sidebar-list-item-border-image--hover, var(--wiki-sidebar-list-item-border-image, none));
}
.vector-menu-portal .vector-menu-content li a {
display: block;
padding: var(--wiki-sidebar-list-item-padding, 0.25em 0.25rem);
}
.vector-menu-portal .vector-menu-content li a.feedlink{ /* Atom */
background: none;
}
.vector-menu-portal .vector-menu-content .mw-list-item a,
.vector-menu-portal .vector-menu-content .mw-list-item a:visited,
.vector-menu-portal .vector-menu-content li a,
.vector-menu-portal .vector-menu-content li a:visited {
color: var(--wiki-sidebar-link-color);
}
.vector-menu-portal .vector-menu-content .mw-list-item a:hover,
.vector-menu-portal .vector-menu-content .mw-list-item a:visited:hover {
color: var(--wiki-sidebar-link-color--hover, var(--wiki-content-link-color--hover)); /* fallback for backwards compatibility */
}
#t-newpage {
--sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 384 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128z%22%2F%3E%3C%2Fsvg%3E');
order: -1;
}
#t-upload {
--sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 512 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M288 109.3V352c0 17.7-14.3 32-32 32s-32-14.3-32-32V109.3l-73.4 73.4c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l128-128c12.5-12.5 32.8-12.5 45.3 0l128 128c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L288 109.3zM64 352H192c0 35.3 28.7 64 64 64s64-28.7 64-64H448c35.3 0 64 28.7 64 64v32c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V416c0-35.3 28.7-64 64-64zM432 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48z%22%2F%3E%3C%2Fsvg%3E');
order: -1;
}
#t-print {
--sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 512 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zM432 248a24 24 0 1 1 0 48 24 24 0 1 1 0-48z%22%2F%3E%3C%2Fsvg%3E');
order: -1;
}
#t-whatlinkshere {
--sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 640 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z%22%2F%3E%3C%2Fsvg%3E');
order: -1;
}
#t-specialpages {
--sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 576 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z%22%2F%3E%3C%2Fsvg%3E');
order: -1;
}
#t-cargopagevalueslink {
--sidebar-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 126.971 136.024'%3E%3Cpath d='m105.999 0-84 .049L0 8.957v127.065h126.97V8.957Z' fill='none' display='inline' opacity='1' paint-order='normal'/%3E%3Cpath d='m9.735 8.774 12.265-5h84l12.25 5H9.75' fill='%23000' fill-opacity='1' display='inline'/%3E%3Cpath d='M3.5 41.024H28v63.5H3.5zm95.5 0h24.5v63.5H99zm-95.5 67.5H123v24H3.5zm0-95.5H123v24H3.5zm27.985 28V59.67l13.61 13.61 17.323 17.324 1.788 1.787 12.131 12.132h19.147v-16.21l-13.6-13.6-1.788-1.787-17.325-17.324-14.578-14.579H31.485zm45.865 0-12.2 12.2 17.324 17.324 13.01-13.01V41.024H77.35zM42.716 75.658l-11.23 11.231v17.634h17.013l11.541-11.54-17.324-17.325z' fill='%23000' fill-opacity='1' fill-rule='nonzero' display='inline' opacity='1' paint-order='normal'/%3E%3C/svg%3E");
order: -1;
}
#feedlinks{
--sidebar-icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg baseProfile='tiny' height='24px' id='Layer_1' version='1.2' viewBox='0 0 24 24' width='24px' xml:space='preserve' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M6.002,15.999C4.895,15.999,3.998,16.896,4,18c0,1.104,0.896,2.001,2.002,1.999C7.105,20.001,8.002,19.105,8,18 C8.002,16.893,7.105,15.997,6.002,15.999z'/%3E%3Cpath d='M6,4C4.896,4,4,4.896,4,6s0.896,2,2,2c5.514,0,10,4.486,10,10c0,1.104,0.896,2,2,2s2-0.896,2-2C20,10.28,13.72,4,6,4z'/%3E%3Cpath d='M6,10c-1.104,0-2,0.896-2,2s0.896,2,2,2c2.205,0,4,1.794,4,4c0,1.104,0.896,2,2,2s2-0.896,2-2C14,13.589,10.411,10,6,10z'/%3E%3C/svg%3E");
order: -1;
}
#t-specialpages > a::before,
#t-whatlinkshere > a::before,
#t-print > a::before,
#t-newpage > a::before,
#t-upload > a::before,
#t-cargopagevalueslink > a::before,
#feedlinks > a::before {
content: '';
background-image: var(--sidebar-icon);
background-size: contain;
background-repeat: no-repeat;
background-position: center;
display: inline-block;
width: 1.25em;
height: 1.25em;
}
#p-tb .mw-list-item > a::before {
filter: var(--wiki-sidebar-icon-to-link-filter, var(--wiki-icon-to-link-filter));
}
#p-tb .mw-list-item > a {
display: flex;
align-items: center;
gap: 3px;
}
/*******************
* End left sidebar *
********************/
/*******
* Logo *
********/
/* [[File:Site-logo.png]] */
#p-logo {
width: var(--wiki-logo-box-width);
height: var(--wiki-logo-box-height);
position: absolute;
top: calc(-1 * ( (var(--wiki-navigation-height, 3rem) + var(--wiki-logo-box-height) + var(--wiki-logo-margin, 15px) - var(--wiki-is-navigation-inside-content, 0) * (var(--wiki-navigation-height)) + var(--wiki-sidebar-offset, 0px)) * var(--wiki-is-top-logo, 0)
+ (var(--wiki-logo-box-height) + var(--wiki-logo-margin,15px)) * (1 - var(--wiki-is-top-logo, 0)) ));
left: calc((min((100vw - var(--wiki-left-spacing, 0.5em) - var(--wiki-right-spacing, 0px) - 18px), var(--wiki-page-content-max-width, 9999px)) - var(--wiki-logo-box-width)) / 2 * var(--wiki-is-top-logo, 0));
margin: 0;
filter: var(--wiki-logo-filter, none);
}
#p-logo a {
background-size: contain;
position: absolute;
top: var(--wiki-logo-offset-y, 0);
left: var(--wiki-logo-offset-x, 0);
bottom: 0;
right: 0;
width: 100%;
height: 100%;
background-image: var(--wiki-logo-image, url(filepath://Site-logo.png)); /* The canonical logo must be Site-logo.png. This variable is mainly used to provide different logo for different themes. */
}
/***********
* End logo *
************/
/***************
* Content area *
****************/
.content-wrapper {
max-width: var(--wiki-page-content-max-width, none);
margin-left: auto;
margin-right: auto;
}
.mw-body,
.parsoid-body {
color: var(--wiki-content-text-color);
background-color: color-mix(in srgb, var(--wiki-content-background-color) var(--wiki-content-background-opacity), transparent);
margin-left: calc(var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em));
margin-top: unset;
border-top: 0;
border-left: var(--wiki-content-border-width, 1px) solid transparent;
border-right: var(--wiki-content-border-width, 1px) solid transparent;
border-bottom: var(--wiki-content-border-bottom-width, 1px) solid transparent;
border-radius: calc((1 - var(--wiki-is-navigation-inside-content, 0)) * min(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)), var(--wiki-navigation-left-spacing, 0px))) calc((1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px)));
position: relative;
border-image: var(--wiki-content-border-image, none);
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
.mw-body,
.parsoid-body {
background-color: var(--wiki-content-background-color);
}
}
/* apply backdrop-filter on .mw-body results in the creation of a containing block for absolute and fixed positioned descendants, so we have to move it to here */
.mw-body::before,
.parsoid-body::before{
content: '';
display: block;
backdrop-filter: var(--wiki-content-backdrop-filter, none);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: -1;
border-radius: calc((1 - var(--wiki-is-navigation-inside-content, 0)) * min(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)), var(--wiki-navigation-left-spacing, 0px))) calc((1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))); /* as .mw-body */
}
.mw-body::after,
.parsoid-body::after {
content: '';
display: block;
box-sizing: border-box;
position: absolute;
left: calc(-1 * var(--wiki-content-border-width, 1px));
right: calc(-1 * var(--wiki-content-border-width, 1px));
top: calc(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)));
bottom: calc(-1 * var(--wiki-content-border-bottom-width, 1px));
pointer-events: none;
border-left: var(--wiki-content-border-width, 1px) var(--wiki-content-border-style, solid) var(--wiki-content-border-color);
border-right: var(--wiki-content-border-width, 1px) var(--wiki-content-border-style, solid) var(--wiki-content-border-color);
border-bottom: var(--wiki-content-border-bottom-width, 1px) var(--wiki-content-border-bottom-style, solid) var(--wiki-content-border-bottom-color, var(--wiki-content-border-color));
border-radius: 0 0 calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px)));
}
#mw-data-after-content {
max-width: calc(var(--wiki-page-content-max-width) - var(--wiki-sidebar-width) - var(--wiki-gap-between-sidebar-and-content));
margin-left: calc(var(--wiki-sidebar-width) + var(--wiki-gap-between-sidebar-and-content) + max(0px, 100% - var(--wiki-page-content-max-width)) / 2);
box-sizing: border-box;
color: var(--wiki-content-text-color);
background-color: color-mix(in srgb, var(--wiki-content-background-color) var(--wiki-content-background-opacity), transparent);
}
#mw-data-after-content .read-more-container {
border: var(--wiki-content-border-width, 1px) var(--wiki-content-border-style, solid) var(--wiki-content-border-color);
border-top-width: 0;
border-bottom: var(--wiki-content-border-bottom-width, 1px) var(--wiki-content-border-bottom-style, solid) var(--wiki-content-border-bottom-color, var(--wiki-content-border-color));
padding: 1em;
margin: 0;
}
#mw-data-after-content .read-more-container:empty {
display: none;
}
@media screen and (min-width: 982px) {
#mw-data-after-content .read-more-container {
padding: 1.25em 1.5em 1.5em 1.5em;
}
}
.mw-footer {
max-width: calc(var(--wiki-page-content-max-width, 9999px) - var(--wiki-sidebar-width, 10em) - var(--wiki-gap-between-sidebar-and-content, 0.5em));
box-sizing: border-box;
background-color: color-mix(in srgb, var(--wiki-footer-background-color, var(--wiki-content-background-color)) var(--wiki-footer-background-opacity, var(--wiki-content-background-opacity)), transparent);
border: var(--wiki-footer-border-width, 1px) var(--wiki-footer-border-style, solid) var(--wiki-footer-border-color, var(--wiki-content-border-color));
border-top-width: calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-footer-border-width, 1px)));
margin-top: var(--wiki-spacing-before-footer, 0px);
border-radius: calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px)))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px)))) var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px)) var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px));
margin-left: calc(var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em) + max(0px, 100% - var(--wiki-page-content-max-width, 9999px)) / 2);
color: var(--wiki-footer-text-color);
border-image: var(--wiki-footer-border-image, none);
backdrop-filter: var(--wiki-footer-backdrop-filter, none);
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
.mw-footer {
background-color: var(--wiki-footer-background-color, var(--wiki-content-background-color));
}
}
.mw-footer li {
color: var(--wiki-footer-text-color);
}
.mw-footer a,
.mw-footer a:visited {
color: var(--wiki-footer-link-color);
}
.mw-footer a:hover,
.mw-footer a:visited:hover {
color: var(--wiki-footer-link-color--hover);
}
/* fix */
@media screen and (max-width: 900px) {
#footer-icons, #footer-places {
clear: unset;
}
}
/*******************************
* End content area and footer *
*******************************/
/***********
* Headings *
************/
.mw-body h1 {
border-bottom: var(--wiki-content-firstheading-border-bottom-width, var(--wiki-content-heading-border-bottom-width, 1px)) var(--wiki-content-firstheading-border-style, var(--wiki-content-heading-border-style, solid)) var(--wiki-content-firstheading-border-color, var(--wiki-content-heading-border-color, var(--wiki-content-border-color)));
font-size: var(--wiki-content-firstheading-font-size, 1.8em);
font-family: var(--wiki-content-firstheading-font-family, var(--wiki-content-heading-font-family));
font-weight: var(--wiki-content-firstheading-font-weight, var(--wiki-content-heading-font-weight));
font-style: var(--wiki-content-firstheading-font-style, var(--wiki-content-heading-font-style));
text-transform: var(--wiki-content-firstheading-text-transform, var(--wiki-content-heading-text-transform));
line-height: var(--wiki-content-firstheading-line-height, var(--wiki-content-heading-line-height));
color: var(--wiki-content-firstheading-color, var(--wiki-content-heading-color));
text-shadow: var(--wiki-content-firstheading-text-shadow, var(--wiki-content-heading-text-shadow, none));
}
.mw-body h2 {
border-bottom: var(--wiki-content-heading-border-bottom-width, 1px) var(--wiki-content-heading-border-style, solid) var(--wiki-content-heading-border-color, var(--wiki-content-border-color));
font-size: var(--wiki-content-heading-h2-font-size, 1.5em);
font-family: var(--wiki-content-heading-font-family);
font-weight: var(--wiki-content-heading-font-weight, normal);
font-style: var(--wiki-content-heading-font-style, normal);
text-transform: var(--wiki-content-heading-text-transform, none);
line-height: var(--wiki-content-heading-line-height, normal);
color: var(--wiki-content-heading-color);
text-shadow: var(--wiki-content-heading-text-shadow, none);
}
.mw-body h3,
.mw-body h4,
.mw-body h5,
.mw-body h6{
border-bottom: var(--wiki-content-subheading-border-bottom-width, 0) var(--wiki-content-subheading-border-style, var(--wiki-content-heading-border-style, solid)) var(--wiki-content-subheading-border-color, var(--wiki-content-heading-border-color, var(--wiki-content-border-color)));
font-family: var(--wiki-content-subheading-font-family, var(--wiki-body-font-family));
font-weight: var(--wiki-content-subheading-font-weight, bold);
font-style: var(--wiki-content-subheading-font-style, normal);
text-transform: var(--wiki-content-subheading-text-transform, none);
line-height: var(--wiki-content-subheading-line-height, var(--wiki-content-heading-line-height));
color: var(--wiki-content-subheading-color, var(--wiki-content-heading-color));
text-shadow: var(--wiki-content-subheading-text-shadow, var(--wiki-content-heading-text-shadow, none));
}
.mw-body h3{
font-size: var(--wiki-content-heading-h3-font-size, 1.2em);
}
.mw-body h4{
font-size: var(--wiki-content-heading-h4-font-size, 114%);
}
.mw-body h5{
font-size: var(--wiki-content-heading-h5-font-size, 108%);
}
.mw-body h6{
font-size: var(--wiki-content-heading-h6-font-size, 100%);
}
.mw-editsection-bracket,
.mw-editsection-divider {
color: var(--wiki-content-heading-color);
}
/***************
* End headings *
****************/
/*************
* Wikitables *
**************/
.wikitable {
background: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.wikitable > tr > th,
.wikitable > * > tr > th {
background: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
}
.wikitable > tr > td,
.wikitable > * > tr > td {
border: 1px solid var(--wiki-content-border-color);
}
/* Forward = yes bg on Special:Interwiki */
table.mw-interwikitable.body td.mw-interwikitable-local-yes {
background: color-mix(in srgb, var(--wiki-success-color) 25%, transparent);
}
.zebra-table > * > tr:nth-of-type(2n),
.zebra-table > tr:nth-of-type(2n) {
background: color-mix(in srgb, var(--wiki-content-dynamic-color--secondary) 5%, transparent);
}
.client-js .sortable:not(.jquery-tablesorter) > * > tr:first-child > th:not(.unsortable),
.jquery-tablesorter th.headerSort {
background-image: unset;
position: relative;
}
.client-js .sortable:not(.jquery-tablesorter) > * > tr:first-child > th:not(.unsortable)::after,
.jquery-tablesorter th.headerSort::after {
content: "";
display: block;
position: absolute;
top: 0;
right: 0;
width: 21px;
height: 100%;
--mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%229%22 viewBox=%220 0 21 9%22%3E %3Cpath d=%22m14.5 5-4 4-4-4zm0-1-4-4-4 4z%22 fill=%22%23fff%22/%3E %3C/svg%3E") no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: auto;
mask-size: auto;
-webkit-mask-position: center right;
mask-position: center right;
background-color: var(--wiki-content-link-color);
}
.jquery-tablesorter th.headerSortUp::after {
--mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%224%22 viewBox=%220 0 21 4%22%3E %3Cpath d=%22m6.5 4 4-4 4 4z%22 fill=%22%23fff%22/%3E %3C/svg%3E") no-repeat;
}
.jquery-tablesorter th.headerSortDown::after {
--mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%224%22 viewBox=%220 0 21 4%22%3E %3Cpath d=%22m14.5 0-4 4-4-4z%22 fill=%22%23fff%22/%3E %3C/svg%3E") no-repeat;
}
/*****************
* End wikitables *
******************/
/**************
* Preferences *
***************/
.mw-prefs-tabs-wrapper.oo-ui-panelLayout-framed,
.mw-prefs-tabs > .oo-ui-menuLayout-content > .oo-ui-indexLayout-stackLayout > .oo-ui-tabPanelLayout {
border: none;
}
.oo-ui-tabSelectWidget-framed {
background-color: transparent;
border-bottom: 1px solid var(--wiki-accent-color);
}
.oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled,
.oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
background-color: color-mix(in srgb, var(--wiki-accent-label-color) 75%, transparent);
color: var(--wiki-accent-color);
}
.oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
color: var(--wiki-accent-color--hover);
}
.oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected,
.oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled.oo-ui-optionWidget-selected:hover {
background-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected .oo-ui-labelElement-label {
border-bottom: none;
}
#preferences .mw-htmlform-submit-buttons {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle,
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled,
.oo-ui-textInputWidget .oo-ui-inputWidget-input,
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input[readonly]:not(.oo-ui-pendingElement-pending) {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border-color: var(--wiki-content-border-color);
}
.oo-ui-pendingElement-pending {
background-color: var(--wiki-content-background-color--secondary);
background-image: linear-gradient(135deg, var(--wiki-content-background-color) 25%, transparent 25%, transparent 50%, var(--wiki-content-background-color) 50%, var(--wiki-content-background-color) 75%, transparent 75%, transparent);
}
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
color: var(--wiki-content-text-color);
border-color: var(--wiki-content-border-color)
}
.view-dark .oo-ui-inputWidget-input.oo-ui-indicator-down {
background-image: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2212%22 viewBox=%220 0 12 12%22%3E%3Ctitle%3E down %3C/title%3E%3Cg fill=%22%23fff%22%3E%3Cpath d=%22M9.9 2.9 6 6.8 2.1 2.9 1 4l5 5 5-5z%22/%3E%3C/g%3E%3C/svg%3E");
}
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover {
color: var(--wiki-content-text-mix-color);
border-color: var(--wiki-accent-color);
}
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active {
color: var(--wiki-content-dynamic-color);
border-color: var(--wiki-accent-color)
}
.oo-ui-dropdownInputWidget select option,
.oo-ui-dropdownInputWidget select optgroup {
color: #000;
}
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:hover,
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:focus,
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:active,
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled:hover,
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled:focus,
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled:active,
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover .oo-ui-inputWidget-input,
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled:active .oo-ui-inputWidget-input,
.oo-ui-textInputWidget.oo-ui-widget-enabled:hover .oo-ui-inputWidget-input:focus {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border-color: var(--wiki-accent-color);
box-shadow: none;
}
.oo-ui-radioInputWidget [type="radio"] + span {
background-color: var(--wiki-content-dynamic-color--inverted);
}
.oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked + span,
.oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:hover + span {
border-color: color-mix(in srgb, var(--wiki-accent-color) 90%, transparent);
}
.oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:hover + span {
border-color: var(--wiki-accent-color);
}
.oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span,
.oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:active + span {
background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
}
.oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:focus + span::before {
border-color: var(--wiki-content-dynamic-color--inverted);
}
.oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:active + span {
border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
}
.oo-ui-menuOptionWidget.oo-ui-widget-enabled.oo-ui-optionWidget {
color: var(--wiki-content-text-color);
border-color: var(--wiki-content-text-mix-color);
}
.oo-ui-menuOptionWidget.oo-ui-optionWidget.oo-ui-optionWidget-selected,
.oo-ui-menuOptionWidget.oo-ui-optionWidget.oo-ui-optionWidget-highlighted,
.oo-ui-menuOptionWidget.oo-ui-optionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected,
.oo-ui-dropdownWidget.oo-ui-widget-enabled.oo-ui-dropdownWidget-open .oo-ui-dropdownWidget-handle {
background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);
color: var(--wiki-content-text-color);
}
.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
.oo-ui-menuOptionWidget.oo-ui-optionWidget-pressed.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent);
color: var(--wiki-accent-color);
}
.mw-prefs-tabs.mw-prefs-tabs-searching .oo-ui-tabPanelLayout.mw-prefs-search-matched > fieldset > legend {
background: var(--wiki-content-background-color--secondary);
}
.mw-prefs-search-highlight {
background-color: color-mix(in srgb, var(--wiki-accent-color) 7%, transparent) !important;
outline-color: color-mix(in srgb, var(--wiki-accent-color) 7%, transparent) !important;
}
/****************
* End preferences *
*****************/
/***************
* Page history *
****************/
#pagehistory li {
background-color: transparent;
border: none;
}
#pagehistory li.selected {
background-color: var(--wiki-content-background-color--secondary);
border: 1px dashed var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.diff td.diff-addedline {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-success-color);
border-width: 1px 1px 1px 4px;
}
.diff td.diff-addedline .diffchange {
background-color: var(--wiki-success-color);
color: var(--wiki-success-label-color);
}
.diff td.diff-deletedline {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-alert-color);
border-width: 1px 1px 1px 4px;
}
.diff td.diff-deletedline .diffchange {
background-color: var(--wiki-alert-color);
color: var(--wiki-alert-label-color)
}
.diff td.diff-context {
background: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 80%, var(--wiki-content-background-color));
border-color: var(--wiki-neutral-color, var(--wiki-content-text-mix-color)); /* fallback for backwards compatibility */
color: var(--wiki-content-text-color);
}
.diff-marker a.mw-diff-movedpara-right {
color: transparent;
}
.diff-marker a.mw-diff-movedpara-right:hover:after {
opacity: .75;
}
.diff-marker a.mw-diff-movedpara-right:after {
color: var(--wiki-content-text-color);
content: "\21a9";
}
.diff-marker a.mw-diff-movedpara-left {
color: transparent;
}
.diff-marker a.mw-diff-movedpara-left:hover:after {
opacity: .75;
}
.diff-marker a.mw-diff-movedpara-left:after {
color: var(--wiki-content-text-color);
content: "\21aa";
}
.mw-plusminus-neg {
color: var(--wiki-alert-color);
}
.mw-plusminus-null {
color: var(--wiki-neutral-color, var(--wiki-content-text-mix-color)); /* fallback for backwards compatibility */
}
.mw-plusminus-pos {
color: var(--wiki-success-color);
}
.updatedmarker {
background-color: color-mix(in srgb, var(--wiki-success-color) 25%, transparent);
color: var(--wiki-content-text-color);
}
li span.deleted,
span.history-deleted {
color: var(--wiki-content-text-mix-color);
}
span.mw-history-suppressed {
/* overrides above, since suppressed is also deleted */
color: var(--wiki-content-text-color);
}
/* inline diff (1.41) */
.mw-diff-inline-header {
border-bottom: 1px solid var(--wiki-content-border-color);
}
.mw-diff-inline-added ins,
.mw-diff-inline-changed ins,
.mw-diff-inline-moved ins,
.mw-diff-table-prefix .mw-diff-inline-legend .mw-diff-inline-legend-ins,
.mw-diff-inline-added.mw-diff-empty-line::after,
.mw-inline-diff-newline::after {
background: color-mix(in srgb, var(--wiki-success-color) 90%, transparent);
color: var(--wiki-success-label-color);
display: inline-block;
}
.mw-diff-inline-added.mw-diff-empty-line::after,
.mw-diff-inline-deleted.mw-diff-empty-line::after,
.mw-inline-diff-newline::after {
padding: 0.4em 0;
}
.mw-diff-inline-deleted del,
.mw-diff-inline-changed del,
.mw-diff-inline-moved del,
.mw-diff-table-prefix .mw-diff-inline-legend .mw-diff-inline-legend-del,
.mw-diff-inline-deleted.mw-diff-empty-line::after {
background: color-mix(in srgb, var(--wiki-alert-color) 90%, transparent);
color: var(--wiki-alert-label-color);
display: inline-block;
}
.mw-diff-movedpara-left::after,
.mw-diff-movedpara-right::after {
color: var(--wiki-content-text-color);
}
.ve-ui-diffElement-hasDescriptions .ve-ui-diffElement-content {
border-right-color: var(--wiki-content-border-color);
}
.ve-ui-diffElement-attributeChange {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-diffElement-attributeChange ins {
background-color: color-mix(in srgb, var(--wiki-success-color) 90%, transparent);
box-shadow: 0 0 0 1px color-mix(in srgb, var(--wiki-success-color) 90%, transparent);
color: var(--wiki-success-label-color);
}
.ve-ui-diffElement-attributeChange del {
background-color: color-mix(in srgb, var(--wiki-alert-color) 90%, transparent);
box-shadow: 0 0 0 1px color-mix(in srgb, var(--wiki-alert-color) 90%, transparent);
color: var(--wiki-alert-label-color);
}
.ve-ui-diffElement-highlight {
outline-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
}
.ve-ui-changeDescriptionsSelectWidget > .oo-ui-optionWidget-highlighted {
background: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);
}
/* Edit conflict */
.mw-twocolconflict-split-tour-image-dual-column-view-1 {
filter: var(--wiki-icon-general-filter);
}
.mw-twocolconflict-split-tour-image-blue-dot {
filter: brightness(0) var(--wiki-icon-to-link-filter);
}
.mw-pulsating-dot::before, .mw-pulsating-dot::after {
background-color: var(--wiki-content-link-color);
}
.mw-twocolconflict-split-current-version-header .mw-twocolconflict-revision-label {
background-color: var(--wiki-alert-color);
color: var(--wiki-alert-label-color);
}
.mw-twocolconflict-special-your-version-header .mw-twocolconflict-revision-label,
.mw-twocolconflict-split-your-version-header .mw-twocolconflict-revision-label {
background-color: var(--wiki-success-color);
color: var(--wiki-success-label-color);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-copy,
.mw-twocolconflict-split-column.mw-twocolconflict-split-copy {
border-color: var(--wiki-neutral-color, var(--wiki-content-text-mix-color)); /* fallback for backwards compatibility */
background-color: var(--wiki-content-text-mix-color-95);
}
.mw-twocolconflict-single-column .mw-twocolconflict-split-collapsed .mw-twocolconflict-split-fade,
.mw-twocolconflict-split-column .mw-twocolconflict-split-collapsed .mw-twocolconflict-split-fade {
background-image: linear-gradient(transparent, var(--wiki-content-text-mix-color-95));
}
.mw-twocolconflict-single-column,
.mw-twocolconflict-split-column {
background-color: var(--wiki-content-background-color);
color: var(--wiki-content-text-color);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-unselected,
.mw-twocolconflict-split-column.mw-twocolconflict-split-unselected {
color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-delete,
.mw-twocolconflict-split-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-delete {
border-color: color-mix(in srgb, var(--wiki-alert-color) 40%, transparent);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-delete,
.mw-twocolconflict-split-column.mw-twocolconflict-split-delete {
border-color: var(--wiki-alert-color);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-add,
.mw-twocolconflict-split-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-add {
border-color: color-mix(in srgb, var(--wiki-success-color) 40%, transparent);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-add,
.mw-twocolconflict-split-column.mw-twocolconflict-split-add {
border-color: var(--wiki-success-color);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange,
.mw-twocolconflict-split-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange {
background-color: color-mix(in srgb, var(--wiki-alert-color) 30%, transparent);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange,
.mw-twocolconflict-split-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange,
.mw-twocolconflict-single-column del.mw-twocolconflict-diffchange,
.mw-twocolconflict-split-column del.mw-twocolconflict-diffchange {
background-color: var(--wiki-alert-color);
color: var(--wiki-alert-label-color);
}
.mw-twocolconflict-single-column.mw-twocolconflict-split-unselected ins.mw-twocolconflict-diffchange,
.mw-twocolconflict-split-column.mw-twocolconflict-split-unselected ins.mw-twocolconflict-diffchange,
.mw-twocolconflict-single-column ins.mw-twocolconflict-diffchange,
.mw-twocolconflict-split-column ins.mw-twocolconflict-diffchange {
background-color: var(--wiki-success-color);
color: var(--wiki-success-label-color);
}
.mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked + span,
.mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span,
.mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget [type="radio"] + span {
border-color: color-mix(in srgb, var(--wiki-success-color) 80%, transparent);
background: color-mix(in srgb, var(--wiki-success-color) 10%, transparent);
}
.mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span,
.mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget [type="radio"] + span {
border-color: color-mix(in srgb, var(--wiki-success-color) 90%, transparent);
background: color-mix(in srgb, var(--wiki-success-color) 10%, transparent);
}
.mw-twocolconflict-split-selection > div:nth-child(1) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked + span,
.mw-twocolconflict-split-selection > div:nth-child(1) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span,
.mw-twocolconflict-split-selection > div:nth-child(1) .oo-ui-radioInputWidget [type="radio"] + span {
border-color: color-mix(in srgb, var(--wiki-alert-color) 90%, transparent);
background: color-mix(in srgb, var(--wiki-alert-color) 10%, transparent);
}
.mw-twocolconflict-split-editable .mw-twocolconflict-split-editor {
color: var(--wiki-content-text-color);
}
/**/
/*******************
* End page history *
********************/
/********************
* Table of contents *
*********************/
#toc,
.toc,
.toccolours,
.mw-warning {
background: var(--wiki-content-toc-background, var(--wiki-content-background-color--secondary));
border-width: var(--wiki-content-toc-border-width, 1px);
border-style: var(--wiki-content-toc-border-style, solid);
border-color: var(--wiki-content-toc-border-color, var(--wiki-content-border-color));
border-radius: var(--wiki-content-toc-border-radius, 0px);
border-image: var(--wiki-content-toc-border-image, none);
box-shadow: var(--wiki-content-toc-box-shadow, none);
}
#mw-toc-heading {
border: 0;
}
.toctogglelabel {
color: var(--wiki-content-link-color);
}
.tocnumber {
color: var(--wiki-content-text-color);
}
/************************
* End table of contents *
*************************/
/*************
* Thumbnails *
**************/
img.thumbborder {
border: 1px solid var(--wiki-content-border-color);
padding: 5px;
}
div.thumbinner {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
li.gallerybox div.thumb {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
}
html .thumbimage {
background-color: unset;
border: 1px solid var(--wiki-content-border-color);
}
.thumb,
.thumb .thumbinner,
.thumb .thumbimage {
max-width: 100%;
box-sizing: border-box;
}
.thumb .thumbimage:not(audio) {
height: auto;
}
body.skin--responsive .mw-parser-output .thumb .thumbinner > .thumbcaption {
width: revert;
}
/* packed-overlay and packed-hover modes for galleries */
ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 65%, transparent);
}
/* for non-thumbnail left floaters, increased margin from 0.5em to account for <ul> */
div.floatleft,
table.floatleft {
margin-right: 1.4em;
}
/* Responsive floating thumbnails */
@media screen and (max-width: 720px) {
div.tright,
div.floatright,
div.tleft,
div.floatleft {
float: none;
margin: 0 auto;
width: fit-content;
}
}
/*****************
* End thumbnails *
******************/
/**************
* Wiki editor *
***************/
#wpTextbox0 {
/* need !important here to override inline styling */
background-color: var(--wiki-content-background-color) !important;
}
.wikiEditor-ui {
border: none;
}
.wikiEditor-ui .wikiEditor-ui-top,
.wikiEditor-ui .wikiEditor-ui-view {
border-color: var(--wiki-content-border-color);
}
.wikiEditor-ui-toolbar {
background: var(--wiki-content-background-color--secondary);
}
.wikiEditor-ui-toolbar .group,
.wikiEditor-ui-toolbar .section-secondary .group {
border-color: var(--wiki-content-border-color);
}
.wikiEditor-ui-toolbar .tabs span.tab a,
.wikiEditor-ui-toolbar .tabs span.tab a:visited,
.wikiEditor-ui-toolbar .tabs span.tab a.current,
.wiikiEditor-ui-toolbar .tabs span.tab a.current:visited,
.wikiEditor-ui-toolbar .booklet .index .current {
color: var(--wiki-content-link-color);
}
.wikiEditor-ui-toolbar .group .tool-select .options {
background: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
}
.wikiEditor-ui-toolbar .group .tool-select .options .option {
color: var(--wiki-content-text-color);
}
.wikiEditor-ui-toolbar .group .tool-select .menu .options .option:hover {
background-color: var(--wiki-content-background-color);
}
.wikiEditor-ui-toolbar .tabs span.tab a::before,
.wikiEditor-ui-toolbar .group .tool-select .label::after {
filter: var(--wiki-icon-general-filter);
}
.wikiEditor-ui-toolbar .group .label,
.wikiEditor-ui-toolbar .group .tool-select .label,
.wikiEditor-ui-toolbar .page-table th,
.wikiEditor-ui-toolbar .page-table td,
.wikiEditor-ui-toolbar .page-characters div span,
.wikiEditor-ui-toolbar .booklet .index div {
color: var(--wiki-content-text-color);
}
.wikiEditor-ui-toolbar .booklet > .index > :hover {
background-color: var(--wiki-content-background-color--secondary);
}
.wikiEditor-ui-toolbar .page-characters div span {
border: 1px solid var(--wiki-content-border-color);
}
.wikiEditor-ui-toolbar .sections .section,
.wikiEditor-ui-toolbar .booklet .pages,
.wikiEditor-ui-toolbar .booklet .index .current,
.wikiEditor-ui-toolbar .page-characters div span:hover {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent);
}
.wikiEditor-ui-toolbar .sections .section {
border-top: 1px solid var(--wiki-content-border-color);
}
.wikiEditor-ui-toolbar .page-characters div span:hover {
border-color: var(--wiki-content-border-color);
}
.wikiEditor-ui-toolbar .page-table td {
border-top: 1px solid var(--wiki-content-border-color);
}
.wikiEditor-ui-tabs div a {
background: #9A647F;
display: inline-block;
}
.wikiEditor-ui-tabs div.current {
border-bottom: 1px solid #3B3352;
}
.wikiEditor-ui-tabs div.current a {
font-weight: bold;
}
.wikiEditor-ui-tabs {
border-left: 1px solid #3B3352;
border-top: 1px solid #3B3352;
}
.wikiEditor-ui-text {
background-color: var(--wiki-content-dynamic-color--inverted);
}
.wikiEditor-preview-contents {
background: transparent;
background-color: rgba(255, 255, 255, 0.2);
border-color: #3B3352;
border-style: solid;
border-width: 0 1px 1px;
}
.wikiEditor-ui-controls {
background: transparent;
}
.wikiEditor-preview-contents,
.wikiEditor-preview-loading {
background-color: transparent;
}
.mw-wikiEditor-InsertLink-TitleInputField .oo-ui-messageWidget,
.mw-widget-titleWidget-menu .mw-widget-titleOptionWidget-description {
color: var(--wiki-content-text-mix-color);
}
.wikiEditor-toolbar-dialog {
max-width: 100%;
box-sizing: border-box;
}
.wikiEditor-toolbar-dialog .ui-dialog-content input[type='text']::placeholder {
color: var(--wiki-content-text-mix-color);
}
.ext-WikiEditor-ResizingDragBar {
background-color: var(--wiki-content-background-color--secondary);
}
.ext-WikiEditor-ResizingDragBar-ns {
border-color: var(--wiki-content-border-color);
}
.ext-WikiEditor-ResizingDragBar span {
background-color: var(--wiki-content-border-color);
}
.ext-WikiEditor-ResizingDragBar:hover span {
background-color: var(--wiki-content-text-mix-color);
}
.ext-WikiEditor-twopanes-TwoPaneLayout .ext-WikiEditor-twopanes-pane1,
.ext-WikiEditor-twopanes-TwoPaneLayout .ext-WikiEditor-twopanes-pane2 {
border-color: var(--wiki-content-border-color);
}
/* creates a warning message about previewing sidebar edits */
.page-MediaWiki_Sidebar .wikiEditor-ui-bottom:has(.ext-WikiEditor-twopanes-TwoPaneLayout)::before {
content:"Warning: Sidebar previews are not accurate. Please save to see your changes!";
background:var(--wiki-alert-color);
display:block;
text-align:center;
color:var(--wiki-alert-label-color);
}
.ext-WikiEditor-realtimepreview-button.oo-ui-toggleWidget-on .oo-ui-labelElement-label {
color: var(--wiki-accent-color);
}
.wikiEditor-ui-toolbar .group,
.wikiEditor-ui-toolbar .section-secondary .group {
border-color: var(--wiki-content-border-color);
}
.ext-WikiEditor-realtimepreview-button:hover {
background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);
color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 3px var(--wiki-accent-color);
}
.ext-WikiEditor-realtimepreview-ErrorLayout {
background-color: var(--wiki-content-background-color);
}
.ext-WikiEditor-image-realtimepreview-error {
filter: var(--wiki-icon-general-filter);
}
.oo-ui-toggleButtonWidget.oo-ui-widget-enabled.oo-ui-buttonElement-frameless.oo-ui-toggleWidget-on .oo-ui-buttonElement-button {
background-color: var(--wiki-content-background-color--secondary);
}
.ext-WikiEditor-reloadButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button,
.ext-WikiEditor-reloadButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
background-color: var(--wiki-content-background-color);
}
.editOptions {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border-color: var(--wiki-content-border-color);
border-image: none;
border-radius: 0 0 5px 5px;
border-style: none solid solid;
border-width: medium 1px 1px;
}
input#wpSummary {
margin-bottom: 1em;
margin-top: 1em;
width: 80%;
}
.view-dark .ace_editor,
.ace_editor {
--ace-keywords: #CDA869;
--ace-regexp: #E9C062;
--ace-constants: #CF6A4C;
--ace-illegal: #F8F8F8;
--ace-deprecated: #D2A8A1;
--ace-support: #9B859D;
--ace-function: #DAD085;
--ace-list: #F9EE98;
--ace-variable: #7587A6;
--ace-string: #8F9D6A;
--ace-illegal-highlight: rgba(86, 45, 86, 0.75);
--ace-step-highlight: #665200;
--ace-multiselect-shadow: #141414;
}
.view-light .ace_editor {
--ace-keywords: #00f;
--ace-regexp: #036a07;
--ace-constants: #c5060b;
--ace-illegal: #f00;
--ace-deprecated: #f00;
--ace-support: #6d79de;
--ace-function: #3c4c72;
--ace-list: #b90690;
--ace-variable: #318495;
--ace-string: #036a07;
--ace-illegal-highlight: rgba(255, 0, 0, 0.1);
--ace-step-highlight: #fcff00;
--ace-multiselect-shadow: #fff;
}
.ace_editor .ace_gutter {
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent);
}
.ace_gutter-cell {
color: color-mix(in srgb, var(--wiki-content-dynamic-color) 40%, transparent);
}
.ace_editor .ace_print-margin {
width: 1px;
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 75%, transparent);
}
.ace_editor {
/* this image gradient hack effectively lets the element have 2 layers of background */
background-image: linear-gradient(var(--wiki-content-dynamic-color), var(--wiki-content-dynamic-color));
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 93%, transparent);
color: color-mix(in srgb, var(--wiki-content-dynamic-color) 93%, transparent);
}
.ace_editor .ace_cursor,
.ace-monokai .ace_punctuation,
.ace-monokai .ace_punctuation.ace_tag {
color: var(--wiki-content-text-color);
}
.ace_editor .ace_marker-layer .ace_selection {
background: color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent)
}
.ace_editor.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px var(--ace-multiselect-shadow);
}
.ace_editor .ace_marker-layer .ace_step {
background: var(--ace-step-highlight);
}
.ace_editor .ace_marker-layer .ace_active-line,
.ace_editor .ace_gutter-active-line {
background: color-mix(in srgb, var(--wiki-content-dynamic-color) 3.1%, transparent)
}
.ace-tm .ace_marker-layer .ace_selected-word {
background: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent);
}
.ace_editor .ace_marker-layer .ace_selection {
background: color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent);
}
.ace_editor .ace_marker-layer .ace_selected-word {
border: 1px solid color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent);
}
.ace_editor .ace_invisible {
color: color-mix(in srgb, var(--wiki-content-dynamic-color) 25%, transparent);
}
.ace_editor .ace_keyword,
.ace_editor .ace_meta {
color: var(--ace-keywords);
}
.ace_editor .ace_constant,
.ace_editor .ace_constant.ace_numeric,
.ace_editor .ace_constant.ace_character,
.ace_editor .ace_constant.ace_character.ace_escape,
.ace_editor .ace_constant.ace_other,
.ace_editor .ace_heading,
.ace_editor .ace_markup.ace_heading,
.ace_editor .ace_support.ace_constant {
color: var(--ace-constants);
}
.ace_editor .ace_invalid.ace_illegal {
color: var(--ace-illegal);
background-color: var(--ace-illegal-highlight);
}
.ace_editor .ace_invalid.ace_deprecated {
text-decoration: underline;
font-style: italic;
color: var(--ace-deprecated);
}
.ace_editor .ace_support,
.ace_editor .ace_support.ace_type {
color: var(--ace-support);
}
.ace_editor .ace_fold {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent);
border-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent);
}
.ace_editor .ace_support.ace_function {
color: var(--ace-function);
}
.ace_editor .ace_list,
.ace_editor .ace_markup.ace_list,
.ace_editor .ace_storage {
color: var(--ace-list);
}
.ace_editor .ace_entity.ace_name.ace_function,
.ace_editor .ace_meta.ace_tag,
.ace_editor .ace_variable {
color: var(--ace-variable);
}
.ace_editor .ace_string {
color: var(--ace-string);
}
.ace_editor .ace_string.ace_regexp {
color: var(--ace-regexp);
}
.ace_editor .ace_comment {
font-style: italic;
color: color-mix(in srgb, var(--wiki-content-dynamic-color) 30%, transparent);
}
.ace_editor .ace_xml-pe {
color: color-mix(in srgb, var(--wiki-content-dynamic-color) 28%, transparent);
}
.ace_editor .ace_indent-guide {
background: none;
box-shadow: 1px 0 0 color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent);
}
.ace_search {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border: 1px solid var(--wiki-content-border-color);
}
.ace_search_field {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-mix-color);
}
.ace_button {
color: var(--wiki-content-text-color);
border: 1px solid var(--wiki-content-border-color);
}
.ace_button:hover {
background-color: var(--wiki-accent-color--hover);
color: var(--wiki-accent-label-color);
}
.ace_button.checked {
background-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.ace_searchbtn {
background-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
border: 1px solid var(--wiki-content-border-color);
}
.ace_searchbtn:hover {
background-color: var(--wiki-accent-color--hover);
color: var(--wiki-accent-label-color);
}
.ace_searchbtn.prev::after,
.ace_searchbtn.next::after {
border-color: var(--wiki-accent-label-color);
}
.ace_searchbtn_close {
filter: var(--wiki-icon-general-filter);
}
.wikiEditor-ui .codeEditor-status {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.mw-editform #wpTextbox1 {
background: color-mix(in srgb, var(--wiki-content-background-color) 50%, transparent);
color: var(--wiki-content-text-color);
}
.view-dark .ext-codemirror-wrapper,
.ext-codemirror-wrapper {
--codemirror-yellow: #ffd700;
--codemirror-light-blue: #adf;
--codemirror-blue: #08f;
--codemirror-green: #290;
--codemirror-red: #f50;
--codemirror-dark-red: #dd1616;
--codemirror-purple: #CD4EF9;
--codemirror-pink: #e0e;
--codemirror-light-gray: #eee;
--codemirror-gray: #84a0a0;
}
.view-light .ext-codemirror-wrapper {
--codemirror-yellow: #9e8500;
--codemirror-light-blue: #008ae7;
--codemirror-blue: #0085f9;
--codemirror-green: #290;
--codemirror-red: #ef4f00;
--codemirror-dark-red: #a11;
--codemirror-purple: #80c;
--codemirror-pink: #ed00ed;
--codemirror-light-gray: #858585;
--codemirror-gray: #6b8a8a;
}
.ext-codemirror-wrapper {
background-color: color-mix(in srgb, var(--wiki-content-background-color) 35%, transparent);
color: var(--wiki-content-text-color)
}
.cm-editor .cm-selectionBackground,
.cm-editor.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground {
background: color-mix(in srgb, var(--wiki-accent-color) 30%, transparent);
}
.cm-mw-keyword {
color: var(--codemirror-purple)
}
.cm-mw-def {
color: var(--codemirror-blue)
}
.cm-mw-variable-2 {
color: var(--codemirror-light-blue)
}
.cm-mw-string {
color: var(--codemirror-red)
}
.cm-mw-atom {
color: var(--codemirror-pink)
}
.cm-mw-number {
color: var(--codemirror-green)
}
.cm-mw-matching {
background-color: var(--codemirror-yellow)
}
.cm-mw-skipformatting {
background-color: var(--codemirror-light-blue)
}
.cm-mw-list {
color: var(--codemirror-blue)
}
.cm-mw-doubleUnderscore,
.cm-mw-hr,
.cm-mw-signature {
background-color: var(--wiki-content-background-color--secondary);
color: var(--codemirror-blue)
}
.cm-mw-indenting {
color: var(--codemirror-blue)
}
.cm-mw-mnemonic {
color: var(--codemirror-green)
}
.cm-mw-comment {
color: var(--codemirror-gray)
}
.cm-mw-apostrophes-bold,
.cm-mw-apostrophes-italic,
.cm-mw-section-header {
color: var(--codemirror-blue)
}
.cm-mw-template,
.cm-mw-template-argument-name,
.cm-mw-template-bracket,
.cm-mw-template-delimiter,
.cm-mw-template-name {
color: var(--codemirror-purple);
}
.cm-mw-templatevariable,
.cm-mw-templatevariable-bracket,
.cm-mw-templatevariable-delimiter,
.cm-mw-templatevariable-name {
color: var(--codemirror-red)
}
.cm-mw-parserfunction-bracket,
.cm-mw-parserfunction-delimiter,
.cm-mw-parserfunction-name {
color: var(--codemirror-dark-red)
}
.cm-mw-exttag-attribute,
.cm-mw-exttag-bracket,
.cm-mw-exttag-name,
.cm-mw-htmltag-attribute,
.cm-mw-htmltag-bracket,
.cm-mw-htmltag-name {
color: var(--codemirror-green)
}
.cm-mw-link,
.cm-mw-link-pagename {
color: var(--wiki-content-link-color)
}
.cm-mw-link-tosection {
color: var(--codemirror-blue)
}
.cm-mw-extlink,
.cm-mw-extlink-bracket,
.cm-mw-extlink-protocol,
.cm-mw-free-extlink,
.cm-mw-free-extlink-protocol,
.cm-mw-link-bracket,
.cm-mw-link-delimiter {
color: var(--wiki-content-link-color)
}
.cm-mw-table-bracket,
.cm-mw-table-definition,
.cm-mw-table-delimiter {
color: var(--codemirror-pink)
}
.cm-mw-matchingbracket {
background-color: var(--wiki-content-background-color--secondary);
box-shadow: inset 0 0 1px 1px var(--wiki-content-link-color);
font-weight: bold;
}
.cm-editor .cm-tooltip-autocomplete ul li[aria-selected] {
background: color-mix(in srgb, var(--wiki-content-link-color) 15%, var(--wiki-content-background-color));
color: var(--wiki-content-link-color);
}
/* VisualEditor: Fix broken toolbar layout */
.oo-ui-toolbar {
clear: none;
display: flex; /* fix overflow issue at narrow widths */
}
.ve-ui-toolbar > .oo-ui-toolbar-bar{
width: 100%; /* fix overflow issue at narrow widths */
}
.ve-ui-toolbar.ve-ui-toolbar-floating > .oo-ui-toolbar-bar{
width: auto; /* fix overflow issue at narrow widths */
}
.ve-init-mw-desktopArticleTarget-toolbar-open > .oo-ui-toolbar-bar > div:nth-child(4) {
display: none;
}
.ve-ui-toolbar-floating > .oo-ui-toolbar-bar {
top: var(--wikigg-header-scroll-height);
}
.oo-ui-toolbar-bar .oo-ui-toolbar-bar,
.ve-area-wrapper .oo-ui-toolbar-bar {
background-color: var(--wiki-content-background-color--secondary);
}
.ve-init-mw-desktopArticleTarget-originalContent .content-body {
clear: right;
}
/* fix a lot of empty space from TemplateData when using VE Source */
.tdg-editscreen-main.mw-body-content::after {
display: none;
}
/*************
* End editor *
**************/
/****************
* Tabber styles *
*****************/
.tabber__header {
box-shadow: inset 0 -1px 0 0 var(--wiki-content-border-color);
}
.tabber__tab,
.tabber__tab:visited {
color: var(--wiki-content-text-color);
}
.tabber__tab:hover,
.tabber__tab:hover:visited,
.tabber__tab[aria-selected="true"],
.tabber__tab[aria-selected="true"]:visited {
color: var(--wiki-content-link-color);
}
.tabber__tab[aria-selected="true"] {
box-shadow: 0 -2px 0 var(--wiki-content-link-color) inset;
}
.tabber__header__prev::after,
.tabber__header__next::after {
filter: var(--wiki-icon-general-filter);
}
/********************
* End Tabber styles *
*********************/
/***************************************
* Various fixes for multi-theme Vector *
****************************************/
:focus,
:focus-visible {
outline-color: var(--wiki-accent-color)
}
:focus-visible {
outline-style: solid;
}
.oo-ui-iconElement-icon {
filter: var(--wiki-icon-to-link-filter);
}
.oo-ui-iconElement-icon.oo-ui-icon-reload {
filter: brightness(0) var(--wiki-icon-to-link-filter);
}
fieldset {
border-color: var(--wiki-content-border-color);
}
hr {
background-color: var(--wiki-content-border-color);
}
.CategoryTreeToggle {
color: var(--wiki-content-link-color);
}
input,
select {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
input:hover,
input:focus,
input:active {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border-color: var(--wiki-accent-color);
box-shadow: none;
}
input:focus-visible {
outline: 1px solid var(--wiki-accent-color);
}
input::file-selector-button,
input[type="button"],
input[type="submit"] {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.vector-body blockquote {
border-color: var(--wiki-content-border-color);
}
/* category bar and filetoc */
.catlinks{
background: var(--wiki-content-catlinks-background, var(--wiki-content-background-color--secondary));
border-width: var(--wiki-content-catlinks-border-width, 1px);
border-style: var(--wiki-content-catlinks-border-style, solid);
border-color: var(--wiki-content-catlinks-border-color, var(--wiki-content-border-color));
border-radius: var(--wiki-content-catlinks-border-radius, 0px);
border-image: var(--wiki-content-catlinks-border-image, none);
box-shadow: var(--wiki-content-catlinks-box-shadow, none);
}
ul#filetoc {
background: var(--wiki-content-filetoc-background, var(--wiki-content-background-color--secondary));
border-width: var(--wiki-content-filetoc-border-width, 1px);
border-style: var(--wiki-content-filetoc-border-style, solid);
border-color: var(--wiki-content-filetoc-border-color, var(--wiki-content-border-color));
border-radius: var(--wiki-content-filetoc-border-radius, 0px);
border-image: var(--wiki-content-filetoc-border-image, none);
box-shadow: var(--wiki-content-filetoc-box-shadow, none);
}
/**/
body .ui-dialog .ui-widget-header {
/* we need an important here because the built-in styles have one :( */
background: var(--wiki-content-background-color) !important;
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.ui-widget-header .ui-dialog-titlebar-close .ui-icon-closethick {
filter: var(--wiki-icon-general-filter);
}
.ui-widget-header .ui-dialog-titlebar-close.ui-state-hover {
background: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
}
.ui-widget-content {
background: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border: 1px solid var(--wiki-content-border-color);
}
body .ui-button {
/* we need an important here because the built-in styles have one. Vector is a mess */
background: var(--wiki-accent-color) !important;
border-color: var(--wiki-accent-color) !important;
color: var(--wiki-accent-label-color);
}
body .ui-button:hover,
body .ui-button:focus,
body .ui-button:active {
/* we need an important here because we had to use some above */
background: var(--wiki-accent-color--hover) !important;
border-color: var(--wiki-accent-color--hover) !important;
color: var(--wiki-accent-label-color);
}
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
color: var(--wiki-accent-label-color);
}
.ui-state-focus {
/* we need an important here because the built-in styles have one */
background: var(--wiki-accent-color) !important;
color: var(--wiki-accent-label-color) !important;
}
.ui-menu .ui-menu-item a {
color: var(--wiki-content-dynamic-color);
}
#contentSub,
#contentSub2 {
color: var(--wiki-content-text-mix-color);
}
/* notifications ("your edit was saved", etc.) */
.mw-notification {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border-color: var(--wiki-content-border-color);
top: var(--wikigg-header-scroll-height);
}
.mw-notification .oo-ui-labelElement-label {
color: var(--wiki-content-text-color);
}
.mw-notification .oo-ui-iconElement-icon {
filter: unset;
}
/**/
.mime-type.has-warning {
color: var(--wiki-content-text-color);
}
.oo-ui-image-warning.oo-ui-icon-alert,
.mw-ui-icon-alert-warning::before {
filter: drop-shadow(0 0 3px #000);
}
.oo-ui-image-invert.oo-ui-icon-subtract,
.mw-ui-icon-subtract-invert::before,
.oo-ui-image-invert.oo-ui-icon-add,
.mw-ui-icon-add-invert::before {
filter: brightness(0) var(--wiki-icon-to-link-filter);
filter: var(--wiki-icon-general-filter);
}
.mw_metadata td,
.mw_metadata th {
border-color: var(--wiki-content-border-color);
}
.mw_metadata th {
background-color: var(--wiki-content-background-color--secondary);
}
.mw_metadata td {
background-color: var(--wiki-content-background-color);
}
.mw-datatable td,
.mw-datatable th {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
}
#mw-allmessagestable tbody:hover td,
.mw-datatable tr:hover > td {
background-color: var(--wiki-content-background-color--secondary);
}
#mw-allmessagestable .am_default {
background-color: color-mix(in srgb, var(--wiki-accent-color) 80%, transparent);
color: var(--wiki-accent-label-color);
}
#mw-allmessagestable .am_actual,
#mw-allmessagestable tbody:hover .am_default {
background-color: color-mix(in srgb, var(--wiki-accent-color) 60%, transparent);
}
#mw-allmessagestable .am_actual {
color: var(--wiki-accent-label-color);
}
#mw-allmessagestable tbody:hover .am_actual {
background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
}
.mw-datatable,
.mw-json {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
color: inherit;
}
.mw-datatable > * > tr > th,
.mw-datatable > tr > th,
.mw-json > * > tr > th,
.mw-json > tr > th {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
padding-bottom: 9px;
padding-top: 9px;
}
.mw-datatable > * > tr > td,
.mw-datatable > tr > td,
.mw-json > * > tr > td,
.mw-json > tr > td {
border-color: var(--wiki-content-border-color);
}
.mw-json tr {
background-color: inherit;
}
.mw-json .mw-json-single-value,
.mw-json .mw-json-value,
.mw-json .value {
background: color-mix(in srgb, var(--wiki-success-color) 60%, transparent);
}
.mw-json .mw-json-empty {
background: var(--wiki-content-background-color--secondary);
}
.mw-message-box,
.mw-message-box-warning {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
}
.mw-message-box-warning {
border-color: var(--wiki-warning-color);
border-width: 1px 1px 1px 10px;
}
.mw-destfile-warning {
border-color: var(--wiki-warning-color);
color: var(--wiki-content-text-color);
background-color: color-mix(in srgb, var(--wiki-warning-color) 25%, transparent);
}
.wikitable *,
.wikitable :after,
.wikitable :before {
-webkit-box-sizing: inherit;
box-sizing: inherit;
}
.cargo-pagevalues-tableinfo {
background-color: var(--wiki-content-background-color);
border-bottom: 1px solid var(--wiki-content-border-color);
top: 46px;
position: static;
/* override sticky in the built-in */
}
.cargo-table-diagram .cargo-table-svg .node.entity-name rect {
fill: var(--wiki-content-background-color--secondary);
fill-opacity: 1;
}
.cargo-table-diagram .cargo-table-svg .node rect {
stroke: var(--wiki-content-border-color);
opacity: 1;
}
.cargo-table-diagram .cargo-table-svg .node text tspan {
fill: var(--wiki-content-text-color);
}
table.cargoTable {
color: var(--wiki-content-text-color);
}
table.cargoTable tbody td,
table.cargoTable thead th {
border: 1px solid var(--wiki-content-border-color);
}
table.cargoTable tr:hover {
background-color: color-mix(in srgb, var(--wiki-accent-color) 25%, transparent);
}
table.cargoTable thead tr:nth-child(odd),
table.cargoTable.noMerge thead tr:nth-child(odd) {
background-color: var(--wiki-accent-color);
}
table.cargoTable tbody tr:nth-child(2n),
table.cargoTable.noMerge tbody tr:nth-child(2n) {
background-color: var(--wiki-content-background-color);
}
table.cargoTable tbody tr:nth-child(odd),
table.cargoTable.noMerge tbody tr:nth-child(odd) {
background-color: var(--wiki-content-background-color--secondary);
}
table.cargoTable th.headerSort {
color: var(--wiki-accent-label-color);
}
table.cargoTable th.headerSort:hover {
color: var(--wiki-accent-label-color);
text-decoration: underline;
}
table.cargoTable th.headerSort::after {
background-color: var(--wiki-accent-link-color);
}
#mw-content-text div.cargoReplacementTableInfo {
background: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
}
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_processing,
.dataTables_wrapper .dataTables_paginate {
color: var(--wiki-content-text-color);
}
table.dataTable tbody tr {
background-color: var(--wiki-content-background-color);
}
table.dataTable.display tbody tr.odd > .sorting_1,
table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 75%, transparent);
}
table.dataTable.stripe tbody tr.odd,
table.dataTable.display tbody tr.odd,
table.dataTable.display tbody tr.even > .sorting_1,
table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent);
}
table.dataTable.display tbody tr:hover > .sorting_1,
table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
background-color: color-mix(in srgb, var(--wiki-content-background-color) 75%, transparent);
}
table.dataTable.hover tbody tr:hover,
table.dataTable.display tbody tr:hover {
background-color: var(--wiki-content-background-color--secondary);
}
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
/* we need this !important to override a built-in one */
color: var(--wiki-content-text-mix-color) !important;
}
table.dataTable.row-border tbody th,
table.dataTable.row-border tbody td,
table.dataTable.display tbody th,
table.dataTable.display tbody td {
border-top: 1px solid var(--wiki-content-border-color);
}
.dataTables_wrapper .dataTables_paginate .paginate_button.current,
.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
/* we need this !important to override a built-in one */
color: var(--wiki-content-text-mix-color) !important;
border: 1px solid var(--wiki-content-border-color);
background-color: var(--wiki-content-background-color);
background: linear-gradient(to bottom, var(--wiki-content-background-color) 0%, var(--wiki-content-background-color--secondary) 100%);
}
div.drilldown-filters-wrapper {
background-color: transparent;
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.action-pagevalues tr:nth-of-type(2n) {
background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent);
}
.action-pagevalues tr:hover {
background-image: linear-gradient(color-mix(in srgb, var(--wiki-accent-color) 20%, transparent), color-mix(in srgb, var(--wiki-accent-color) 20%, transparent));
}
div.specialCargoQuery-extraPane {
background: var(--wiki-content-background-color);
}
.oo-ui-panelLayout-framed {
border-color: var(--wiki-content-border-color);
}
.oo-ui-inputWidget-input + .oo-ui-image-invert.oo-ui-icon-check {
background-image: none;
}
.oo-ui-inputWidget-input:checked + .oo-ui-image-invert.oo-ui-icon-check::before {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background-image: url(/load.php?modules=oojs-ui-core.icons&image=check&variant=invert&format=rasterized&skin=vector&version=y9f1k);
background-image: linear-gradient(transparent, transparent), url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3E check %3C/title%3E%3Cg fill=%22%23fff%22%3E%3Cpath d=%22M7 14.2 2.8 10l-1.4 1.4L7 17 19 5l-1.4-1.4z%22/%3E%3C/g%3E%3C/svg%3E");
content: '';
pointer-events: none;
filter: var(--wiki-icon-general-filter);
}
.oo-ui-checkboxInputWidget [type="checkbox"] + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span {
filter: unset;
background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent);
border-color: color-mix(in srgb, var(--wiki-accent-color) 75%, transparent);
}
.oo-ui-checkboxInputWidget [type="checkbox"]:disabled + span {
background-color: var(--wiki-content-text-mix-color);
border-color: var(--wiki-content-text-mix-color);
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:hover + span {
border-color: var(--wiki-accent-color);
filter: unset;
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate + span {
background-color: var(--wiki-accent-color);
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:focus + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:focus + span {
box-shadow: none;
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:active + span {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:focus + span {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
outline: 1px solid transparent;
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:focus + span {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:hover + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:active + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:focus + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:hover + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:active + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:focus + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:hover + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:active + span,
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:focus + span {
background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
border-color: var(--wiki-accent-color);
}
.oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:active + span {
background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent)
}
.oo-ui-image-invert.oo-ui-icon-check {
background: none;
position: relative;
}
.oo-ui-inputWidget-input:checked + .oo-ui-image-invert.oo-ui-icon-check::before {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background-image: url(/load.php?modules=oojs-ui-core.icons&image=check&variant=invert&format=rasterized&skin=vector&version=y9f1k);
background-image: linear-gradient(transparent, transparent), url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3E check %3C/title%3E%3Cg fill=%22%23fff%22%3E%3Cpath d=%22M7 14.2 2.8 10l-1.4 1.4L7 17 19 5l-1.4-1.4z%22/%3E%3C/g%3E%3C/svg%3E");
content: '';
pointer-events: none;
filter: var(--wiki-icon-general-filter);
}
.oo-ui-indicatorElement-indicator {
filter: var(--wiki-icon-to-link-filter);
}
.oo-ui-tagItemWidget.oo-ui-widget-enabled:not(.oo-ui-tagItemWidget-fixed) {
background-color: var(--wiki-content-background-color--secondary);
}
.oo-ui-tagItemWidget.oo-ui-widget-enabled:hover {
color: var(--wiki-content-text-color--hover);
}
.oo-ui-tagItemWidget.oo-ui-widget-enabled:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.oo-ui-tagItemWidget.oo-ui-widget-disabled {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-mix-color);
border-color: var(--wiki-content-text-mix-color);
}
.client-js .mw-recentchanges-toplinks:not(.mw-recentchanges-toplinks-collapsed) {
border-color: var(--wiki-content-border-color);
}
.mw-rcfilters-ui-savedLinksListWidget-placeholder.oo-ui-optionWidget .oo-ui-labelElement-label {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-savedLinksListWidget-menu .mw-rcfilters-ui-savedLinksListItemWidget {
color: var(--wiki-content-text-color);
padding: 8px 6px;
-webkit-transition: color .3s, background-color .3s;
transition: color .3s, background-color .3s;
}
.mw-rcfilters-ui-savedLinksListWidget-menu .mw-rcfilters-ui-savedLinksListItemWidget:hover {
background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);
color: var(--wiki-accent-color);
}
.mw-rcfilters-ui-savedLinksListItemWidget-label {
color: var(--wiki-accent-color);
}
.mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined {
background-color: transparent;
}
.mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
border-color: var(--wiki-content-border-color);
}
.mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle + .mw-rcfilters-ui-table,
.mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle.mw-rcfilters-ui-filterTagMultiselectWidget-emphasize {
background-color: var(--wiki-content-background-color--secondary);
}
.mw-rcfilters-ui-filterTagMultiselectWidget-views-select-widget.oo-ui-widget {
border-color: var(--wiki-content-border-color);
padding: 0;
}
.mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-title {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-savedQueryTitle {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
color: var(--wiki-content-link-color);
}
.mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button > .oo-ui-labelElement-label:hover {
color: var(--wiki-content-link-color--hover);
}
.mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button:before {
content: "[";
}
.mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button:after {
content: "]";
}
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
color: var(--wiki-content-text-color);
}
.oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:hover {
background-color: var(--wiki-content-dynamic-color--inverted);
}
.mw-rcfilters-ui-filterTagMultiselectWidget-emptyFilters {
color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent);
}
.mw-rcfilters-ui-filterMenuSectionOptionWidget {
background-color: var(--wiki-content-background-color);
}
.oo-ui-menuSelectWidget {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-text-mix-color);
}
.mw-rcfilters-ui-filterMenuSectionOptionWidget-header-title.oo-ui-labelElement-label {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-filterMenuHeaderWidget-header {
background-color: var(--wiki-content-background-color);
border-bottom-color: var(--wiki-content-border-color);
}
.mw-rcfilters-ui-filterMenuHeaderWidget-title {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-itemMenuOptionWidget:not(:last-child):not(.mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk) {
border-bottom-color: var(--wiki-content-text-mix-color);
}
.mw-rcfilters-ui-itemMenuOptionWidget-view-namespaces {
border-top-color: var(--wiki-content-border-color);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected,
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-title,
.mw-rcfilters-ui-itemMenuOptionWidget:hover,
.mw-rcfilters-ui-itemMenuOptionWidget:hover .mw-rcfilters-ui-itemMenuOptionWidget-label-title {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span,
.mw-rcfilters-ui-itemMenuOptionWidget:hover .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span {
border-color: var(--wiki-accent-color);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected,
.mw-rcfilters-ui-itemMenuOptionWidget:hover {
background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent)
}
.mw-rcfilters-ui-itemMenuOptionWidget-excludeLabel,
.mw-rcfilters-ui-itemMenuOptionWidget-label-title {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-itemMenuOptionWidget-label-desc {
color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected:hover,
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected):hover {
background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-title,
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) .mw-rcfilters-ui-itemMenuOptionWidget-label-title {
color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-desc {
color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-desc,
.mw-rcfilters-ui-itemMenuOptionWidget:hover .mw-rcfilters-ui-itemMenuOptionWidget-label-desc,
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) .mw-rcfilters-ui-itemMenuOptionWidget-label-desc {
color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent);
}
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span,
.mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span {
border-color: var(--wiki-content-text-color);
}
.mw-rcfilters-ui-viewSwitchWidget label.oo-ui-labelWidget {
color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent);
}
.oo-ui-tagItemWidget.oo-ui-widget-enabled,
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagItemWidget.oo-ui-widget-enabled {
background-color: transparent;
color: var(--wiki-content-text-color);
border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagItemWidget.oo-ui-widget-enabled.selected {
background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent);
border-color: var(--wiki-accent-color);
}
.mw-rcfilters-ui-datePopupWidget {
border-color: var(--wiki-content-border-color);
}
.mw-rcfilters-ui-datePopupWidget .mw-rcfilters-ui-valuePickerWidget-title {
color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent);
}
.mw-changeslist-legend,
.mw-rcfilters-ui-changesListWrapperWidget .mw-changeslist-legend {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
@keyframes fadeBlue {
60% {
border-top-color: var(--wiki-accent-color);
}
100% {
border-top-color: var(--wiki-content-border-color);
}
}
.mw-rcfilters-ui-changesListWrapperWidget-previousChangesIndicator {
border-top-color: var(--wiki-content-border-color);
}
.mw-rcfilters-ui-menuSelectWidget-footer {
background-color: var(--wiki-content-text-mix-color-95);
}
.mw-rcfilters-ui-filterMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) {
background-color: color-mix(in srgb, var(--wiki-content-text-color) 10%, transparent);
}
.oo-ui-iconElement-icon.mw-rcfilters-ui-filterItemHighlightButton-circle {
filter: unset;
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .mw-rcfilters-ui-tagItemWidget-selected.oo-ui-tagItemWidget.oo-ui-widget-enabled {
background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent);
border-color: var(--wiki-accent-color);
}
.mw-rcfilters-ui-tagItemWidget.oo-ui-flaggedElement-muted.oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-labelElement-label {
color: color-mix(in srgb, var(--wiki-content-text-color) 76%, transparent);
}
.mw-rcfilters-ui-tagItemWidget-popup-content {
color: color-mix(in srgb, var(--wiki-content-text-color) 75%, transparent);
}
/* fix for weird focus box on recentchanges arrows when clicking, but keep it for tab navigation */
.mw-enhancedchanges-checkbox:focus + * .mw-enhancedchanges-arrow {
outline: none;
}
.mw-enhancedchanges-checkbox:focus-visible + * .mw-enhancedchanges-arrow {
outline: 1px solid var(--wiki-accent-color);
}
/**/
.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before {
border-top-color: var(--wiki-content-border-color);
}
.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
border-top-color: var(--wiki-content-background-color--secondary);
}
.unpatrolled {
color: var(--wiki-alert-color);
}
.autocomment, .autocomment a, .autocomment a:visited {
color: var(--wiki-content-text-mix-color);
}
/* Recent changes filter highlighting */
.view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c1,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c1 tr:first-child,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c1.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)),
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c1.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) {
background-color: #1c283f;
}
.view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c2,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c2 tr:first-child,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c2.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)),
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c2.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) {
background-color: #0f3128;
}
.view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c3,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c3 tr:first-child,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c3.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)),
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c3.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) {
background-color: #352c10;
}
.view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c4,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c4 tr:first-child,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c4.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)),
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c4.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) {
background-color: #411d0c;
}
.view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c5,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c5 tr:first-child,
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c5.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)),
.view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c5.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) {
background-color: #3f0f0f;
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled,
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined {
background-color: transparent;
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
-webkit-transition: border-color 300ms, box-shadow 300ms;
transition: border-color 300ms, box-shadow 300ms;
background-color: var(--wiki-content-background-color--secondary)
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined.oo-ui-tagMultiselectWidget-focus .oo-ui-tagMultiselectWidget-handle {
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
outline: 0
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined:hover .oo-ui-tagMultiselectWidget-handle {
border-color: var(--wiki-accent-color)
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined.oo-ui-flaggedElement-invalid .oo-ui-tagMultiselectWidget-handle,
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined.oo-ui-flaggedElement-invalid:hover .oo-ui-tagMultiselectWidget-handle {
border-color: var(--wiki-alert-color)
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagMultiselectWidget-handle {
background-color: var(--wiki-content-background-color--secondary);
border-bottom-width: 0;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-inputWidget-input {
border-radius: 0;
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input {
border-color: var(--wiki-alert-color);
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input {
color: var(--wiki-alert-color);
}
.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle {
opacity: 0.5;
}
.oo-ui-tagMultiselectWidget-handle .oo-ui-tagMultiselectWidget-group > input {
color: var(--wiki-content-text-color);
}
.oo-ui-tagMultiselectWidget .oo-ui-inputWidget-input {
color: inherit;
background: transparent;
font-family: inherit;
}
.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle,
.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-inputWidget-input,
.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
background: var(--wiki-content-text-mix-color-95);
color: color-mix(in srgb, var(--wiki-content-text-color) 25%, transparent);
text-shadow: none;
border-color: var(--wiki-content-text-mix-color);
}
.oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::placeholder {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-dropdownInputWidget select {
border-color: var(--wiki-content-border-color);
}
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.oo-ui-toggleSwitchWidget {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 95%, var(--wiki-content-dynamic-color));
border-color: color-mix(in srgb, var(--wiki-content-border-color) 95%, var(--wiki-content-dynamic-color));
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
border-color: #0006;
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
background-color: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-content-dynamic-color));
border-color: #0006;
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
background-color: var(--wiki-accent-label-color);
border-color: #0006;
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus .oo-ui-toggleSwitchWidget-grip {
border-color: var(--wiki-accent-color);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:hover {
background-color: var(--wiki-accent-color--hover);
border-color: var(--wiki-accent-color--hover);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active,
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover,
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:focus {
background-color: var(--wiki-accent-color--hover);
border-color: var(--wiki-accent-color--hover);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color--hover);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active .oo-ui-toggleSwitchWidget-grip,
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover .oo-ui-toggleSwitchWidget-grip,
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:focus .oo-ui-toggleSwitchWidget-grip {
background-color: var(--wiki-accent-label-color);
border-color: var(--wiki-accent-label-color);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:active,
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:active:hover {
background-color: var(--wiki-accent-color--hover);
border-color: var(--wiki-accent-color--hover);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:focus {
border-color: var(--wiki-accent-color);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:focus::before {
border-color: var(--wiki-accent-label-color);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
background-color: var(--wiki-content-text-mix-color-95);
border-color: var(--wiki-content-text-mix-color-95);
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
border-color: var(--wiki-content-dynamic-color--inverted);
box-shadow: inset 0 0 0 1px var(--wiki-content-dynamic-color--inverted);
}
.oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected,
.oo-ui-outlineOptionWidget.oo-ui-optionWidget-highlighted {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-link-color);
}
.oo-ui-labelWidget.oo-ui-inline-help {
color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent);
}
.oo-ui-progressBarWidget:not(.oo-ui-pendingElement-pending) {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-accent-color);
box-shadow: 0 1px 1px color-mix(in srgb, var(--wiki-content-dynamic-color) 15%, transparent);
}
.oo-ui-progressBarWidget.oo-ui-widget-enabled .oo-ui-progressBarWidget-bar {
background-color: var(--wiki-accent-color);
}
.oo-ui-bookletLayout-outlinePanel {
padding: 7px 0;
}
.oo-ui-processDialog-content .oo-ui-window-head,
.oo-ui-processDialog-content .oo-ui-window-foot,
.oo-ui-messageDialog-content > .oo-ui-window-head,
.oo-ui-messageDialog-content > .oo-ui-window-foot {
outline-color: var(--wiki-content-border-color);
}
.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
border-right-color: var(--wiki-content-border-color);
}
.oo-ui-messageDialog-title {
color: var(--wiki-content-heading-color);
}
.oo-ui-processDialog-actions-safe .oo-ui-widget-enabled.oo-ui-iconElement:not(.oo-ui-labelElement) > .oo-ui-buttonElement-button:hover {
background-color: var(--wiki-content-background-color);
border-right-color: var(--wiki-content-border-color);
}
.oo-ui-processDialog-errors {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 90%, transparent);
}
/* OAuth authorisation dialog */
#mw-mwoauth-authorize-form {
color: inherit;
}
.oo-ui-toolbar-bar,
.oo-ui-popupToolGroup-tools,
.oo-ui-listToolGroup-tools .oo-ui-tool.oo-ui-widget-enabled:hover {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
}
.oo-ui-popupToolGroup-tools {
max-width: 100%;
}
.oo-ui-toolbar-actions .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:hover {
border-right-color: var(--wiki-content-border-color);
}
.oo-ui-menuToolGroup-tools .oo-ui-tool.oo-ui-tool-active,
.oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link:active,
.oo-ui-tool.oo-ui-widget-enabled.oo-ui-tool-active > .oo-ui-tool-link,
.oo-ui-tool.oo-ui-widget-enabled.oo-ui-popupToolGroup-active > .oo-ui-tool-link,
.oo-ui-popupToolGroup.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
background-color: var(--wiki-content-background-color);
color: var(--wiki-content-link-color);
}
.oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link {
/* we remove the transition here because it causes the hard-coded color to flash briefly */
transition: none;
}
.oo-ui-popupToolGroup.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle:hover {
color: var(--wiki-accent-color);
}
.oo-ui-popupToolGroup-tools .oo-ui-tool-active.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
color: var(--wiki-accent-color);
}
.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:hover,
.oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link:hover {
background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent);
}
.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active {
background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);
}
.oo-ui-popupToolGroup-tools .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link:focus {
box-shadow: inset 0 0 0 2px var(--wiki-accent-color);
}
.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:focus,
.oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link:focus,
.oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link:focus {
outline: 1px solid var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.oo-ui-menuToolGroup,
.oo-ui-popupToolGroup-tools {
border-color: var(--wiki-content-border-color);
}
.oo-ui-toolbar-position-top > .oo-ui-toolbar-bar {
border-color: var(--wiki-content-border-color);
box-shadow: 0 1px 1px 0 color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent);
}
.oo-ui-barToolGroup-tools.oo-ui-toolGroup-enabled-tools .oo-ui-tool.oo-ui-widget-disabled.oo-ui-flaggedElement-primary > .oo-ui-tool-link,
.oo-ui-barToolGroup-tools.oo-ui-toolGroup-disabled-tools .oo-ui-tool.oo-ui-flaggedElement-primary > .oo-ui-tool-link {
background-color: var(--wiki-content-text-mix-color);
border-color: var(--wiki-content-text-mix-color);
}
.oo-ui-tool.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-tool-link {
background-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.oo-ui-tool.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-tool-link:hover {
background-color: var(--wiki-accent-color--hover);
color: var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
color: var(--wiki-content-text-color);
}
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
color: var(--wiki-content-text-color--hover);
}
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
color: var(--wiki-content-text-color);
}
.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
color: var(--wiki-content-text-color--hover);
}
.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
color: var(--wiki-alert-color);
}
.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button {
border: 1px solid transparent;
}
.oo-ui-buttonElement-frameless > button.oo-ui-buttonElement-button {
color: inherit;
}
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color), inset 0 0 0 2px var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus,
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
background-color: var(--wiki-accent-color--hover);
border-color: var(--wiki-accent-color--hover);
color: var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
background-color: #bf0017;
border-color: #bf0017;
color: #fff;
}
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus,
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
background-color: #59000b;
border-color: #59000b;
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus {
box-shadow: inset 0 0 0 1px var(--wiki-accent-color--hover), inset 0 0 0 2px var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color--hover);
color: var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-link-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
color: var(--wiki-accent-color);
}
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > input.oo-ui-buttonElement-button,
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
background-color: color-mix(in srgb, var(--wiki-content-link-color) 8%, transparent);
color: var(--wiki-content-text-color);
border-color: var(--wiki-content-text-mix-color);
}
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
color: color-mix(in srgb, var(--wiki-content-link-color) 90%, transparent);
border-color: color-mix(in srgb, var(--wiki-content-link-color) 90%, transparent);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
background-color: transparent;
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
background-color: var(--wiki-content-dynamic-color--inverted);
}
.oo-ui-buttonSelectWidget.oo-ui-widget-enabled:focus .oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected .oo-ui-buttonElement-button {
border-color: var(--wiki-accent-color--hover);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color--hover), inset 0 0 0 2px var(--wiki-accent-label-color);
}
.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:nth-child(2n) td,
.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:hover td {
background-color: var(--wiki-content-background-color--secondary);
}
.oo-ui-popupWidget-popup {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.mw-advancedSearch-namespace-selection {
background: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
}
.oo-ui-popupWidget-popup .mw-advancedSearch-tooltip-head {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-menuSectionOptionWidget {
color: var(--wiki-content-text-mix-color);
}
/* possibly deprecated */
.mw-ui-button:not(:disabled) {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
color: var(--wiki-accent-color);
border-color: var(--wiki-content-border-color);
}
.mw-ui-button:not(:disabled):visited {
color: var(--wiki-accent-color);
}
.mw-ui-button:not(:disabled):hover {
background-color: var(--wiki-content-text-mix-color-95);
border-color: var(--wiki-content-border-color);
color: var(--wiki-accent-color--hover);
}
.mw-ui-button:not(:disabled):focus {
border-color: var(--wiki-accent-color);
color: var(--wiki-content-text-color);
box-shadow: none;
}
.mw-ui-button:not(:disabled):active,
.mw-ui-button:not(:disabled).is-on {
background-color: var(--wiki-content-background-color);
color: var(--wiki-content-dynamic-color);
border-color: var(--wiki-content-link-color);
}
/* end possibly deprecated */
.mw-ui-icon-before::before {
filter: var(--wiki-icon-to-link-filter);
}
.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
background-color: var(--wiki-content-background-color);
color: var(--wiki-content-text-color);
border-color: var(--wiki-content-border-color);
}
.oo-ui-windowManager-modal > .oo-ui-dialog {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 50%, transparent);
}
.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
border-color: var(--wiki-content-border-color);
}
.oo-ui-messageDialog-message {
color: var(--wiki-content-text-color);
}
.oo-ui-buttonElement-framed:not(.oo-ui-flaggedElement-primary):not(.oo-ui-buttonElement-active) > .oo-ui-buttonElement-button {
color: var(--wiki-content-text-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-disabled:not(.oo-ui-flaggedElement-primary):not(.oo-ui-buttonElement-active) > .oo-ui-buttonElement-button {
color: var(--wiki-content-text-mix-color-95);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
color: var(--wiki-accent-color);
border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
color: var(--wiki-accent-color--hover);
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 3px var(--wiki-accent-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-link-color--hover);
border-color: var(--wiki-content-link-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
background-color: var(--wiki-content-text-mix-color);
border-color: var(--wiki-content-text-mix-color);
}
.tdg-templateDataParamWidget-param-description {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-messageWidget.oo-ui-flaggedElement-error:not(.oo-ui-messageWidget-block),
.mw-body-content .error {
color: var(--wiki-alert-color);
}
.oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-error {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-alert-color);
border-left-width: 10px;
}
.oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-warning {
background-color: var(--wiki-content-background-color--secondary);
}
.oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-success {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-success-color);
border-left-width: 10px;
}
.oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-notice {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-text-mix-color);
}
.tdg-templateDataParamWidget-param-alias {
color: var(--wiki-content-text-mix-color);
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
}
.tdg-templateDataParamWidget-param-alias:first-child {
background-color: var(--wiki-content-background-color--secondary);
}
.mw-templatedata-doc-muted {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-processDialog-actions-safe .oo-ui-widget-enabled.oo-ui-iconElement:not(.oo-ui-labelElement) > .oo-ui-buttonElement-button:active {
background-color: var(--wiki-content-background-color--secondary);
border-right-color: var(--wiki-accent-color);
}
/* Date picker */
.mw-widget-dateInputWidget-handle {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.mw-widget-dateInputWidget.oo-ui-widget-enabled .mw-widget-dateInputWidget-handle:hover {
border-color: var(--wiki-accent-color);
box-shadow: none;
}
.mw-widget-dateInputWidget.oo-ui-widget-enabled .mw-widget-dateInputWidget-handle:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.mw-widget-dateInputWidget.oo-ui-widget-enabled .mw-widget-dateInputWidget-handle > .oo-ui-labelElement-label {
color: var(--wiki-content-text-color);
}
.mw-widget-calendarWidget {
border-color: var(--wiki-content-border-color);
}
.mw-widget-calendarWidget:focus {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.mw-widget-dateInputWidget-calendar {
background-color: var(--wiki-content-background-color);
}
.mw-widget-dateInputWidget-calendar:focus {
box-shadow: inset 0 0 0 1px var(--wiki-accent-color), 0 2px 2px 0 rgba(0, 0, 0, 0.2);
}
.mw-widget-calendarWidget-header .oo-ui-labelElement-label,
.mw-widget-calendarWidget-day,
.mw-widget-calendarWidget-month,
.mw-widget-calendarWidget-year {
color: var(--wiki-content-text-color);
}
.mw-widget-calendarWidget-day-heading,
.mw-widget-calendarWidget-day-additional {
color: color-mix(in srgb, var(--wiki-content-text-color) 55%, transparent);
}
.mw-widget-calendarWidget-day-today {
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.mw-widget-calendarWidget-item-selected {
background-color: color-mix(in srgb, var(--wiki-accent-color) 90%, transparent);
color: var(--wiki-accent-label-color);
}
.mw-widget-calendarWidget-item:hover {
background-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.mw-widgets-datetime-calendarWidget:focus {
border-color: var(--wiki-content-border-color);
box-shadow: none;
}
.mw-widgets-datetime-calendarWidget-grid {
overflow-x: initial;
}
.mw-widgets-datetime-dateTimeInputWidget-handle {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.mw-widgets-datetime-dateTimeInputWidget.oo-ui-widget-enabled .mw-widgets-datetime-dateTimeInputWidget-handle:hover {
border-color: var(--wiki-content-border-color);
}
.mw-widgets-datetime-dateTimeInputWidget.oo-ui-widget-enabled .mw-widgets-datetime-dateTimeInputWidget-editField:hover {
background-color: var(--wiki-content-background-color);
}
.mw-widgets-datetime-calendarWidget {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
}
.mw-widgets-datetime-calendarWidget-grid .mw-widgets-datetime-calendarWidget-cell.mw-widgets-datetime-calendarWidget-extra .oo-ui-buttonElement-button .oo-ui-labelElement-label {
color: color-mix(in srgb, var(--wiki-content-text-color) 55%, transparent);
}
/* Unpatrolled page creations on Special:NewPages */
.not-patrolled {
background-color: color-mix(in srgb, var(--wiki-warning-color) 16%, transparent);
}
.mw-spinner-container > div::after {
background-color: var(--wiki-content-text-color);
}
pre,
code,
.mw-code {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.mw-templatedata-doc-param-alias {
color: var(--wiki-content-text-mix-color);
}
.mw-highlight{
overflow: unset !important;
}
.mw-highlight pre{
overflow: auto;
}
div.mw-highlight,
.skin-theme-clientpref-night div.mw-highlight {
background-color: var(--wiki-content-dynamic-color--inverted);
margin: 0.5em 0;
}
.mw-highlight pre {
background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent);
margin: 0;
}
.mw-content-ltr.mw-highlight-lines pre,
.mw-content-ltr.content .mw-highlight-lines pre {
padding-left: 3.5em;
box-shadow: inset 2.75em 0 0 var(--wiki-content-dynamic-color--inverted);
}
.mw-highlight .hll {
background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent)
}
.mw-apisandbox-toolbar {
background: var(--wiki-content-background-color--secondary);
top: var(--wikigg-header-scroll-height);
}
/* special:replacetext */
.ext-replacetext-searchoptions {
background-color: transparent;
border: 1px solid var(--wiki-content-border-color);
}
.ext-replacetext-searchoptions .ext-replacetext-divider {
border-bottom: 1px solid var(--wiki-content-border-color);
}
/**/
.view-dark textarea {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.view-dark textarea:focus-visible {
outline-color: var(--wiki-accent-color);
outline-style: solid;
}
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea.oo-ui-inputWidget-input:focus {
outline: 1px solid var(--wiki-accent-color);
}
/* make math formulas legible on dark theme */
.mwe-math-fallback-image-inline,
.mwe-math-fallback-image-display,
.ve-ui-mwLatexPage-symbol {
filter: var(--wiki-icon-general-filter);
}
/* search bar */
#searchInput {
font-size: inherit; /* override UA style */
background-color: var(--wiki-navigation-search-background-color, var(--wiki-content-background-color--secondary));
background-image: var(--wiki-navigation-search-background-image, none);
background-position: var(--wiki-navigation-search-background-position, 0);
background-size: var(--wiki-navigation-search-background-size, auto);
background-repeat: var(--wiki-navigation-search-background-repeat, repeat);
border: var(--wiki-navigation-search-border-width, 1px) var(--wiki-navigation-search-border-style, solid) var(--wiki-navigation-search-border-color, var(--wiki-content-border-color));
border-radius: var(--wiki-navigation-search-border-radius, 2px);
color: var(--wiki-navigation-search-text-color, var(--wiki-content-text-color));
backdrop-filter: var(--wiki-navigation-search-backdrop-filter, none);
box-shadow: var(--wiki-navigation-search-box-shadow, none);
border-image: var(--wiki-navigation-search-border-image, none);
}
#searchInput:focus,
#searchform:hover #searchInput,
#searchform:hover #searchInput:focus {
border-color: var(--wiki-navigation-search-border-color--hover, var(--wiki-accent-color));
box-shadow: var(--wiki-navigation-search-box-shadow--hover, var(--wiki-navigation-search-box-shadow, none));
border-image: var(--wiki-navigation-search-border-image--hover, var(--wiki-navigation-search-border-image, none));
}
#searchButton {
filter: var(--wiki-icon-to-link-filter);
}
.vector-search-box-input::placeholder {
color: var(--wiki-content-text-mix-color);
}
/* Search suggestions */
.suggestions-results,
.suggestions-special {
background-color: var(--wiki-content-background-color--secondary);
}
.suggestions a.mw-searchSuggest-link,
.suggestions a.mw-searchSuggest-link:hover,
.suggestions a.mw-searchSuggest-link:active,
.suggestions a.mw-searchSuggest-link:focus {
color: var(--wiki-content-text-color);
}
.suggestions-result {
color: var(--wiki-content-link-color);
}
.suggestions-result-current {
background-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.suggestions-special .special-label {
color: var(--wiki-content-text-mix-color);
}
.suggestions-special .special-query {
color: var(--wiki-content-text-color);
}
.suggestions-special.suggestions-result-current .special-label,
.suggestions-special.suggestions-result-current .special-query {
color: var(--wiki-accent-label-color);
}
/* search page */
fieldset#mw-searchoptions {
background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent);
border-color: var(--wiki-content-border-color);
}
#mw-searchoptions .divider {
border-color: var(--wiki-content-border-color);
}
.mw-search-profile-tabs {
background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent);
border: 1px solid var(--wiki-content-border-color);
margin-top: 1em;
}
.mw-search-profile-tabs div.search-types ul li.current a {
color: var(--wiki-content-text-color);
}
.results-info,
.mw-search-result-data {
color: var(--wiki-content-text-mix-color);
}
/**/
/* Login/register page */
.mw-number-text {
color: var(--wiki-content-text-mix-color);
}
.mw-body-content .mw-number-text h3 {
color: var(--wiki-content-heading-color);
}
.mw-number-text.icon-edits,
.mw-number-text.icon-pages,
.mw-number-text.icon-contributors {
position: relative;
background: none;
}
.mw-number-text.icon-edits::before,
.mw-number-text.icon-pages::before,
.mw-number-text.icon-contributors::before {
position: absolute;
width: 95px;
height: 100%;
left: 0;
top: 0;
content: '';
filter: brightness(0) var(--wiki-icon-general-filter);
}
.mw-number-text.icon-edits::before {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABLCAYAAADnAAD1AAACrUlEQVR4AWL4//8/oH170LEsiKIwXGPbtm0EY9s2g7bdjzh4oVnjyslKVZ3hSu+d5L/c0Xdx/Bt5jjCyAR3QAd9/+DhSW4oeoYmJGQdM4HWjYfQKTXTA8pZFeIgjOmA5Hkd0wDwe6TWa6IAcr4eA5RAdEC0neKWIDoieFcMRRPOAaDJ6+4uITxzwJ+KbmnjdaKkDliISPIv/gcvRxsT7kzgix7MGuBz1ooFyRIq3xOJ64ArUG0EMoMV5RI5nAJDjRV1Go1DIIL7meJKAAngc8Qn/tgoACuCNRtfRJhQyGQLkeJcI3u3oP3GzA5bjjYnwEEE0Acjx+urgEcRNVgFX1sUjdaHF9gA53sW/jScFKIC3SH8hIo5nDXAVwbtA8O6U4+kD6uPpA2rhWQNcXYh3N4HXSfAMAHK8838BTwBQF28hCpKAAnj3SvCsAa4heOdU8NQB5fGUAfXxhAEZ3lmCdz+B18Hx9ABN46kBrv1DeAtQsAZYivdAB08AMMLrJ3hBHU8BkOGdqcyMLcCbj4I1QH08YUCGd0kbTwCQ4MW1oFkR3kM5PAHAdVU8gjhPEk8AkOKRBjN481AwAxjhDRCM4Rq1EzwTgAzvGtoqiicAmMcbjRZI4wkATiP/eVe/4QU0DvXJ4gkAHq9gNEV4cdPRRtQjgycAOA51VkAOoECaiF5J4QkA7iVnuI+vgTcXBauAo1BjBeU0mZuCXlfm2gieOcCN5KzPadH7s9EF1CeJJwD4lKy2BLQM3UFDaFgSTwBwKcE5il6Q1wmeA95KQLGafuI54Ay+I4D2Fm1HY2QwBADPZdCG0EO0Wg5CAHAi6k1ce3E1fdDHAQ8TuG50Ml6F4TngGNQawTWjg2iCPoAG4I5vcG/QVrLDIJMDnvyNBYMDeg7ogA7ogJ4DOqBmnwD4A/itR9A4HwAAAABJRU5ErkJggg==) no-repeat left center;
}
.mw-number-text.icon-pages::before {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABLCAYAAADnAAD1AAAByUlEQVR4Ae3XQ6JcQRhH8Rs7mYWT2LZt25rEtpNvicGCOid51lWhX3X/B78F1ClnjUZDHChCDgVUQAVUwF+//zTbaEzwJKuqFQJOwVOYB0fSDege8RnMg8OxA47HhMhGho4YM+BHWGTXMApZP1NxAqdKuIS3DhETC5gT0cEonM+LmH7A8BHHF4zhUMyAr3DKswt4ARvCVQ8RL8FyHIoV8DqyAEbidMCIu2AFDqUbEBiLd4EiroOVcDDdgMBJWI4rNSOugpV0MOWAa2EBIq6HVXAw1YDzYQEiboVVdCDFgLNhASIegtWwP7WAM2AVXC4Z8SKsho+pBZwDCxDxIZ7hGo5iN7ZgG/bjOj61QsB5sAARxyArMA7nUw+4GuYQcaSHv/PrlAPuhDnYh8zR9ZQDnoF1+ooXuI87uIvH+JoT8ES7B1yJxZiGETnbbAHuKqCbkbiqgG5mK6Cb8QqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogG0acAwmVHRLAXschDlQQAVUwKYGXIZTDo7qFnakgAqogP4ooAK+waVh5GpSAROggAqogFKOAiqgAiqg/AUjJ7hc1MT1egAAAABJRU5ErkJggg==) no-repeat left center
}
.mw-number-text.icon-contributors::before {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAtCAYAAAA5reyyAAAEMElEQVR4AWJ4/uLFYMJsgHbtIVhzLQqg8G7btm3bfLZt2/abtG3btm3btt19tXuNU5UbnV9VPfj2PCtODh7DaOzHDdzEIQxFG6SERItoilcPq6EOpqNsrAdMiWb4CQPQEx+jMsSH13Ad6tJRtIf4UBkfoyf642c0Q8pwBSyOEYiDWpzHP8gIcelZ3IV6dBENIS5lxD84D7WIwwgUD3XActjk8jTLDnFQAiegPm1FFoiD7JgKdbAJ5UIVMA0WQ10aCnEwHBrQ/xAHQ6EuLULqUAT8EurRkxAbtXEWGtBu5IPYeBLq0RemA6bDUqhHwyE2/oIa8qHho3wp0pkM2AS3oR4dRCmIFWZADRkEsUIpHIR6dBtNTAZ8DepDEhpDLIphL9Q9X0dMYyRBfXjNZMD3oT61hFjUwHmoITtQAGLREurT+yYDvgn1IQ4NwhBwP0pALBogDurDmyYDPgL14QjKQCzK43gYjsAyOAL14RGTAcvhKNSjWUgLsciDzVBDliG9zceJWT53fFlzAYGJUI/+g9iYCjVkBMTGv1CPJkJMB/wM6sEdtILY6Aw15A+IjVa4A/Xgs1C9ym2AujQVkoznkQgN6CpaQAwd7euQynxA4EMkuTz6noAkIxu2QQNaAXHwhMujMAkfhvpz1gSogwEQF/pAA/oV4sIAqIPxkFAHLIwVUBuLkQ/iQkNchPp0BHkhLuTDYocjuVDoAwLNobCKx7MQZ0buxn9CPHgO8VBYNYOEI2AxTIPaWI3SEJdq47rPz1jZIC6VxmqHm17RUAYsjm+wB+rgDH5FZYgL/0M9egjiQmX8hjNQB3vwDYqZClgRn2I8TkM9uoxp+BY1IDayYAnUpd8hyaiBbzEdl6EencZ4fIoKXgPWQ0eswTmoIRexCz9DYFUWh6AOeiEFBFYfYYv7aK6cxRp0RL3kAjbBSsRBQ+gwykBg1SrAF+5qOAUNoTisRBNrwHeQAA2D7hAbLQL+qOoBDYMEvA0RRm3cg4bQIYxBO4iNnFgOdfAoJBntMAaHoSF0D7WtbwOmJGIHBuFtFHJxhx8HdeEEnoI4KIS3MQg7kAg1rI8w9kMN2YQ/8RByQRwUxE844GPvj0B9iAu58BD+NPwdcp8wrkEDOoG3kR3iIC0exhAcgQZwHQvwOfJDXMiOt3ECGtA1EwH3oDLERgoUxisYhv24AzUoEWexCD+iJtJBklEF+yId8A7aQywyoCK+xCJcRSI0TO5iL7qjDXIjBcTiIdwNGnAetmKjR8fQHdYL93tYiSRolDiJzqgLseiOYz62fyvmCcOUJ3EAGuV6oUi0rVD9BBpDtqJstARsj3hojFmBdNEQcDw0Rn0V6YAVcBIao2YjXSQDtoDGsDOoFMmAD0FjXLMHAYN5KJIBW+FBwADq4x40hrWLZMCKOIhEXIsxd3EdDSF+3QeCfPkMAgchOAAAAABJRU5ErkJggg==) no-repeat left center
}
/**/
/* Multimedia viewer */
.mw-mmv-post-image,
.mw-mmv-image-metadata {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.mw-mmv-ttf-container .mw-mmv-ttf-ellipsis {
box-shadow: -4px 6px 0 0 var(--wiki-content-background-color);
}
.mw-mmv-title-para .mw-mmv-ttf-ellipsis {
background-color: var(--wiki-content-background-color);
}
.mw-mmv-title-para .mw-mmv-ttf-ellipsis::before {
background-image: linear-gradient(to right, transparent 0%, var(--wiki-content-background-color) 100%);
}
.mw-mmv-ttf-ellipsis-container:hover .mw-mmv-ttf-container .mw-mmv-ttf-ellipsis {
background-color: var(--wiki-content-background-color--secondary);
}
.mw-mmv-ttf-container .mw-mmv-ttf-ellipsis:hover, .mw-mmv-ttf-ellipsis-container .mw-mmv-ttf-container .mw-mmv-ttf-ellipsis:hover {
background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 95%, var(--wiki-content-dynamic-color));
}
.mw-ui-button.mw-ui-progressive:not(:disabled) {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color);
}
.mw-ui-button.mw-ui-progressive:not(:disabled):hover {
background-color: var(--wiki-accent-color--hover);
}
.skin-vector .mw-ui-button.mw-ui-progressive:hover,
.skin-vector .mw-ui-button.mw-ui-primary:disabled {
box-shadow: 0px 0px 16px rgba(0, 0, 0, 0.75) inset, 0 0 5px var(--wiki-content-border-color);
border: 2px solid var(--wiki-content-border-color);
}
.mw-ui-button.mw-ui-progressive:not(:disabled):active,
.mw-ui-button.mw-ui-progressive:not(:disabled).is-on {
background-color: var(--wiki-accent-color);
border-color: var(--wiki-accent-color);
}
.mw-ui-button.mw-ui-progressive {
box-shadow: 0px 0px 16px rgba(0, 0, 0, 0.75) inset, 0 0 5px var(--wiki-content-border-color)
}
/* possibly deprecated */
.mw-ui-input:not(:disabled) {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.mw-ui-input:not(:disabled):hover,
.mw-ui-input:not(:disabled):focus {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
border-color: var(--wiki-accent-color);
box-shadow: none;
}
.mw-ui-input::placeholder {
color: var(--wiki-content-text-mix-color);
}
/* end possibly deprecated */
.mw-mmv-dialog {
background-color: var(--wiki-content-background-color);
box-shadow: 0 2px 2px 0 var(--wiki-content-border-color);
}
.mw-mmv-dialog .mw-mmv-dialog-down-arrow {
background-color: var(--wiki-content-background-color);
}
.mw-mmv-options-dialog-header {
color: var(--wiki-content-text-color);
}
.mw-mmv-options-text-header,
.mw-mmv-options-text-body {
color: var(--wiki-content-text-mix-color);
}
.mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-select-menu {
background-image: none;
}
.mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-select-menu span {
display: none;
}
.mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-select-menu::after {
display: inline-block;
width: 8px;
height: 100%;
content: '';
--mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2212%22 viewBox=%220 0 12 12%22%3E %3Cpath fill=%22%23000%22 fill-rule=%22evenodd%22 d=%22m2.023 3 3.49 5.953L9 3z%22 clip-rule=%22evenodd%22/%3E %3C/svg%3E") no-repeat;
--mask-size: 12px;
--mask-position: center;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: var(--mask-size);
mask-size: var(--mask-size);
-webkit-mask-position: var(--mask-position);
mask-position: var(--mask-position);
background-color: currentColor;
}
.mw-mmv-embed-dimensions {
color: color-mix(in srgb, var(--wiki-content-text-color) 76%, transparent);
}
.oo-ui-optionWidget-selected .mw-mmv-embed-dimensions {
color: color-mix(in srgb, var(--wiki-content-text-color) 82%, transparent);
}
.mw-mmv-download-pane .mw-mmv-download-attribution {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-mix-color);
}
.mw-mmv-download-pane .mw-mmv-download-attribution:hover {
background-color: var(--wiki-content-dynamic-color--inverted);
color: var(--wiki-content-text-color);
}
.mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-preview-link,
.mw-mmv-download-pane .mw-mmv-download-attribution-cta-invite {
color: var(--wiki-content-text-mix-color);
}
.mw-ui-button.mw-ui-quiet,
.mw-ui-button.mw-ui-quiet.mw-ui-progressive,
.mw-ui-button.mw-ui-quiet.mw-ui-destructive {
color: var(--wiki-accent-color);
}
.mw-ui-button.mw-ui-progressive:not(:disabled):focus {
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 1), inset 0 0 0 2px var(--wiki-accent-color);
}
input[type="checkbox"]:active + .mw-ui-button.mw-ui-quiet,
input[type="checkbox"]:active + .mw-ui-button.mw-ui-quiet.mw-ui-progressive,
input[type="checkbox"]:active + .mw-ui-button.mw-ui-quiet.mw-ui-destructive,
.mw-ui-button.mw-ui-quiet:active,
.mw-ui-button.mw-ui-quiet.mw-ui-progressive:active,
.mw-ui-button.mw-ui-quiet.mw-ui-destructive:active,
input[type="checkbox"]:focus + .mw-ui-button.mw-ui-quiet,
input[type="checkbox"]:focus + .mw-ui-button.mw-ui-quiet.mw-ui-progressive,
input[type="checkbox"]:focus + .mw-ui-button.mw-ui-quiet.mw-ui-destructive,
.mw-ui-button.mw-ui-quiet:focus,
.mw-ui-button.mw-ui-quiet.mw-ui-progressive:focus,
.mw-ui-button.mw-ui-quiet.mw-ui-destructive:focus {
color: var(--wiki-content-text-color);
}
/**/
/* Echo */
.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-optionWidget-selected > .oo-ui-buttonElement-button:hover {
color: var(--wiki-accent-label-color);
}
.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
color: var(--wiki-content-text-color);
}
@-webkit-keyframes unseen-fadeout-to-unread {
from {
background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent);
}
to {
background-color: var(--wiki-content-background-color--secondary);
}
}
@keyframes unseen-fadeout-to-unread {
from {
background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent);
}
to {
background-color: var(--wiki-content-background-color--secondary);
}
}
@-webkit-keyframes unseen-fadeout-to-read {
from {
background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent);
}
to {
background-color: var(--wiki-content-background-color);
}
}
@keyframes unseen-fadeout-to-read {
from {
background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent);
}
to {
background-color: var(--wiki-content-background-color);
}
}
.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before {
border-bottom-color: var(--wiki-content-border-color);
}
.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
border-bottom-color: var(--wiki-content-background-color--secondary);
}
.client-js .mw-echo-special-nojs {
filter: var(--wiki-icon-general-filter)
}
/**/
/* codex fixes */
.cdx-checkbox__icon {
background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent);
}
.mw-echo-ui-toggleReadCircleButtonWidget:hover .mw-echo-ui-toggleReadCircleButtonWidget-circle {
background-color: var(--wiki-accent-color--hover);
}
.mw-echo-ui-toggleReadCircleButtonWidget-circle-unread {
background-color: transparent;
}
.mw-echo-ui-toggleReadCircleButtonWidget:hover .mw-echo-ui-toggleReadCircleButtonWidget-circle-unread {
background-color: var(--wiki-content-text-mix-color-95);
}
/**/
/*************************
* End Vector theme fixes *
**************************/
/************************
* Theme-based Scribunto *
*************************/
#mw-scribunto-input {
background-color: var(--wiki-content-background-color--secondary);
border: 1px solid var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.mw-scribunto-console-fieldset,
.mw-scribunto-message,
.mw-scribunto-input,
.mw-scribunto-error,
.mw-scribunto-print,
.mw-scribunto-normalOutput {
background: transparent;
}
.mw-scribunto-console-fieldset {
color: var(--wiki-content-text-color);
}
.mw-scribunto-message {
color: var(--wiki-content-text-color);
}
.mw-scribunto-input {
color: var(--wiki-content-text-color--hover);
}
.mw-scribunto-error {
color: var(--wiki-alert-color);
}
.mw-scribunto-print {
color: var(--wiki-content-text-color);
}
.mw-scribunto-normalOutput {
color: var(--wiki-content-text-color);
}
/****************
* End Scribunto *
*****************/
/***************************
* Theme-based VisualEditor *
****************************/
.ve-activated .vector-menu-tabs .selected {
box-shadow: none;
}
.ve-init-mw-progressBarWidget {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-accent-color);
box-shadow: 0 1px 1px color-mix(in srgb, var(--wiki-content-dynamic-color) 15%, transparent);
}
.ve-init-mw-progressBarWidget-bar {
background-color: var(--wiki-accent-color);
}
.ve-init-mw-desktopArticleTarget-toolbarPlaceholder-bar {
border-bottom-color: var(--wiki-content-border-color);
}
.ve-init-mw-desktopArticleTarget-toolbarPlaceholder-floating .ve-init-mw-desktopArticleTarget-toolbarPlaceholder-bar {
top: var(--wikigg-header-scroll-height, 0);
background: var(--wiki-content-background-color);
}
div.ve-ce-branchNode {
border-color: var(--wiki-content-border-color);
}
.ve-ce-focusableNode-highlight {
background: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.ve-ce-surface-highlights-focused .ve-ce-focusableNode-highlights {
opacity: 0.25;
}
.ve-ce-branchNode-blockSlug, .ve-ce-branchNode-newSlug:not(.ve-ce-branchNode-newSlug-open) {
outline-color: var(--wiki-accent-color);
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 75%, transparent);
}
figure[typeof~='mw:File/Thumb'],
figure[typeof~='mw:File/Frame'],
figure[typeof~='mw:Image/Thumb'],
figure[typeof~='mw:Video/Thumb'],
figure[typeof~='mw:Audio/Thumb'],
figure[typeof~='mw:Image/Frame'],
figure[typeof~='mw:Video/Frame'],
figure[typeof~='mw:Audio/Frame'] {
border-color: var(--wiki-content-border-color);
background-color: var(--wiki-content-background-color--secondary);
}
figure[typeof~='mw:File/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:File/Frame'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Image/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Video/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Audio/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Image/Frame'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Video/Frame'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Audio/Frame'] > a:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:File/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:File/Frame'] > span:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Image/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Video/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Audio/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Image/Frame'] > span:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Video/Frame'] > span:first-child > *:first-child:not(.mw-broken-media),
figure[typeof~='mw:Audio/Frame'] > span:first-child > *:first-child:not(.mw-broken-media) {
border-color: var(--wiki-content-border-color);
background: var(--wiki-content-background-color--secondary);
}
figure[typeof~='mw:File/Thumb'] > figcaption,
figure[typeof~='mw:File/Frame'] > figcaption,
figure[typeof~='mw:Image/Thumb'] > figcaption,
figure[typeof~='mw:Video/Thumb'] > figcaption,
figure[typeof~='mw:Audio/Thumb'] > figcaption,
figure[typeof~='mw:Image/Frame'] > figcaption,
figure[typeof~='mw:Video/Frame'] > figcaption,
figure[typeof~='mw:Audio/Frame'] > figcaption {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.ve-ui-specialCharacterPage-character,
.oo-ui-toolbar-position-top .ve-ui-toolbarDialog-position-above,
.oo-ui-bookletLayout > .oo-ui-menuLayout-menu,
.ve-ui-mwTwoPaneTransclusionDialogLayout > .oo-ui-menuLayout-menu,
.ve-ui-specialCharacterPage-character:hover {
border-color: var(--wiki-content-border-color);
}
.ve-ui-specialCharacterPage-character:hover {
box-shadow: inset 0 0 1px 1px var(--wiki-accent-color);
}
.oo-ui-listToolGroup-tools .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-title,
.oo-ui-popupToolGroup-tools .oo-ui-tool-link .oo-ui-tool-accel {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-barToolGroup-tools.oo-ui-toolGroup-enabled-tools .oo-ui-tool.oo-ui-widget-disabled.oo-ui-flaggedElement-primary > .oo-ui-tool-link .oo-ui-tool-title,
.oo-ui-barToolGroup-tools.oo-ui-toolGroup-disabled-tools .oo-ui-tool.oo-ui-flaggedElement-primary > .oo-ui-tool-link .oo-ui-tool-title {
color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 78%, transparent);
}
.ve-activated .ve-init-mw-desktopArticleTarget-originalContent #catlinks:hover {
background: color-mix(in srgb, var(--wiki-content-link-color) 10%, transparent);
}
.oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected {
color: var(--wiki-accent-color);
box-shadow: inset 0 -2px 0 0 var(--wiki-accent-color);
}
.oo-ui-tabOptionWidget {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-widget-enabled:not(.oo-ui-optionWidget-selected):hover {
color: var(--wiki-accent-color--hover);
box-shadow: inset 0 -2px 0 0 var(--wiki-accent-color--hover);
}
.oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-widget-enabled:not(.oo-ui-optionWidget-selected):active {
color: var(--wiki-content-text-color);
box-shadow: inset 0 -2px 0 0 var(--wiki-accent-color--hover);
}
.oo-ui-tabSelectWidget-frameless {
box-shadow: inset 0 -1px 0 0 var(--wiki-content-border-color);
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input {
border-color: var(--wiki-alert-color);
}
.ve-ce-linkAnnotation.ve-ce-annotation-active {
box-shadow: 0 0 0 1px color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent);
background-color: color-mix(in srgb, var(--wiki-content-link-color) 10%, transparent);
}
.ve-ui-mwInternalLinkContextItem-withImage > .oo-ui-iconElement.oo-ui-iconElement-icon {
background-color: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 90%, var(--wiki-content-dynamic-color));
border-color: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 90%, var(--wiki-content-dynamic-color));
filter: unset;
}
.mw-widget-titleWidget-menu-withImages .mw-widget-titleOptionWidget.oo-ui-iconElement > .oo-ui-iconElement-icon.mw-widget-titleOptionWidget-hasImage {
filter: unset;
}
.mw-widget-titleWidget-menu-withImages .mw-widget-titleOptionWidget.oo-ui-iconElement > .oo-ui-iconElement-icon:not(.mw-widget-titleOptionWidget-hasImage) {
background-color: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 90%, var(--wiki-content-dynamic-color));
filter: unset;
}
.ve-ui-desktopContext .ve-ui-linkContextItem .ve-ui-linkContextItem-label .ve-ui-linkContextItem-label-preview {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-toolbarDialog {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent);
}
.ve-ce-languageAnnotation {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent);
border-color: var(--wiki-content-link-color);
}
.mw-widget-mediaResultWidget-overlay {
box-shadow: inset 0 0 0 1px var(--wiki-content-border-color);
}
.mw-widget-mediaResultWidget .mw-widget-mediaResultWidget-nameLabel {
color: #fff;
}
.oo-ui-processDialog-actions-safe .oo-ui-widget-enabled.oo-ui-iconElement:not(.oo-ui-labelElement) > .oo-ui-buttonElement-button {
background-color: transparent;
border-right-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
}
.oo-ui-selectFileWidget-dropTarget {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
}
.oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget {
background-color: var(--wiki-content-background-color);
}
.oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover {
border-color: var(--wiki-content-text-mix-color);
}
.oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget,
.oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileInputWidget-info > .oo-ui-inputWidget-input {
background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent);
color: var(--wiki-accent-color);
}
.oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
.oo-ui-selectFileWidget.oo-ui-selectFileInputWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget {
background-color: var(--wiki-content-text-mix-color-95);
border-color: var(--wiki-content-dynamic-color--secondary);
}
.mw-upload-bookletLayout-filePreview {
background-color: var(--wiki-content-background-color--secondary);
}
.ve-ui-mwMediaDialog-panel-imageinfo-details {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-inputWidget-input {
-webkit-text-fill-color: color-mix(in srgb, var(--wiki-content-text-color) 50%, transparent);
}
.oo-ui-optionWidget.oo-ui-widget-disabled {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-mwLanguagesPage-languages-table th,
.ve-ui-mwLanguagesPage-languages-table td {
border-bottom-color: var(--wiki-content-border-color);
}
.ve-ui-mwLanguagesPage-languages-table tr:nth-child(even) td {
background: var(--wiki-content-background-color);
}
.ve-ui-mwLanguagesPage-languages-table tr:nth-child(odd) td {
background: color-mix(in srgb, var(--wiki-content-dynamic-color--secondary) 5%, transparent);
}
.ve-ui-targetWidget {
border-color: var(--wiki-content-border-color);
}
.ve-ui-targetWidget:not(.oo-ui-pendingElement-pending) {
background: var(--wiki-content-background-color);
}
.ve-ui-targetWidget-focused {
border-color: var(--wiki-accent-color);
box-shadow: inset 0 0 0 1px var(--wiki-accent-color);
}
.ve-ui-mwTransclusionOutlineTemplateWidget-sticky {
background-color: var(--wiki-content-background-color);
}
.ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.oo-ui-optionWidget-highlighted {
color: var(--wiki-content-dynamic-color);
}
.ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.ve-ui-mwTransclusionOutlineParameterWidget-activePage,
.ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.ve-ui-mwTransclusionOutlineParameterWidget-activePage:hover,
.ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.ve-ui-mwTransclusionOutlineParameterWidget-activePage.oo-ui-optionWidget-highlighted {
color: var(--wiki-accent-color);
}
.ve-ui-mwTransclusionOutlineTemplateWidget-no-template-parameters {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-mwTemplatePage-description {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-mwParameterPage-doc-required,
.ve-ui-mwParameterPage-doc-deprecated,
.ve-ui-mwParameterPage-inlineDescription .ve-ui-mwParameterPage-doc-example {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-expandableContent-fade {
background: linear-gradient(to right, transparent 0, var(--wiki-content-background-color) 90%);
}
.ve-ui-expandableContent-toggle {
background-color: var(--wiki-content-background-color);
}
.ve-ui-mwParameterPage-undocumentedLabel {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-mwLatexDialog-content .oo-ui-bookletLayout-stackLayout h3 {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-mwLatexPage-symbol {
border-color: var(--wiki-content-border-color);
}
.ve-ui-mwGalleryDialog-highlighted-image {
background-color: var(--wiki-content-background-color--secondary);
}
.ve-ui-mwHelpListToolGroup-tools-footer {
border-color: var(--wiki-content-border-color);
}
.ve-ui-mwHelpListToolGroup-version-link,
.ve-ui-mwHelpListToolGroup-version-date,
.ve-ui-mwHelpPopupTool-version-label,
.ve-ui-mwHelpPopupTool-version-link,
.ve-ui-mwHelpPopupTool-version-date {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-mwSaveDialog-summary {
background-color: var(--wiki-content-background-color);
}
.ve-ui-mwSaveDialog-options {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.ve-ui-mwSaveDialog-license {
color: var(--wiki-content-text-mix-color);
}
.oo-ui-processDialog .oo-ui-actionWidget:not(.oo-ui-flaggedElement-progressive):not(.oo-ui-flaggedElement-destructive) > .oo-ui-buttonElement-button:hover,
.oo-ui-processDialog .oo-ui-actionWidget:not(.oo-ui-flaggedElement-progressive):not(.oo-ui-flaggedElement-destructive) > .oo-ui-buttonElement-button:active {
border-right-color: var(--wiki-accent-color);
border-left-color: var(--wiki-accent-color);
}
.ve-ui-debugBar {
border-color: var(--wiki-content-border-color);
}
.ve-ui-debugBar-commands-divider {
border-color: var(--wiki-content-border-color);
}
.ve-ui-debugBar-dump > table {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.ve-ui-debugBar-dump td {
background-color: var(--wiki-content-background-color);
}
.ve-ui-debugBar-dump th {
color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent);
text-shadow: 0 1px 1px var(--wiki-content-dynamic-color--inverted);
}
.ve-ui-debugBar-dump ol {
color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent);
}
.ve-ui-debugBar-dump li .ve-ui-debugBar-dump-element,
.ve-ui-debugBar-dump li .ve-ui-debugBar-dump-char,
.ve-ui-debugBar-dump li .ve-ui-debugBar-dump-achar {
background-color: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-dynamic-color);
text-shadow: 0 1px 1px var(--wiki-content-dynamic-color--inverted);
}
.ve-ui-debugBar-dump li .ve-ui-debugBar-dump-element {
background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent);
}
.ve-ui-debugBar-dump li .ve-ui-debugBar-dump-char {
background-color: color-mix(in srgb, var(--wiki-success-color) 20%, transparent);
}
.ve-ui-debugBar-dump li .ve-ui-debugBar-dump-achar {
background-color: color-mix(in srgb, var(--wiki-warning-color) 20%, transparent);
}
.ve-ui-debugBar-dump li .ve-ui-debugBar-dump-note {
color: var(--wiki-content-text-mix-color);
}
.ve-ui-debugBar-filibuster {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.ve-ui-debugBar-transactions > ol > li {
border-color: var(--wiki-content-border-color);
}
/*******************
* End VisualEditor *
********************/
/**************************
* Theme-based AbuseFilter *
***************************/
table.mw-abuselog-details {
background: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
}
table.mw-abuselog-details th,
table.mw-abuselog-details td,
div.mw-abusefilter-editor {
border-color: var(--wiki-content-border-color);
}
table.mw-abuselog-details th {
background: var(--wiki-content-background-color--secondary);
}
body td.mw-abusefilter-history-changed {
background-color: color-mix(in srgb, var(--wiki-alert-color) 20%, transparent);
}
/******************
* End AbuseFilter *
*******************/
/************************************
* Theme-based Special:MultiPageEdit *
*************************************/
:root {
--jexcel-border-color: var(--wiki-content-border-color); /* this is defined by the extension but does not seem to be used anywhere. We override it just in case *shrug* */
}
.jexcel,
.jexcel_container.fullscreen .jexcel_content {
background-color: var(--wiki-content-background-color);
border-bottom-color: var(--wiki-content-border-color);
border-right-color: var(--wiki-content-border-color);
}
table.jexcel > tbody > tr > td:first-child,
table.jexcel > thead,
table.jexcel > thead > tr > td,
table.jexcel > tbody > tr.selected > td:first-child,
table.jexcel > thead > tr > td.selected {
background-color: var(--wiki-content-background-color--secondary);
}
table.jexcel > tbody > tr.selected > td:first-child,
table.jexcel > thead > tr > td.selected {
background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent);
}
table.jexcel > thead > tr > td {
border-bottom-color: var(--wiki-content-border-color);
}
.jexcel > thead > tr > td.arrow-up,
.jexcel > thead > tr > td.arrow-down {
background: none;
}
.jexcel > thead > tr > td.arrow-up::after,
.jexcel > thead > tr > td.arrow-down::after {
display: inline-block;
position: absolute;
right: 0;
top: 0;
background-repeat: no-repeat;
background-position: center right 5px;
width: 22px;
height: 100%;
content: '';
filter: brightness(50%) var(--wiki-icon-general-filter);
}
.jexcel > thead > tr > td.arrow-up::after {
background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 14l5-5 5 5H7z' fill='gray'/%3E%3C/svg%3E");
}
.jexcel > thead > tr > td.arrow-down::after {
background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='gray'/%3E%3C/svg%3E");
}
.jexcel > thead > tr:nth-child(2) > td {
z-index: 1; /* prevents overlapping the headings after scrolling on tall tables */
}
.jexcel > tbody > tr > td {
border-top-color: var(--wiki-content-text-mix-color-95);
border-bottom-color: var(--wiki-content-text-mix-color-95);
}
.jexcel > tbody > tr > td.readonly {
color: var(--wiki-content-text-mix-color);
}
.jexcel_content {
scrollbar-color: var(--wiki-content-text-mix-color) transparent;
/* we need this important to override inline styling */
box-shadow: var(--wiki-content-dynamic-color--secondary--inverted) 2px 2px 5px 0.1px !important;
}
.jexcel .highlight {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent);
}
.jexcel .highlight-top {
border-top-color: var(--wiki-content-text-mix-color);
box-shadow: 0px -1px var(--wiki-content-dynamic-color--secondary--inverted);
}
.jexcel .highlight-left {
border-left-color: var(--wiki-content-text-mix-color);
box-shadow: -1px 0px var(--wiki-content-dynamic-color--secondary--inverted);
}
.jexcel .highlight-top.highlight-left {
box-shadow: -1px -1px var(--wiki-content-dynamic-color--secondary--inverted);
}
.jexcel .highlight-right {
border-right-color: var(--wiki-content-text-mix-color);
}
.jexcel .highlight-bottom {
border-bottom-color: var(--wiki-content-text-mix-color);
}
.jexcel .jexcel_column_filter {
background: none;
}
.jexcel .jexcel_column_filter::after {
display: inline-block;
position: absolute;
right: 0;
top: 0;
background-repeat: no-repeat;
background-position: top 50% right 5px;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='gray' width='18px' height='18px'%3E%3Cpath d='M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E");
width: 20px;
height: 100%;
content: '';
filter: brightness(50%) var(--wiki-icon-general-filter);
}
.jexcel_pagination > div > div {
background-color: var(--wiki-accent-color);
/* we need this important to override a built-in one */
color: var(--wiki-accent-label-color) !important;
}
.jexcel_page_selected {
background: linear-gradient(to bottom, var(--wiki-accent-color) 0%, var(--wiki-accent-color--hover) 100%);
/* we need this important to override a built-in one */
border: 1px solid var(--wiki-content-border-color) !important;
}
/****************************
* End Special:MultiPageEdit *
*****************************/
/***********************
* Theme-based msupload *
************************/
#msupload-div,
#msupload-list .file {
background-color: var(--wiki-content-background-color);
border-color: var(--wiki-content-border-color);
}
#msupload-select {
filter: brightness(0) var(--wiki-icon-to-link-filter);
}
#msupload-dropzone {
border-color: var(--wiki-content-border-color);
color: var(--wiki-content-text-color);
}
.drop-over {
background-color: var(--wiki-accent-color);
color: var(--wiki-accent-label-color) !important;
}
#msupload-bottom {
border-color: var(--wiki-content-border-color);
}
#msupload-bottom #msupload-files {
padding-left: 0;
background: none;
}
#msupload-bottom #msupload-files::before {
display: inline-block;
background: url(/extensions/MsUpload/resources/images/msu-upload-icon.png?bdd61) no-repeat 0 0;
background-position: left center;
height: 22px;
width: 25px;
content: '';
vertical-align: top;
filter: var(--wiki-icon-general-filter);
}
#msupload-list .file .file-size {
color: var(--wiki-content-text-mix-color);
}
#msupload-div a {
color: var(--wiki-content-link-color);
}
#msupload-list .file .file-name:hover {
background-color: var(--wiki-content-dynamic-color--inverted);
}
#msupload-list .file .file-name-input {
background: var(--wiki-content-dynamic-color--inverted);
}
#msupload-list .file .file-warning {
color: var(--wiki-warning-color);
}
/***************************
* End theme-based msupload *
****************************/
/*****************************
* Theme-based commentstreams *
******************************/
.cs-title-edit-field {
border-color: var(--wiki-accent-color);
}
.cs-title-edit-field::placeholder,
.view-dark .cs-body-edit-field::placeholder {
color: var(--wiki-content-text-mix-color);
}
.cs-edit-box,
.cs-expanded .cs-comment-header {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.cs-target-comment .cs-comment-header {
border-color: var(--wiki-accent-color);
}
.cs-comment-author a {
color: var(--wiki-content-link-color);
}
.cs-comment-details {
color: color-mix(in srgb, var(--wiki-content-text-color) 95%, transparent);
}
.cs-comment-author-anonymous {
color: color-mix(in srgb, var(--wiki-content-text-color) 95%, transparent);
}
.cs-comment {
border: 1px solid var(--wiki-content-border-color);
}
.cs-comment-body {
padding: 0 5px;
}
/*********************************
* End theme-based commentstreams *
**********************************/
/************************
* Theme-based checkuser *
*************************/
.mw-datatable.ext-checkuser-investigate-table tr:hover td {
background-color: var(--wiki-content-background-color);
}
.mw-datatable.ext-checkuser-investigate-table th {
background-color: var(--wiki-content-background-color--secondary);
}
.ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned td,
.ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned-data-match td,
.ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) .ext-checkuser-investigate-table-row-hover-data-match td,
.ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) tr:hover td {
background-color: color-mix(in srgb, var(--wiki-warning-color) 10%, transparent);
}
.ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned td.ext-checkuser-investigate-table-cell-pinned,
.ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned-data-match td.ext-checkuser-investigate-table-cell-pinned,
.ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned td.ext-checkuser-investigate-table-cell-pinned-data-match,
.ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned-data-match td.ext-checkuser-investigate-table-cell-pinned-data-match,
.ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) tr td.ext-checkuser-investigate-table-cell-hover-data-match,
.ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) tr td:hover.ext-checkuser-investigate-table-cell-pinnable {
background-color: color-mix(in srgb, var(--wiki-warning-color) 40%, transparent);
}
.ext-checkuser-investigate-copy-message.oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-notice {
background-color: var(--wiki-content-background-color--secondary);
border-color: var(--wiki-content-border-color);
}
.mw-special-Investigate .ext-checkuser-investigate-subtitle-fieldset {
background-color: var(--wiki-content-background-color--secondary);
}
/****************
* End checkuser *
*****************/
/***************************
* Theme-based SearchDigest *
****************************/
.searchdigest-stats-table {
border-color: var(--wiki-content-border-color);
border-collapse: collapse;
}
.searchdigest-stats-table thead th,
.searchdigest-stats-table tr:not(:last-child) th,
.searchdigest-stats-table tr:not(:last-child) td {
border-bottom-color: var(--wiki-content-border-color);
}
.searchdigest-stats-table thead th:last-child,
.searchdigest-stats-table td {
border-left-color: var(--wiki-content-border-color);
}
.searchdigest-stats-table thead tr {
background: var(--wiki-content-background-color--secondary);
}
/*******************
* End SearchDigest *
********************/
/****************************
* Extension:RelatedArticles *
*****************************/
.client-js .read-more-container {
min-height: unset;
}
@media (min-width: 1000px) {
.client-js .read-more-container {
min-height: calc(
80px/*card height*/
+ 10px/*card margin*/
+ 1em/*container padding*/
+ 0.3em/*card-list margin*/
+ 0.8em/*h2 font-size*/
+ 1em/*h2 padding*/
+ 0.6em/*h2 margin*/
+ 1px /*container border*/
);
}
}
.ext-related-articles-card-list .ext-related-articles-card {
background-color: var(--wiki-content-background-color);
}
.ext-related-articles-card-list .ext-related-articles-card,
.ext-related-articles-card-list .ext-related-articles-card + .ext-related-articles-card { /* your guess is as good as mine for why they did this */
border-color: color-mix(in srgb, var(--wiki-content-border-color) 20%, transparent);
}
.ext-related-articles-card-list .ext-related-articles-card-thumb {
background-color: var(--wiki-content-background-color--secondary);
}
.ra-read-more h2 {
color: var(--wiki-body-dynamic-color--secondary);
}
.ext-related-articles-card-list h3 a {
color: var(--wiki-content-heading-color);
}
.ext-related-articles-card-list h3::after {
background-image: linear-gradient(to right, transparent, var(--wiki-content-background-color) 50%);
}
.ext-related-articles-card-list .ext-related-articles-card-extract {
color: color-mix(in srgb, var(--wiki-content-text-color) 50%, transparent);
}
/* removed background image and use a mask image instead */
.ext-related-articles-card-list .ext-related-articles-card-thumb-placeholder {
position: relative;
background-image: none;
}
.ext-related-articles-card-list .ext-related-articles-card-thumb-placeholder::after {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
content: '';
--mask-image: url("/extensions/RelatedArticles/resources/ext.relatedArticles.readMore/article.svg?3c572");
--mask-size: 40px;
--mask-repeat: no-repeat;
--mask-position: center;
-webkit-mask: var(--mask-image);
mask: var(--mask-image);
-webkit-mask-size: var(--mask-size);
mask-size: var(--mask-size);
-webkit-mask-repeat: var(--mask-repeat);
mask-repeat: var(--mask-repeat);
-webkit-mask-position: var(--mask-position);
mask-position: var(--mask-position);
background-color: color-mix(in srgb, var(--wiki-content-text-color) 75%, transparent);
}
/**/
/* this simulates mw-footer having a top border */
.read-more-container {
border-bottom: var(--wiki-content-border-width, 1px) solid var(--wiki-content-border-color);
}
@media screen and (min-width: 720px) {
.read-more-container {
margin-right: 1em;
}
}
/********************************
* End Extension:RelatedArticles *
*********************************/
/*******************
* Extension:Popups *
********************/
.mwe-popups {
box-shadow: 0 30px 90px -20px rgba(0, 0, 0, 0.3), 0 0 1px 1px color-mix(in srgb, var(--wiki-content-border-color) 5%, transparent);
}
.mwe-popups,
.mwe-popups .mwe-popups-container {
background-color: var(--wiki-content-background-color);
color: var(--wiki-content-text-color);
}
.mwe-popups .mwe-popups-extract {
color: var(--wiki-content-text-color);
}
.mwe-popups .mwe-popups-extract[dir="ltr"]::after {
background-image: linear-gradient(to right, transparent, var(--wiki-content-background-color) 50%);
}
.mwe-popups.flipped-y::before,
.mwe-popups.flipped-x-y::before,
.mwe-popups.mwe-popups-image-pointer::before,
.mwe-popups.mwe-popups-image-pointer.flipped-x::before,
.mwe-popups.mwe-popups-no-image-pointer::before,
.mwe-popups.flipped-x.mwe-popups-is-tall::before,
.mwe-popups.flipped-x-y.mwe-popups-is-tall::before {
border-color: var(--wiki-content-border-color);
}
.mwe-popups.flipped-y::after,
.mwe-popups.flipped-x-y::after,
.mwe-popups.mwe-popups-image-pointer::after,
.mwe-popups.mwe-popups-image-pointer.flipped-x::after,
.mwe-popups.mwe-popups-no-image-pointer::after,
.mwe-popups.flipped-x-y.mwe-popups-is-tall::after {
border-color: var(--wiki-content-background-color);
}
.popups-icon {
position: relative;
background-position: center;
background-repeat: no-repeat;
background-size: calc(max(1.4285714em, 20px));
min-width: 20px;
min-height: 20px;
width: 1.4285714em;
height: 1.4285714em;
display: inline-block;
vertical-align: text-bottom;
}
.popups-icon--preview-generic,
.popups-icon--settings,
.popups-icon--infoFilled,
.popups-icon--infoFilled:lang(ar),
.popups-icon--close,
.popups-icon--reference-generic,
.popups-icon--reference-book,
.popups-icon--preview-disambiguation {
background-image: none;
}
.popups-icon::after {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
content: '';
-webkit-mask-image: var(--mask-image, none);
mask-image: var(--mask-image, none);
-webkit-mask-repeat: var(--mask-repeat, no-repeat);
mask-repeat: var(--mask-repeat, no-repeat);
-webkit-mask-size: var(--mask-size, calc(max(1.4285714em, 20px)));
mask-size: var(--mask-size, calc(max(1.4285714em, 20px)));
-webkit-mask-position: var(--mask-position, center);
mask-position: var(--mask-position, center);
background-color: var(--mask-color, currentColor);
background-color: var(--mask-color, currentColor);
}
.popups-icon--preview-generic::after {
--mask-image: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Ctitle%3E sad face %3C/title%3E %3Cpath d=%22M2 0a2 2 0 0 0-2 2v18l4-4h14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm4 4c1.336 0 2.007 1.617 1.06 2.56-.943.947-2.56.276-2.56-1.06A1.5 1.5 0 0 1 6 4zm8 0c1.336 0 2.007 1.617 1.06 2.56-.943.947-2.56.276-2.56-1.06A1.5 1.5 0 0 1 14 4zm-4 5c2.61 0 4.83.67 5.65 3H4.35C5.17 9.67 7.39 9 10 9z%22/%3E %3C/svg%3E");
}
.popups-icon--settings::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><g transform=\"translate(10 10)\"><path id=\"cdx-icon-settings-a\" d=\"M1.5-10h-3l-1 6.5h5m0 7h-5l1 6.5h3\"/><use xlink:href=\"%23cdx-icon-settings-a\" transform=\"rotate(45)\"/><use xlink:href=\"%23cdx-icon-settings-a\" transform=\"rotate(90)\"/><use xlink:href=\"%23cdx-icon-settings-a\" transform=\"rotate(135)\"/></g><path d=\"M10 2.5a7.5 7.5 0 000 15 7.5 7.5 0 000-15v4a3.5 3.5 0 010 7 3.5 3.5 0 010-7\"/></svg>");
}
.popups-icon--infoFilled::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zM9 5h2v2H9zm0 4h2v6H9z\"/></svg>");
}
.popups-icon--infoFilled:lang(ar)::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M8 19a1 1 0 001 1h2a1 1 0 001-1v-1H8zm9-12a7 7 0 10-12 4.9S7 14 7 15v1a1 1 0 001 1h4a1 1 0 001-1v-1c0-1 2-3.1 2-3.1A7 7 0 0017 7z\"/></svg>");
}
.popups-icon--close::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"m4.34 2.93 12.73 12.73-1.41 1.41L2.93 4.35z\"/><path d=\"M17.07 4.34 4.34 17.07l-1.41-1.41L15.66 2.93z\"/></svg>");
}
.popups-icon--reference-generic::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"m15 10-2.78-2.78L9.44 10V1H5a2 2 0 00-2 2v14a2 2 0 002 2h10a2 2 0 002-2V3a2 2 0 00-2-2z\"/></svg>");
}
.popups-icon--reference-book::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M15 2a7.65 7.65 0 00-5 2 7.65 7.65 0 00-5-2H1v15h4a7.65 7.65 0 015 2 7.65 7.65 0 015-2h4V2zm2.5 13.5H14a4.38 4.38 0 00-3 1V5s1-1.5 4-1.5h2.5z\"/><path d=\"M9 3.5h2v1H9z\"/></svg>");
}
.popups-icon--reference-journal::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M2 18.5A1.5 1.5 0 003.5 20H5V0H3.5A1.5 1.5 0 002 1.5zM6 0v20h10a2 2 0 002-2V2a2 2 0 00-2-2zm7 8H8V7h5zm3-2H8V5h8z\"/></svg>");
}
.popups-icon--reference-news::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M5 2a2 2 0 00-2 2v12a1 1 0 01-1-1V5h-.5A1.5 1.5 0 000 6.5v10A1.5 1.5 0 001.5 18H18a2 2 0 002-2V4a2 2 0 00-2-2zm1 2h11v4H6zm0 6h6v1H6zm0 2h6v1H6zm0 2h6v1H6zm7-4h4v5h-4z\"/></svg>");
}
.popups-icon--reference-web::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M2 2a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V4a2 2 0 00-2-2zm2 1.5A1.5 1.5 0 112.5 5 1.5 1.5 0 014 3.5zM18 16H2V8h16z\"/></svg>");
}
.popups-icon--preview-disambiguation::after {
--mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M7 0a2 2 0 00-2 2h9a2 2 0 012 2v12a2 2 0 002-2V2a2 2 0 00-2-2z\"/><path d=\"M13 20a2 2 0 002-2V5a2 2 0 00-2-2H4a2 2 0 00-2 2v13a2 2 0 002 2zM9 5h4v5H9zM4 5h4v1H4zm0 2h4v1H4zm0 2h4v1H4zm0 2h9v1H4zm0 2h9v1H4zm0 2h9v1H4z\"/></svg>");
}
/***********************
* End Extension:Popups *
************************/
/*************************
* Extension:CiteThisPage *
**************************/
.mw-specialCiteThisPage-bibliographic {
background-color:var(--wiki-content-background-color--secondary);
}
/*****************************
* End Extension:CiteThisPage *
******************************/
/*************************
* Extension:ImageMap *
**************************/
.noresize img { /* Why does the ImageMap container have no special class name? */
display: block; /* fix the scrollbar issue */
}
/*****************************
* End Extension:ImageMap *
******************************/
/*********************
* Mobile adjustments *
**********************/
/* Responsive Special:UserRights */
#mw-userrights-table-outer input#wpReason {
width: 100%;
max-width: 33.5em;
}
@media screen and (max-width: 720px) {
html:root { /* make it won't be override by user's common.css */
--wiki-is-top-logo: 1;
--wiki-left-spacing: 0px;
--wiki-right-spacing: 0px;
--wiki-navigation-left-spacing: 3px;
--wiki-navigation-right-spacing: 3px;
--wiki-content-border-radius: 0px;
--wiki-content-border-top-radius: 0px;
--wiki-footer-border-radius: 0px;
--wiki-content-padding: 0.5rem;
--wiki-navigation-menu-margin: 0.5rem; /* margin around toggle button and search box */
--wiki-navigation-height: calc(2rem + var(--wiki-is-navigation-inside-content, 0)*0.5em);
--wiki-navigation-bottom-padding: 0px;
--wiki-navigation-tab-height: 2rem;
--wiki-navigation-search-height: calc(2rem + 4px);
--wiki-navigation-right-spacing: var(--wiki-navigation-left-spacing, 0px);
--wiki-logo-height: 80px;
--wiki-logo-margin: 10px;
--wiki-navigation-tab-full-height: calc(var(--wiki-navigation-tab-height) + max(var(--wiki-navigation-selected-border-width), var(--wiki-navigation-border-width)) + var(--wiki-content-border-width, 1px));
--wiki-head-icon-padding: 0.25rem;
--wiki-head-icon-size: calc(var(--wiki-navigation-tab-height) - var(--wiki-head-icon-padding) * 2);
--wiki-head-toggle-button-size: var(--wiki-navigation-search-height);
--wiki-sidebar-portal-spacing: 0px;
--wiki-top-spacing: var(--wiki-logo-margin);
--wiki-logo-box-width: calc(min( var(--wiki-logo-file-width, 160) / var(--wiki-logo-file-height, 160) * var(--wiki-logo-height), calc(100vw - var(--wiki-navigation-menu-margin)*2 - 18px)));
}
#mw-head-base {
width: auto;
margin-left: auto;
margin-right: auto;
}
#p-logo {
max-width: 100vw;
top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, var(--wiki-logo-margin, 15px)));
left: calc(max(0px, (100% - var(--wiki-logo-file-width) / var(--wiki-logo-file-height) * var(--wiki-logo-box-height)) / 2));
}
#mw-head {
position: absolute;
left: 0;
width: 100%;
margin: unset;
top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, var(--wiki-logo-margin)) + var(--wiki-logo-box-height) + var(--wiki-logo-margin));
border-radius: 0;
}
#left-navigation::before { /* for left spacing */
border-bottom-width: var(--navigation-border-bottom-width);
}
#right-navigation::after {
display: block; /* for right spacing */
}
#p-cactions, #p-variants {
margin-right: 0px;
}
#p-cactions::after, #p-variants::after {
width: 0;
}
#p-search {
position: absolute;
left: var(--wiki-navigation-menu-margin);
right: var(--wiki-navigation-menu-margin);
top: calc(var(--wiki-navigation-height, 3em) + var(--navigation-border-bottom-width));
margin: 0;
padding: 0;
}
#mw-head::before, #mw-head::after,
#p-search::before, #p-search::after {
display: none;
}
#simpleSearch {
width: auto;
max-width: unset; /* override vector default of 20em */
}
.vector-search-box-input {
height: var(--wiki-navigation-search-height);
}
.vector-search-box form {
margin: var(--wiki-navigation-menu-margin) 0px;
}
#mw-head,
.mw-body, .parsoid-body,
.mw-body::after, .parsoid-body::after,
.mw-footer {
border-left-width: 0;
border-right-width: 0;
border-radius: 0;
}
.mw-body, .parsoid-body {
margin-top: 0;
padding-top: calc(var(--navigation-border-bottom-width) + var(--wiki-content-padding) + var(--wiki-navigation-search-height) + var(--wiki-navigation-bottom-padding) + (var(--wiki-navigation-menu-margin) * 2));
}
.mw-body::after, .parsoid-body::after {
left: 0;
right: 0;
}
#mw-data-after-content {
margin-left: 0;
}
#mw-panel {
position: unset;
width: 100%;
margin: 0px auto;
top: 0;
float: unset;
}
/* border-radius fix */
#mw-panel #p-ext-discordwidget + .vector-menu-portal {
border-radius: calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999));
}
.vector-menu-dropdown .vector-menu-content {
right: 0;
left: unset;
}
#mw-panel .vector-menu-portal {
box-sizing: border-box;
border-left-width: 0;
border-right-width: 0;
background-color: var(--wiki-sidebar-background-color);
}
.vector-menu-portal .vector-menu-content {
margin-top: 0;
margin-bottom: 0;
display: block !important; /* show all menus on mobile even if they are collapsed by collapsibleSidebarSections gadget */
}
table.wikitable,
table.responsive-table {
display: block;
overflow-x: auto;
border: 0;
}
.mw-installed-software {
word-break: unset;
}
.gallerybox,
.gallerybox > div,
.gallerybox .thumb {
max-width: 100%;
}
/* disable float on RecentChanges legend */
.mw-changeslist-legend {
float: none;
margin: 0 auto;
}
/* advanced search options */
#mw-searchoptions table {
float: none;
}
#mw-searchoptions table td {
display: block;
}
/* popup when clicking the download button in multimediaviewer */
.mw-mmv-dialog {
width: unset;
}
/* turn math elements into scroll blocks unless they're an immediate child of a span */
:not(span) > math.mwe-math-element {
overflow: auto hidden;
max-width: 100%;
}
/* Expandable mobile navigation panel */
body.has-vector-mobile-menu #mw-panel {
position: absolute;
--panel-offset: calc(var(--wiki-head-toggle-button-size) + var(--wiki-sidebar-offset, 0px));
top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, var(--wiki-logo-margin, 15px)) + var(--wiki-logo-box-height) + var(--wiki-logo-margin, 15px) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0px) + var(--wiki-navigation-height, 3em) + var(--navigation-border-bottom-width) + var(--wiki-navigation-menu-margin) + var(--panel-offset));
left: var(--wiki-navigation-menu-margin);
right: var(--wiki-navigation-menu-margin);
width: auto;
z-index: 3;
}
body.has-vector-mobile-menu #mw-panel:not(.nav--expanded){
padding: 0;
border: 0;
border-image: none;
}
body.has-vector-mobile-menu #mw-panel .mobile-nav-toggle {
position: absolute;
cursor: pointer;
z-index: 5;
display: flex;
justify-content: center;
align-items: center;
width: var(--wiki-head-toggle-button-size);
height: var(--wiki-head-toggle-button-size);
box-sizing: border-box;
appearance: none;
padding: 0;
border: 1px solid var(--wiki-content-border-color);
background-color: var(--wiki-navigation-background-color);
top: calc(-1 * var(--panel-offset));
}
#mw-panel #p-ext-discordwidget {
background-color: var(--wiki-sidebar-background-color);
padding: 0.5rem 0.25rem 0.25rem 0.5rem;
border: var(--wiki-sidebar-border-width, 1px) var(--wiki-sidebar-border-style, solid) var(--wiki-sidebar-border-color);
}
body.has-vector-mobile-menu #mw-panel .vector-menu-portal {
display: none;
border-image: none;
}
body.has-vector-mobile-menu #mw-panel .mobile-nav-toggle.nav--expanded ~ .vector-menu-portal {
display: block;
}
body.has-vector-mobile-menu #mw-navigation #mw-panel .vector-menu-portal {
text-align: left;
font-size: 110%;
border-left-width: var(--wiki-sidebar-border-width, 1px);
border-right-width: var(--wiki-sidebar-border-width, 1px);
margin-inline: var(--wiki-sidebar-margin, 0.5em);
}
body.has-vector-mobile-menu #mw-navigation #mw-panel .vector-menu-portal + .vector-menu-portal {
border-top-width: 0;
}
body.has-vector-mobile-menu #mw-navigation #mw-panel .vector-menu-portal:not(:last-child) {
border-bottom-width: 0;
}
body.has-vector-mobile-menu #mw-panel .vector-menu-content-list {
display: flex;
flex-wrap: wrap;
}
body.has-vector-mobile-menu #mw-panel .vector-menu-content-list a {
display: block;
padding: 0.2rem 0.5rem;
border: 1px solid transparent;
}
body.has-vector-mobile-menu #mw-panel .vector-menu-content-list a:hover {
border-color: var(--wiki-content-link-color);
}
body.has-vector-mobile-menu #mw-panel #p-navigation-label {
display: block;
}
body.has-vector-mobile-menu #p-logo {
/* Logo's a part of the sidebar panel, which uses relative positioning for the expandable button. Offset the logo appropriately. */
top: calc(-1 * (var(--wiki-logo-box-height) + var(--wiki-logo-margin, 15px) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0) + var(--wiki-navigation-height, 3em) + var(--navigation-border-bottom-width) + var(--wiki-navigation-menu-margin) + var(--panel-offset)));
}
.mobile-nav-toggle {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M1 3v2h18V3zm0 8h18V9H1zm0 6h18v-2H1z'/%3E%3C/svg%3E%0A");
}
body.has-vector-mobile-menu #p-tb .mw-list-item > a {
display: inline-flex;
}
body.has-vector-mobile-menu .vector-menu-content-list {
flex-direction: row;
}
/* Search adjustments for the expandable menu */
body.has-vector-mobile-menu #p-search {
/* reposition to the right when mobile sidebar menu is active */
left: calc(var(--wiki-navigation-menu-margin) * 2 + var(--wiki-head-toggle-button-size));
right: var(--wiki-navigation-menu-margin);
transform: none;
}
body.has-vector-mobile-menu #simpleSearch {
width: 100%;
margin: 0 auto;
}
/* icon navbar tabs + expandable nav panel icon */
#mw-head {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg fill='none' height='24' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h24v24H0z' fill='none' stroke='none'/%3E%3Cpath d='M4 4l4 16l4 -14l4 14l4 -16'/%3E%3C/svg%3E");
}
#mw-head .vector-menu-tabs .mw-list-item a,
#mw-head .vector-menu-dropdown .vector-menu-heading,
#mw-panel .mobile-nav-toggle {
line-height: var(--wiki-head-icon-size);
width: var(--wiki-head-icon-size); /* same as line height */
height: var(--wiki-head-icon-size);
box-sizing: content-box;
padding: var(--wiki-head-icon-padding);
color: transparent; /**<< for watch/unwatch, the text of <a> will be plain 'watch'/'unwatch' without <span> after clicking. **/
}
#mw-head .vector-menu-tabs .mw-list-item a::before,
#mw-head .vector-menu-dropdown .vector-menu-heading::before,
#mw-panel .mobile-nav-toggle::before {
content: "";
display: block;
position: unset;
background-image: none;
width: var(--wiki-head-icon-size);
height: var(--wiki-head-icon-size);
margin: 0;
--mask: var(--icon) no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: center center;
mask-position: center center;
background-color: var(--wiki-navigation-text-color);
}
#mw-head .vector-menu-tabs .mw-list-item a:hover::before,
#mw-head .vector-menu-dropdown:hover .vector-menu-heading::before,
#mw-panel .mobile-nav-toggle:hover::before,
#mw-panel .mobile-nav-toggle.nav--expanded::before {
background-color: var(--wiki-navigation-text-color--hover, var(--wiki-content-link-color--hover)); /* fallback for backwards compatibility */
}
#mw-head .vector-menu-tabs .mw-list-item.selected a::before {
background-color: var(--wiki-navigation-selected-text-color);
}
#mw-head .vector-menu-tabs .mw-list-item a span,
#mw-head .vector-menu-dropdown .vector-menu-heading span {
display: none;
}
#mw-head .vector-menu-dropdown .vector-menu-heading::after {
display: none;
}
#ca-ve-edit,
#ca-edit {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='m16.77 8 1.94-2a1 1 0 0 0 0-1.41l-3.34-3.3a1 1 0 0 0-1.41 0L12 3.23zM1 14.25V19h4.75l9.96-9.96-4.75-4.75z'/%3E%3C/svg%3E%0A");
}
#ca-ve-edit + #ca-edit {
--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='20' height='20' viewBox='0 0 20 20' aria-hidden='true'%3E%3C!----%3E%3Cg%3E%3Cpath d='M1 3v14h3v-2H3V5h1V3zm4 0v14h4v-2H7V5h2V3zm11 0v2h1v10h-1v2h3V3zm-5 0v2h2v10h-2v2h4V3z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");
}
#ca-view,
#ca-view-foreign {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M10 14.5a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5M10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7'/%3E%3Ccircle cx='10' cy='10' r='2.5'/%3E%3C/svg%3E");
}
#left-navigation li[id^=ca-nstab-] {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3E article %3C/title%3E%3Cpath d='M5 1a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 3h5v1H5zm0 2h5v1H5zm0 2h5v1H5zm10 7H5v-1h10zm0-2H5v-1h10zm0-2H5v-1h10zm0-2h-4V4h4z'/%3E%3C/svg%3E%0A");
}
#ca-history {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M9 6v5h.06l2.48 2.47 1.41-1.41L11 10.11V6z'/%3E%3Cpath d='M10 1a9 9 0 0 0-7.85 13.35L.5 16H6v-5.5l-2.38 2.38A7 7 0 1 1 10 17v2a9 9 0 0 0 0-18'/%3E%3C/svg%3E%0A");
}
#ca-talk {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg id='Outlined' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle/%3E%3Cg id='Fill'%3E%3Cpath d='M26,12H24V6a3,3,0,0,0-3-3H6A3,3,0,0,0,3,6V24.41l5.12-5.12A1.05,1.05,0,0,1,8.83,19H12v3a3,3,0,0,0,3,3h8.17a1.05,1.05,0,0,1,.71.29L29,30.41V15A3,3,0,0,0,26,12ZM12,15v2H8.83a3,3,0,0,0-2.12.88L5,19.59V6A1,1,0,0,1,6,5H21a1,1,0,0,1,1,1v6H15A3,3,0,0,0,12,15ZM27,25.59l-1.71-1.71A3,3,0,0,0,23.17,23H15a1,1,0,0,1-1-1V15a1,1,0,0,1,1-1H26a1,1,0,0,1,1,1Z'/%3E%3C/g%3E%3C/svg%3E");
}
#t-contributions {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg enable-background='new 0 0 32 32' id='Stock_cut' version='1.1' viewBox='0 0 32 32' xml:space='preserve' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdesc/%3E%3Cpath d='M27,12V5h-7v0 c0-2.209-1.791-4-4-4h0c-2.209,0-4,1.791-4,4v0H1v7h0c2.209,0,4,1.791,4,4v0c0,2.209-1.791,4-4,4h0v11h11v0c0-2.209,1.791-4,4-4h0 c2.209,0,4,1.791,4,4v0h7V20h0c2.209,0,4-1.791,4-4v0C31,13.791,29.209,12,27,12L27,12z' fill='none' stroke='%23000000' stroke-linejoin='round' stroke-miterlimit='10' stroke-width='2'/%3E%3C/svg%3E");
}
#ca-addsection {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg id='Outlined' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle/%3E%3Cg id='Fill'%3E%3Cpolygon points='29 15 17 15 17 3 15 3 15 15 3 15 3 17 15 17 15 28 17 28 17 17 29 17 29 15'/%3E%3C/g%3E%3C/svg%3E");
}
#ca-viewsource {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath class='heroicon-ui' d='M20.59 12l-3.3-3.3a1 1 0 1 1 1.42-1.4l4 4a1 1 0 0 1 0 1.4l-4 4a1 1 0 0 1-1.42-1.4l3.3-3.3zM3.4 12l3.3 3.3a1 1 0 0 1-1.42 1.4l-4-4a1 1 0 0 1 0-1.4l4-4a1 1 0 0 1 1.42 1.4L3.4 12zm7.56 8.24a1 1 0 0 1-1.94-.48l4-16a1 1 0 1 1 1.94.48l-4 16z'/%3E%3C/svg%3E");
}
#p-variants {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg id='Outlined' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle/%3E%3Cg id='Fill'%3E%3Cpath d='M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm8,13a24.28,24.28,0,0,0-.41-3.62c2.19.91,3.75,2.19,4.25,3.62Zm-2,0H17V10a20.9,20.9,0,0,1,4.34.63A20.26,20.26,0,0,1,22,15ZM17,8V4.19c1.43.5,2.71,2.06,3.62,4.25A24.28,24.28,0,0,0,17,8ZM15,4.19V8a24.28,24.28,0,0,0-3.62.41C12.29,6.25,13.57,4.69,15,4.19ZM15,10v5H10a20.26,20.26,0,0,1,.63-4.34A20.9,20.9,0,0,1,15,10ZM8,15H4.19c.5-1.43,2.06-2.71,4.25-3.62A24.28,24.28,0,0,0,8,15Zm0,2a24.28,24.28,0,0,0,.41,3.62C6.25,19.71,4.69,18.43,4.19,17Zm2,0h5v5a20.9,20.9,0,0,1-4.34-.63A20.26,20.26,0,0,1,10,17Zm5,7v3.84c-1.43-.5-2.71-2.06-3.62-4.25A24.28,24.28,0,0,0,15,24Zm2,3.84V24a24.28,24.28,0,0,0,3.62-.41C19.71,25.75,18.43,27.31,17,27.81ZM17,22V17h5a20.26,20.26,0,0,1-.63,4.34A20.9,20.9,0,0,1,17,22Zm7-5h3.84c-.5,1.43-2.06,2.71-4.25,3.62A24.28,24.28,0,0,0,24,17Zm2.87-6.12A15.11,15.11,0,0,0,23,9a15.11,15.11,0,0,0-1.85-3.87A12.12,12.12,0,0,1,26.84,10.88Zm-16-5.72A15.11,15.11,0,0,0,9,9a15.11,15.11,0,0,0-3.87,1.85A12.12,12.12,0,0,1,10.88,5.16Zm-5.72,16A15.11,15.11,0,0,0,9,23a15.11,15.11,0,0,0,1.85,3.87A12.12,12.12,0,0,1,5.16,21.12Zm16,5.72A15.11,15.11,0,0,0,23,23a15.11,15.11,0,0,0,3.87-1.85A12.12,12.12,0,0,1,21.12,26.84Z'/%3E%3C/g%3E%3C/svg%3E");
}
#p-cactions {
--icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Ccircle cx='3' cy='10' r='2'/%3E%3Ccircle cx='17' cy='10' r='2'/%3E%3C/svg%3E%0A");
}
#ca-watch {
--icon: var(--icon-star-empty);
}
#ca-unwatch {
--icon: var(--icon-star-filled);
}
.vector-menu-tabs #ca-watch.icon a:hover::before,
.vector-menu-tabs #ca-unwatch.icon a:hover::before {
background-image: none;
}
/* RecentChanges - prevent overflow on long summaries */
.client-js .mw-changeslist ul,
.client-js .mw-changeslist table.mw-enhanced-rc {
margin-left: 0;
}
.mw-changeslist-line-inner-comment,
.mw-changeslist-line .comment {
font-size: 0.9em;
}
.mw-userlink {
overflow-wrap: anywhere;
}
}
/* Hide the expandable navigation button for desktop users */
.mobile-nav-toggle {
display: none;
}
/*************
* End mobile *
**************/
/******************************************************/
/* */
/* [END] OF WIKI.GG DEFAULT LOADOUT */
/* ALL LOCAL SKIN CUSTOMIZATIONS SHOULD GO BELOW HERE */
/* DO NOT EDIT OR DELETE THIS COMMENT BLOCK */
/* */
/******************************************************/
737acde73ae5c553a98604c85f569e2b26fd8696
MediaWiki:Common.css
8
235
259
2025-08-20T01:24:55Z
ARTIFICER
564804
Importing default loadout
css
text/css
/* CSS placed here will be applied to all skins */
/******************************************************************************************
********************************* Start user-edit variables *******************************
******************************************************************************************/
/*****************************************
****** START BASIC DESIGN VARIABLES ******
----------------------------------------*/
:root {
--wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif;
--wiki-sidebar-heading-font-family: sans-serif;
--wiki-content-border-radius: 0px;
--wiki-sidebar-border-radius: 0px;
}
/*----------------------------------------
******* END BASIC DESIGN VARIABLES *******
*****************************************/
/*****************************************
****** START BASIC COLOR VARIABLES *******
----------------------------------------*/
:root,
/* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=light, */
/* individual themes are prefixed with .theme- instead */
.view-light {
/**********************
* Probably edit these * [ LIGHT VIEW ]
***********************/
--wiki-body-background-color: #F6F6F6;
--wiki-body-background-image: url(filepath://Site-background.jpg);
--wiki-content-background-color: #ffffff;
--wiki-content-background-opacity: 100%;
--wiki-content-border-color: #a7d7f9;
--wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ LIGHT VIEW ] */
--wiki-accent-color: #3366cc;
--wiki-accent-label-color: #ffffff;
--wiki-accent-link-color: #D5FB51;
--wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
}
/* end light styles */
/* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=dark, */
/* individual themes are prefixed with .theme- instead */
.view-dark {
/**********************
* Probably edit these * [ DARK VIEW ]
***********************/
--wiki-body-background-color: #171717;
--wiki-body-background-image: url(filepath://Site-background-dark.jpg);
--wiki-content-background-color: #202020;
--wiki-content-background-opacity: 90%;
--wiki-content-border-color: #991A51;
--wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ DARK VIEW ] */
--wiki-accent-color: #ff4d9d;
--wiki-accent-label-color: #000;
--wiki-accent-link-color: #1e1e43;
--wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
}
/* End dark styles */
/*----------------------------------------
******* END BASIC COLOR VARIABLES ********
*****************************************/
/*****************************************
**** START ADVANCED COLOR VARIABLES ******
----------------------------------------*/
:root,
.view-light {
/*******************
* Maybe edit these * [ LIGHT VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #111111;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #ba0000;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ LIGHT VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ LIGHT VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #bf0017;
--wiki-warning-color: #b05f30;
--wiki-success-color: #0c742f;
/**/
/***********************************
* Likely do not need to edit these * [ LIGHT VIEW ]
************************************/
--wiki-body-dynamic-color: #000000;
--wiki-body-dynamic-color--inverted: #ffffff;
--wiki-body-dynamic-color--secondary: #333333;
--wiki-body-dynamic-color--secondary--inverted: #cccccc;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #ffffff;
--wiki-content-dynamic-color: #000000;
--wiki-content-dynamic-color--inverted: #ffffff;
--wiki-content-dynamic-color--secondary: #333333;
--wiki-content-dynamic-color--secondary--inverted: #cccccc;
/* [ LIGHT VIEW ] */
--wiki-alert-label-color: #ffffff;
--wiki-warning-label-color: #ffffff;
--wiki-success-label-color: #ffffff;
--wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */
/**/
}
.view-dark {
/*******************
* Maybe edit these * [ DARK VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #ededed;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #FC5B4F;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ DARK VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ DARK VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #ff576a;
--wiki-warning-color: #cf721c;
--wiki-success-color: #13aa45;
/**/
/***********************************
* Likely do not need to edit these * [ DARK VIEW ]
************************************/
--wiki-body-dynamic-color: #ffffff;
--wiki-body-dynamic-color--inverted: #000000;
--wiki-body-dynamic-color--secondary: #cccccc;
--wiki-body-dynamic-color--secondary--inverted: #333333;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #000;
--wiki-content-dynamic-color: #ffffff;
--wiki-content-dynamic-color--inverted: #000000;
--wiki-content-dynamic-color--secondary: #cccccc;
--wiki-content-dynamic-color--secondary--inverted: #333333;
/* [ DARK VIEW ] */
--wiki-alert-label-color: #000000;
--wiki-warning-label-color: #000000;
--wiki-success-label-color: #000000;
--wiki-icon-general-filter: invert(100%);
}
/*----------------------------------------
***** END ADVANCED COLOR VARIABLES *******
*****************************************/
/*****************************************
**** START ADVANCED DESIGN VARIABLES *****
----------------------------------------*/
:root {
/***********************
start logo position
----------------------*/
--wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */
--wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */
--wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */
--wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */
--wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */
/*-----------------------
end logo position
***********************/
--wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */
--wiki-body-font-family: sans-serif;
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-width: 1px;
--wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */
--wiki-sidebar-portal-spacing: 0px;
--wiki-sidebar-border-width: var(--wiki-content-border-width);
--wiki-navigation-border-radius: 0px; /* border radius of tabs */
/*******************
* Maybe edit these * [ DESIGN ]
********************/
--wiki-logo-filter: none;
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-top-radius: var(--wiki-content-border-radius);
--wiki-content-border-style: solid;
--wiki-content-border-image: none;
--wiki-content-backdrop-filter: none;
--wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */
--wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */
--wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-margin: 0.5em;
--wiki-sidebar-list-item-padding: 0.25em 0.25rem;
--wiki-sidebar-list-padding: 0.25rem;
--wiki-sidebar-list-item-background--hover: none; /* background of hover item */
--wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */
--wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */
--wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-box-background-color: var(--wiki-content-background-color);
--wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content));
--wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
--wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
/* nav tabs style. The vector gradient is default.
* If you want to customize the style of tabs, it's easier to start with the following settings:
* --wiki-navigation-background-image: none;
* --wiki-navigation-selected-background-image: none;
* --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px );
* --wiki-navigation-selected-border-bottom-background: none;
* --wiki-navigation-tab-spacing: 0.25em;
* --wiki-navigation-tab-padding-top: 0.5em;
* --wiki-navigation-tab-padding-bottom: 0.5em;
*/
--wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */
--wiki-navigation-tab-padding-top: 1.25em;
--wiki-navigation-tab-padding-x: 0.75em;
--wiki-navigation-tab-padding-bottom: 4px;
--wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */
--wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */
--wiki-navigation-border-image: none;
--wiki-navigation-selected-border-image: var(--wiki-navigation-border-image);
--wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%);
--wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x;
--wiki-navigation-background-position: left bottom, right bottom, left bottom;
--wiki-navigation-background-size: 1px 100%, 1px 100%, 100%;
--wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%);
--wiki-navigation-selected-background-repeat: no-repeat, no-repeat;
--wiki-navigation-selected-background-position: left bottom, right bottom;
--wiki-navigation-selected-background-size: 1px 100%, 1px 100%;
--wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px);
/* affects the dropdown menu under More */
--wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color);
--wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color);
--wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */
--wiki-navigation-dropdown-border-width: 1px;
--wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius);
--wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */
--wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */
--wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */
--wiki-navigation-dropdown-border-image: none;
--wiki-navigation-dropdown-backdrop-filter: none;
--wiki-navigation-dropdown-box-shadow: none; /* box shadow */
/* styles of the footer */
--wiki-spacing-before-footer: 0px;
--wiki-footer-border-image: none;
/* padding on body element */
--wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */
--wiki-left-spacing: 0.5em;
--wiki-right-spacing: 1em;
--wiki-bottom-spacing: 2em;
/* end design variables */
}
/*----------------------------------------
***** END ADVANCED DESIGN VARIABLES ******
*****************************************/
/*******************************
**** START SHARED VARIABLES ****
**** tl;dr: don't edit this ****
********************************/
/*
These variables are rarely touched, usually inherit other variables, and are shared on all themes.
In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision,
understand what you are doing, and *know* that what you are trying to do is not accomplished by changing
another variable in the above sections.
Since these are by default shared across all themes, if you support multiple themes you'll probably want to
separate the variables you want to modify here into .view-x blocks like above. If you don't understand
what that means or how to do that then you probably shouldn't be modifying this section.
*/
:root {
--wiki-content-border-bottom-width: var(--wiki-content-border-width);
--wiki-content-border-bottom-style: var(--wiki-content-border-style);
--wiki-content-border-bottom-color: var(--wiki-content-border-color);
--wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%);
--wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color));
--wiki-content-text-color--hover: var(--wiki-content-text-color);
/* heading */
--wiki-content-heading-border-bottom-width: 1px;
--wiki-content-heading-border-style: solid;
--wiki-content-heading-font-weight: normal;
--wiki-content-heading-font-style: normal;
--wiki-content-heading-text-transform: none;
--wiki-content-heading-line-height: normal;
--wiki-content-heading-text-shadow: none;
/* first heading (h1) */
--wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width);
--wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family);
--wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight);
--wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style);
--wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform);
--wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-firstheading-color: var(--wiki-content-heading-color);
--wiki-content-firstheading-text-shadow: none;
/* sub-heading (h3, h4, h5, h6) */
--wiki-content-subheading-border-bottom-width: 0px;
--wiki-content-subheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-subheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-subheading-font-family: var(--wiki-body-font-family);
--wiki-content-subheading-font-weight: bold;
--wiki-content-subheading-font-style: normal;
--wiki-content-subheading-text-transform: none;
--wiki-content-subheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-subheading-color: var(--wiki-content-heading-color);
--wiki-content-subheading-text-shadow: none;
/* heading size */
--wiki-content-firstheading-font-size: 1.8em;
--wiki-content-heading-h2-font-size: 1.5em;
--wiki-content-heading-h3-font-size: 1.2em;
--wiki-content-heading-h4-font-size: 114%;
--wiki-content-heading-h5-font-size: 108%;
--wiki-content-heading-h6-font-size: 100%;
--wiki-content-toc-background: var(--wiki-content-background-color--secondary);
--wiki-content-toc-border-width: 1px;
--wiki-content-toc-border-style: solid;
--wiki-content-toc-border-color: var(--wiki-content-border-color);
--wiki-content-toc-border-radius: 0px;
--wiki-content-toc-border-image: none;
--wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000;
--wiki-content-catlinks-background: var(--wiki-content-background-color--secondary);
--wiki-content-catlinks-border-width: 1px;
--wiki-content-catlinks-border-style: solid;
--wiki-content-catlinks-border-color: var(--wiki-content-border-color);
--wiki-content-catlinks-border-radius: 0px;
--wiki-content-catlinks-border-image: none;
--wiki-content-catlinks-box-shadow: none;
--wiki-content-filetoc-background: var(--wiki-content-background-color--secondary);
--wiki-content-filetoc-border-width: 1px;
--wiki-content-filetoc-border-style: solid;
--wiki-content-filetoc-border-color: var(--wiki-content-border-color);
--wiki-content-filetoc-border-radius: 0px;
--wiki-content-filetoc-border-image: none;
--wiki-content-filetoc-box-shadow: none;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
--wiki-sidebar-padding: 0px;
--wiki-sidebar-background-color: var(--wiki-content-background-color);
--wiki-sidebar-background-opacity: var(--wiki-content-background-opacity);
--wiki-sidebar-background-image: none;
--wiki-sidebar-background-position: center;
--wiki-sidebar-background-repeat: repeat;
--wiki-sidebar-background-size: auto;
--wiki-sidebar-filter: none;
--wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-sidebar-border-color: var(--wiki-content-border-color);
--wiki-sidebar-border-style: solid;
--wiki-sidebar-border-image: none;
--wiki-sidebar-link-color: var(--wiki-content-link-color);
--wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-sidebar-heading-color: var(--wiki-content-heading-color);
--wiki-sidebar-heading-font-weight: normal;
--wiki-sidebar-heading-font-style: normal;
--wiki-sidebar-heading-text-transform: none;
--wiki-sidebar-heading-line-height: normal;
--wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem;
--wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-text-shadow: none;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter);
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-box-padding: 0px;
--wiki-sidebar-box-background: none;
--wiki-sidebar-box-border: 0px;
--wiki-sidebar-box-border-image: none;
--wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color));
--wiki-footer-border-width: var(--wiki-content-border-width);
--wiki-footer-border-style: var(--wiki-content-border-style);
--wiki-footer-border-color: var(--wiki-content-border-color);
--wiki-footer-background-color: var(--wiki-content-background-color);
--wiki-footer-background-opacity: var(--wiki-content-background-opacity);
--wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-footer-text-color: var(--wiki-content-text-color);
--wiki-footer-link-color: var(--wiki-content-link-color);
--wiki-footer-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-footer-border-radius: var(--wiki-content-border-radius);
--wiki-navigation-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-background-color--hover: var(--wiki-navigation-background-color);
--wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity);
--wiki-navigation-background-image--hover: var(--wiki-navigation-background-image);
--wiki-navigation-background-position--hover: var(--wiki-navigation-background-position);
--wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat);
--wiki-navigation-background-size--hover: var(--wiki-navigation-background-size);
--wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover);
--wiki-navigation-transform--hover: none;
--wiki-navigation-selected-border-style: solid;
--wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-border-style: solid;
--wiki-navigation-border-color--hover: var(--wiki-navigation-border-color);
--wiki-navigation-border-image--hover: var(--wiki-navigation-border-image);
--wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style);
--wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px));
--wiki-navigation-icon-size: 1em;
--wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x);
--wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */
--wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color);
--wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-dropdown-offset: 0px; /* vertical offset */
--wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-search-background-image: none;
--wiki-navigation-search-background-position: 0;
--wiki-navigation-search-background-size: auto;
--wiki-navigation-search-background-repeat: repeat;
--wiki-navigation-search-backdrop-filter: none;
--wiki-navigation-search-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-search-border-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-border-style: solid;
--wiki-navigation-search-border-width: 1px;
--wiki-navigation-search-border-radius: 2px;
--wiki-navigation-search-border-image: none;
--wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image);
--wiki-navigation-search-box-shadow: none;
--wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow);
--wiki-navigation-search-text-color: var(--wiki-content-text-color);
--wiki-navigation-search-font-size: var(--wiki-navigation-font-size);
--wiki-navigation-search-height: 2em;
--wiki-navigation-search-button-color: currentColor;
--wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color);
--wiki-navigation-search-button-color-opacity: 80%;
--wiki-navigation-search-button-color-opacity--hover: 95%;
--wiki-navigation-search-bottom-spacing: 3px;
--wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent);
--wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */
}
/*** mobile adjustments ***/
@media screen and (max-width: 720px) {
body.has-vector-mobile-menu{
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-margin: 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-margin: 0px 0px -0.5em 0px;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-background-opacity: 100%;
--wiki-navigation-search-border-width: 1px;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
}
}
/*****************************
**** END SHARED VARIABLES ****
******************************/
/******************************************************************************************
********************************* End user-edit variables *********************************
******************************************************************************************/
/******************************
* Fallback for older browsers *
* DONT EDIT THIS *
*******************************/
@supports not (color:color-mix(in srgb, #000, transparent)) {
.view-dark,
.view-light,
:root {
--wiki-content-text-mix-color: var(--wiki-content-text-color);
--wiki-content-text-mix-color-95: var(--wiki-content-background-color);
--wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted);
--wiki-content-border-color--secondary: var(--wiki-content-border-color);
--wiki-content-border-color--accent: var(--wiki-accent-color);
--wiki-accent-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-highlight-background-color: transparent;
}
}
/*****************************
* End older browser fallback *
******************************/
/*****************************
* PortableInfoboxes *
******************************/
:root {
--pi-background: var(--wiki-content-background-color);
--pi-secondary-background: var(--wiki-accent-color);
--pi-secondary-background-label: var(--wiki-accent-label-color);
--pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent);
}
.portable-infobox .pi-title,
.portable-infobox .pi-header {
text-align: center;
font-size: 1.5em;
background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent);
color: var(--pi-secondary-background-label);
}
.portable-infobox .pi-data,
.portable-infobox .pi-group {
background: var(--wiki-content-background-color--secondary);
}
.portable-infobox .pi-image {
padding: 8px;
}
.pi-image-thumbnail {
max-width: 100%;
}
.pi-caption {
color: var(--wiki-content-text-mix-color);
}
.pi-section-navigation .pi-section-tab.pi-section-active,
.pi-section-navigation .pi-section-tab.current,
.pi-media-collection .pi-tab-link.current {
background: var(--pi-secondary-background);
color: var(--pi-secondary-background-label);
}
.pi-collapse > .pi-item:first-child {
cursor: pointer;
}
/* overqualify these to overwrite normal content heading styles */
.mw-body .portable-infobox h2,
.mw-body .portable-infobox h3 {
border-bottom: 0;
font-family: inherit;
font-weight: 700;
margin: 0;
}
/*****************************
* End PortableInfoboxes *
******************************/
/*******************
* Main page layout *
********************/
#mp-container {
display: grid;
gap: 10px;
}
@media screen and (max-width: 990px) {
/* for mobile screens */
#mp-container {
grid-template-areas:var(--main-page-layout--mobile);
grid-template-columns:var(--main-page-layout-columns--mobile, 100%);
}
.mp-box.mp-hide-on-mobile {
display: none;
}
}
@media screen and (min-width: 990px) and (max-width: 1350px) {
/* for narrow screens, between 990px and 1350px */
#mp-container {
grid-template-areas:var(--main-page-layout--tablet);
grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr);
}
.mp-box.mp-hide-on-tablet {
display: none;
}
}
@media screen and (min-width: 1350px) {
/* for all other screens, 1350px and wider */
#mp-container {
grid-template-areas:var(--main-page-layout--desktop);
grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr);
}
.mp-box.mp-hide-on-desktop {
display: none;
}
}
.mp-box {
position: relative;
display: flex;
flex-flow: column nowrap;
width: 100%;
box-sizing: border-box;
background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent);
border: 1px solid var(--wiki-content-border-color);
padding: 0px;
}
.mp-body {
height: 100%;
display: flex;
padding: 0.5em;
flex-flow: column nowrap;
}
.mp-box.centered-content .mp-body {
height: 100%;
display: flex;
flex-flow: column nowrap;
justify-content: space-evenly;
}
.mp-box.has-floating-image {
display: block;
}
.mp-box.has-floating-image .mp-body {
height: unset;
display: block;
}
/* overqualified to override normal heading styles */
.mw-body .mp-box h2 {
text-align: center;
font-weight: bold;
font-family: var(--wiki-content-heading-font-family);
overflow: initial;
border-bottom: 1px solid var(--wiki-content-border-color);
font-size: 150%;
margin: 0;
padding: 5px 0;
color: var(--wiki-content-heading-color);
}
#mp-box-welcome {
text-align: center;
position: relative;
overflow: hidden;
}
#mp-box-welcome h2 {
font-size: 200%;
}
#mp-welcome {
display: flex;
flex-flow: column nowrap;
position: relative;
height: 100%;
z-index: 2;
box-sizing: border-box;
}
#mp-welcome .welcome-subtitle {
height: 100%;
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent);
padding: 0.5em;
}
#mp-banner {
position: absolute;
width: 100%;
height: 100%;
filter: blur(5px);
z-index: -1;
background: url(/images/e/e0/MP_banner.jpg);
background-size: cover;
background-repeat: no-repeat;
background-position: top center;
}
.view-dark #mp-banner {
filter: blur(5px) brightness(50%);
}
.view-light #mp-banner {
filter: blur(5px) contrast(50%);
}
/* [[Template:MP_link]] */
.mp-links {
--gap: 10px;
}
.mp-links > ul {
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin: 2px;
gap: var(--gap);
}
.mp-links > ul > li {
display: flex;
flex-flow: column nowrap;
align-items: stretch;
text-align: center;
box-sizing: border-box;
flex: max(calc(50% - var(--gap)), 5em) 1 1;
outline: 1px solid var(--wiki-content-link-color);
transition: 0.1s ease-in;
}
.mp-links > ul > li:hover {
background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent);
}
.mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;}
.mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;}
.mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;}
.mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;}
.mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;}
.mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;}
.mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;}
.mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;}
.mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;}
.mp-links > ul > li:hover a {
text-decoration: underline;
}
.mp-links > ul > li > a {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
flex: 1 1 auto;
box-sizing: border-box;
padding: 5px;
}
.mp-links > ul > li > a:first-child {
height: 100%;
}
.mp-links > ul > li > a:last-child:not(:first-child) {
height: unset;
}
.mp-links.stretch,
.mp-links.stretch > ul {
height: 100%;
}
.mp-links.side-image li {
flex-flow: row nowrap;
}
.mp-links.plain > ul > li {
outline-color: transparent;
}
/***********************
* End main page layout *
************************/
/*********************************************************************************************************************
* Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) *
**********************************************************************************************************************/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so: */
.hlist dt:not(:last-child)::after {
content: ":\20";
}
.hlist dd:not(:last-child)::after,
.hlist li:not(:last-child)::after {
/* "space, Middle Dot, space"
We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters.
The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */
/* content: "\20\00B7\20"; font-weight: bold; */
/* "space • space"
There may (and likely) be an extra whitespace between <li>s,
therefore we have to use a space character as last character of this sequence.
By this way, the last space and the next whitespce will collapse as a single space,
to make the whitespace on both sides of the middle dot the same width.
*/
content: "\20\A0\2022\A0\20";
font-weight: inherit;
}
/* Add parentheses around nested lists */
.hlist dd ol::before,
.hlist dd ul::before,
.hlist dd dl::before,
.hlist dt ol::before,
.hlist dt ul::before,
.hlist dt dl::before,
.hlist li ol::before,
.hlist li ul::before,
.hlist li dl::before {
content: "\20(";
font-weight: inherit;
}
.hlist dd ol::after,
.hlist dd ul::after,
.hlist dd dl::after,
.hlist dt ol::after,
.hlist dt ul::after,
.hlist dt dl::after,
.hlist li ol::after,
.hlist li ul::after,
.hlist li dl::after {
content: ")";
font-weight: inherit;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) ".\20";
}
/* Progressive enhancement:
* try to make the dot always follow the list item in same line
*/
.hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) {
display: inline-block;
}
/********************************************
* End semantically-correct horizontal lists *
*********************************************/
/*** Miscellaneous ***/
.responsive-image {
max-width: 100%;
height: auto;
}
.view-dark .invert-on-dark,
.view-light .invert-on-light {
filter: invert(100%);
}
.pixelated {
image-rendering: pixelated;
}
@media screen and (min-width: 720px) {
.mobileonly {
display: none;
}
}
@media screen and (max-width: 720px) {
.nomobile {
display: none;
}
}
/*** Utility classes for standard MW galleries ***/
/* it's important that spaced comes before centered in the sheet */
.gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin-left: unset;
}
.gallery.centered {
text-align: center;
}
/**************************
* Start Modular Templates *
**************************/
/********* [[Template:Ambox]] *********/
.ambox {
--ambox-color: var(--wiki-accent-color);
border: 1px solid var(--wiki-content-border-color);
border-left: 10px solid var(--ambox-color);
border-radius: 2px;
display: flex;
align-items: center;
gap: .6em;
margin: 1em 0;
padding: 3px .6em;
background-color: var(--wiki-content-background-color--secondary);
box-shadow: 2px 2px 5px 0px #0002;
}
@media (min-width: 720px) {
.ambox {
margin-inline: 10%;
}
}
.ambox.tiny {
padding: .04rem .5em;
margin-inline: 0;
width: fit-content;
}
.ambox + .ambox {
margin-top: -.6em;
}
.ambox-content {
flex: 1;
}
.ambox-content p {
margin: .15em 0;
}
.ambox-title {
font-weight: bold;
}
/********* [[Template:Hatnote]] *********/
.hatnote {
padding: 1px 0 1px 1.6em;
margin-bottom: 0.5em;
font-style: italic;
border-top: 1px solid var(--wiki-content-border-color--secondary);
border-bottom: 1px solid var(--wiki-content-border-color--secondary);
}
.hatnote.icon {
padding-left: 0;
}
/********* [[Template:Spoiler]] *********/
.spoiler-content {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent);
transition: all 0.3s;
cursor: pointer;
overflow: auto;
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
.spoiler-content {
background-color: var(--wiki-content-dynamic-color--secondary);
}
}
.spoiler-content > * {
pointer-events: none;
opacity: 0;
transition: all 0.3s;
}
.spoiler-content.show {
background-color: transparent;
}
.spoiler-content.show > * {
pointer-events: unset;
opacity: 1;
}
/********* [[Template:Link icon]] *********/
.link-icon {
--link-icon-line-height: 1.5em;
--link-icon-size: 1.5em;
display: inline-flex;
align-items: center;
height: var(--link-icon-line-height);
vertical-align: bottom;
}
.link-icon .regular {
align-self: center;
}
.link-icon .regular a {
display: flex;
}
.link-icon .regular img {
height: var(--link-icon-size);
max-width: var(--link-icon-size);
}
.link-icon .fallback {
outline: 1px solid var(--wiki-content-text-color);
border-radius: 50%;
text-align: center;
width: var(--link-icon-size);
line-height: var(--link-icon-size);
}
.link-icon.notext,
.link-icon.notext .fallback {
display: inline-block;
}
/********* [[Template:Quote]] *********/
.quote {
background: var(--wiki-content-background-color--secondary);
border-radius: 5px;
border: 2px solid var(--wiki-content-border-color);
margin: .5em 0;
padding: .5em;
overflow-y: hidden;
}
.quote .block {
display: block;
}
.quote .title {
font-size: large;
font-weight: bold;
}
.quote .content {
font-style: italic;
}
.quote .author {
font-weight: bold;
text-align: end;
}
.quote .marks-wrapper {
display: flex;
gap: 5px;
}
.quote .marks-wrapper::before,
.quote .marks-wrapper::after {
font-size: 100px;
line-height: 0px;
}
.quote .marks-wrapper::before {
content: "\201C";
margin-top: 40px;
}
.quote .marks-wrapper::after {
content: "\201D";
align-self: end;
margin-bottom: -10px;
}
.client-js .mw-charinsert-item {
display: none;
}
/************************
* End Modular Templates *
*************************/
/*****************************
* Used by [[Template:Color]] *
******************************/
.color__splotch {
display: inline-block;
height: 1em;
width: 1em;
box-sizing: border-box;
vertical-align: text-top;
border-radius: 50%;
border: 1px solid var(--wiki-content-text-color);
}
/*********************
* End Template:Color *
**********************/
/*********************************
* Used by [[Template:TOC limit]] *
**********************************/
.toclimit-2 .toclevel-1 ul,
.toclimit-3 .toclevel-2 ul,
.toclimit-4 .toclevel-3 ul,
.toclimit-5 .toclevel-4 ul,
.toclimit-6 .toclevel-5 ul,
.toclimit-7 .toclevel-6 ul {
display: none;
}
/*************************
* End Template:TOC limit *
**************************/
/*********************************
* Used by [[Template:TOC right]] *
**********************************/
@media all and (min-width: 720px) {
.tocright {
float: right;
clear: right;
margin: 0 0 0.5em 1em;
}
}
/*************************
* End Template:TOC right *
**************************/
40bfba1f9ff64946e8ca2054b3ba281f00f40f54
MediaWiki:Theme-definitions
8
236
260
2025-08-20T01:24:56Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
* light[bundled|kind=light]
* dark[bundled|kind=dark]
05cdfdf87ea42919cc6ea267d3972cc06847ed60
MediaWiki:Gadgets/purge/main.js
8
237
261
2025-08-20T01:24:57Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
$.when( $.ready )
.then(function(){
if ( document.getElementById( 'ca-cargo-purge' )){ return; } // disable if Cargo has already added a purge button
if ( mw.config.get( 'wgNamespaceNumber' ) === -1 ) { return; } // disable on special pages
var url = new URL(window.location.href);
url.searchParams.set('action', 'purge');
var button = mw.util.addPortletLink('p-cactions', url.href, mw.msg('cargo-purgecache'), 'ca-gadget-purgecache', mw.msg('action-purge'), '1');
button.addEventListener('click', (function(event) {
event.preventDefault();
var api = new mw.Api();
api.post({
action: 'purge',
titles: mw.config.get('wgPageName'),
forcerecursivelinkupdate: true
}).then(function() {
window.location.reload(true);
}).fail(function(code) {
mw.notify(mw.msg('cargo-purgecache-failed')+" "+code);
});
}));
});
5d10082771b97fa1ba479534a973769321d887dc
MediaWiki:Gadgets/userProfile/main.js
8
238
262
2025-08-20T01:24:58Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
// User profile
// <nowiki>
mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ] ).done( function() {
var config = mw.config.get( [
'wgRelevantUserName',
'wgNamespaceNumber',
'wgUserLanguage',
'wgArticleId',
'wgAction',
'wgTitle'
] );
var username = config.wgRelevantUserName;
if ( !username || window.loadedHorseUserProfile ) return;
window.loadedHorseUserProfile = true;
if ( config.wgNamespaceNumber !== -1 && config.wgTitle.includes('/') ) return;
var lang = mw.language.bcp47(config.wgUserLanguage);
var dateOptions = {
year: "numeric",
month: "short",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
timeZone: "UTC",
timeZoneName: "short"
};
var api = new mw.Api();
if ( mw.util.isIPAddress(username) ) api.get( {
action: 'query',
list: ['usercontribs', 'blocks'],
ucuser: username,
ucprop: [],
uclimit: 'max',
bkip: username,
bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
bklimit: 1,
formatversion: 2
} ).done( function(data) {
var editcount = data.query.usercontribs.length;
if ( data.continue && data.continue.uccontinue ) editcount = data.limits.usercontribs+'+';
var user = {
groups: ['*'],
editcount: editcount
};
formatProfile(user, data.query.blocks[0]);
} );
else api.get( {
action: 'query',
list: ['users', 'blocks'],
ususers: username,
usprop: ['groups', 'editcount', 'registration', 'emailable'],
bkusers: username,
bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
bklimit: 1,
formatversion: 2
} ).done( function(data) {
formatProfile(data.query.users[0], data.query.blocks[0]);
} );
if ( window.loadedHorseUserProfileContribs ) return;
window.loadedHorseUserProfileContribs = true;
if ( config.wgNamespaceNumber === 2 && !config.wgArticleId && config.wgAction === 'view' ) {
mw.loader.using( [ 'mediawiki.pager.styles', 'mediawiki.special.changeslist' ] ).then( function() {
var text = '== [[Special:Contributions/' + username + '|{{int:contributions-title|' + username + '}}]] ==\n{{Special:Contributions/' + username + '|limit=20}}';
new mw.Api().parse( text, {
title: 'User:' + config.wgTitle,
wrapoutputclass: 'horse-userprofile-contribs',
disableeditsection: true,
disablelimitreport: true,
uselang: config.wgUserLanguage
} ).done( function(parsedText) {
mw.hook( 'wikipage.content' ).fire(
$( parsedText ).appendTo('#mw-content-text')
);
} );
} );
}
function formatProfile(user, block) {
user.groups.splice(user.groups.indexOf('*'), 1);
var text = '<div class="horse-userprofile-info">';
if ( user.groups.length ) {
var groupList = user.groups.map( function(group) {
var grouppage = '{{MediaWiki:grouppage-'+group+'}}';
return [
'{{#ifexist: '+grouppage+' | [['+grouppage+'|{{int:group-'+group+'}}]] | {{int:group-'+group+'}} }}',
'{{#ifexist: '+grouppage+' | [['+grouppage+'|{{int:group-'+group+'-member|'+username+'}}]] | {{int:group-'+group+'-member|'+username+'}} }}'
];
} ).reduce( function(prev, cur) {
prev[0].push(cur[0]);
prev[1].push(cur[1]);
return prev;
}, [[], []] );
text += '\n\n<span>{{int:prefs-memberingroups|'+user.groups.length+'|'+username+'}}</span>\t<span>{{int:prefs-memberingroups-type|'+mw.language.listToText(groupList[0])+'|'+mw.language.listToText(groupList[1])+'}}</span>';
if (mw.config.get('wgUserGroups').some(item => ['advocate', 'staff'].includes(item))) { //return true if their usergroups contain advocate or staff
text += '<br/>([[Special:UserRights/' + username + '|{{int:tool-link-userrights|' + username + '}}]])'
}
}
text += '\n\n<span>{{int:prefs-edits}}</span>\t<span>[[Special:Contribs/'+username+'|'+mw.language.convertNumber(user.editcount)+']]</span>';
if ( user.registration ) text += '\n\n<span>{{int:prefs-registration}}</span>\t<span>'+mw.language.convertNumber(new Date(user.registration).toLocaleString(lang, dateOptions))+'</span>';
if ( user.userid && !user.emailable ) text += '\n\n<span>{{int:nowikiemailtext|'+username+'}}</span>';
text += '\n\n</div>';
if ( block && !$('.mw-warning-with-logexcerpt .mw-logevent-loglines > .mw-logline-block').length ) {
var notice = 'sp-contributions-blocked-notice';
if ( mw.util.isIPAddress(block.user, true) ) notice += '-anon';
var logentry = 'logentry-block-block';
var partialBlock = [];
if ( block.partial ) {
notice += '-partial';
logentry = 'logentry-partialblock-block';
if ( block.restrictions.pages ) {
var blockpages = block.restrictions.pages.map( function(page) {
return '[['+page.title+']]';
} );
partialBlock.push('{{int:logentry-partialblock-block-page|'+blockpages.length+'|'+mw.language.listToText(blockpages)+'}}');
}
if ( block.restrictions.namespaces ) {
var blocknamespaces = block.restrictions.namespaces.map( function(namespace) {
if ( !namespace ) return '[[Special:AllPages|{{int:blanknamespace}}]]';
return '[[Special:AllPages/{{ns:'+namespace+'}}:|{{ns:'+namespace+'}}]]';
} );
partialBlock.push('{{int:logentry-partialblock-block-ns|'+blocknamespaces.length+'|'+mw.language.listToText(blocknamespaces)+'}}');
}
if ( block.restrictions.actions ) {
var blockactions = block.restrictions.actions.map( function(action) {
return '{{int:ipb-action-'+action+'}}';
} );
partialBlock.push('{{int:logentry-partialblock-block-action|'+blockactions.length+'|'+mw.language.listToText(blockactions)+'}}');
}
if ( !partialBlock.length ) logentry = 'logentry-non-editing-block-block';
}
var blockDate = new Date(block.timestamp);
var blockexpiry = '{{int:infiniteblock}}';
if ( !['infinite', 'indefinite', 'infinity', 'never'].includes(block.expiry) ) {
var expiry = new Date(block.expiry.replace( /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2,3})/, '$1-$2-$3T$4:$5:$6Z' ));
var duration = expiry - blockDate;
var blockDuration = [];
var factor = 1000;
if ( duration % factor === 0 ) blockDuration = ['duration-seconds', Math.floor(duration / factor)];
factor *= 60;
if ( duration % factor === 0 ) blockDuration = ['duration-minutes', Math.floor(duration / factor)];
factor *= 60;
if ( duration % factor === 0 ) blockDuration = ['duration-hours', Math.floor(duration / factor)];
factor *= 24;
if ( duration % factor === 0 ) blockDuration = ['duration-days', Math.floor(duration / factor)];
if ( duration % (factor*7) === 0 ) blockDuration = ['duration-weeks', Math.floor(duration / (factor*7))];
if ( duration % (factor*30) === 0 ) blockDuration = ['months', Math.floor(duration / (factor*30))];
factor *= 365;
if ( duration % factor === 0 ) blockDuration = ['duration-years', Math.floor(duration / factor)];
if ( duration % (factor*10) === 0 ) blockDuration = ['duration-decades', Math.floor(duration / (factor*10))];
if ( duration % (factor*100) === 0 ) blockDuration = ['duration-centuries', Math.floor(duration / (factor*100))];
if ( duration % (factor*1000) === 0 ) blockDuration = ['duration-millennia', Math.floor(duration / (factor*1000))];
if ( blockDuration.length < 2 || blockDuration[1] > 1000 ) blockexpiry = mw.language.convertNumber(expiry.toLocaleString(lang, dateOptions));
else blockexpiry = '{{int:'+blockDuration.join('|')+'}}';
}
var blockflags = '';
var blockflaglist = [];
if ( block.anononly ) blockflaglist.push('{{int:block-log-flags-anononly}}');
if ( block.nocreate ) blockflaglist.push('{{int:block-log-flags-nocreate}}');
if ( !block.autoblock && !mw.util.isIPAddress(block.user, true) ) blockflaglist.push('{{int:block-log-flags-noautoblock}}');
if ( !block.allowusertalk ) blockflaglist.push('{{int:block-log-flags-nousertalk}}');
if ( block.noemail ) blockflaglist.push('{{int:block-log-flags-noemail}}');
if ( block.hidden ) blockflaglist.push('{{int:block-log-flags-hiddenname}}');
if ( blockflaglist.length ) blockflags = '{{int:parentheses|'+blockflaglist.join(mw.msg('comma-separator'))+'}}';
var blockreason = ' <span class="comment">{{int:parentheses|'+block.reason+'}}</span>';
if ( !block.reason ) blockreason = '';
text += '<div class="horse-userprofile-block cdx-message cdx-message--block cdx-message--warning mw-warning-with-logexcerpt"><span class="cdx-message__icon"></span><div class="cdx-message__content">\n{{int:'+notice+'|'+username+'}}\n';
text += '<ul class="mw-logevent-loglines"><li class="mw-logline-block">'+mw.language.convertNumber(blockDate.toLocaleString(lang, dateOptions))+' {{int:'+logentry+'|[[User:'+block.by+'|'+block.by+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.by+'|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/'+block.by+'|{{int:contribslink}}]]</span></span>|'+block.by;
if ( mw.util.isIPAddress(block.user, true) ) text += '|[[Special:Contribs/'+block.user+'|'+block.user+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.user+'|{{int:talkpagelinktext}}]]</span></span>';
else text += '|[[User:'+block.user+'|'+block.user+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.user+'|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/'+block.user+'|{{int:contribslink}}]]</span></span>';
text += '|'+block.user+'|'+blockexpiry+'|'+blockflags+'|'+mw.language.listToText(partialBlock)+'}}'+blockreason+'</li></ul></div></div>';
}
api.parse( '<div class="cdx-message__content">' + text + '</div>', {
disablelimitreport: true,
wrapoutputclass: 'horse-userprofile mw-message-box cdx-message mw-content-'+($('#mw-content-subtitle').attr('dir')||'ltr'),
uselang: config.wgUserLanguage
} ).done( function(parsedText) {
parsedText = parsedText.replace( /\u29FCgroup-([^\u29FC\u29FD]+?)(?:-member)?\u29FD/g, '$1' );
mw.hook( 'wikipage.content' ).fire(
$( parsedText ).appendTo('#contentSub')
);
} );
}
} );
// </nowiki>
a86531394e21271ad91869b48f3634f341b1bd79
MediaWiki:Gadgets/userProfile/main.css
8
239
263
2025-08-20T01:24:58Z
ARTIFICER
564804
Importing default loadout
css
text/css
#contentSub > * + .horse-userprofile {
margin-top: 1em;
}
.horse-userprofile {
font-size: 120%;
color: var(--wiki-content-text-color);
border: 2px solid var(--wiki-content-border-color);
padding: 6px 12px;
}
.horse-userprofile-info span:first-of-type {
font-weight: bold;
}
1729445bb17e2974426befaf9bd441ab4bf189c5
MediaWiki:Gadgets/uploadMultipleFiles/main.js
8
240
264
2025-08-20T01:24:59Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
/* Modified version of https://dev.fandom.com/wiki/UploadMultipleFiles
* from https://terraria.wiki.gg/wiki/MediaWiki:Gadget-uploadMultipleFiles.js */
$.when( mw.loader.using( ['site', 'mediawiki.util', 'mediawiki.api', 'mediawiki.jqueryMsg'] ), $.ready )
.then( () => new mw.Api().loadMessagesIfMissing([
'gadget-uploadMultipleFiles-multiupload',
'gadget-uploadMultipleFiles-yes',
'gadget-uploadMultipleFiles-no',
'gadget-uploadMultipleFiles-sourcefiles',
'gadget-uploadMultipleFiles-categoryname',
'gadget-uploadMultipleFiles-categorynamehint',
'gadget-uploadMultipleFiles-categorynamespace',
'gadget-uploadMultipleFiles-uploadfiles',
'gadget-uploadMultipleFiles-nofiles',
'gadget-uploadMultipleFiles-nolicense',
'gadget-uploadMultipleFiles-summary',
'gadget-uploadMultipleFiles-license',
'gadget-uploadMultipleFiles-categories',
'gadget-uploadMultipleFiles-uploading',
'gadget-uploadMultipleFiles-uploaded',
'gadget-uploadMultipleFiles-failed',
'gadget-uploadMultipleFiles-done',
'gadget-uploadMultipleFiles-ratelimited',
]) )
.then(function(){
if (mw.config.get("wgCanonicalSpecialPageName") !== "Upload"){ return; }
if (window.__wgg_UploadMultipleFiles_IsLoaded) { return; }
window.__wgg_UploadMultipleFiles_IsLoaded = true;
const getUploadDescription = function() {
var sections = [];
var summary = $("#wpUploadDescription").val();
var licenseDisplayName = $("#wpLicense option:selected").val();
var categoryName = $("#multiFileCategory").val();
if (summary !== ""){
sections.push(summary);
}
if (licenseDisplayName !== "") {
var licenseTemplateText = $("#wpLicense option:selected").prop("title");
sections.push("== " + mw.msg("gadget-uploadMultipleFiles-license") + " ==\n" + licenseTemplateText);
}
if (categoryName !== "")
sections.push("[[" + mw.msg("gadget-uploadMultipleFiles-categorynamespace") + ":" + categoryName + "]]");
return sections.join("\n\n");
};
const getWatchlistPreference = function() {
if ($("#wpWatchthis").is(":checked")) {
return "watch";
} else {
return "nochange";
}
};
$("#wpUploadFile").parent().parent().addClass("regularFileSelect");
$("tr.regularFileSelect").before(
$("<tr></tr>").append(
$('<td class="mw-label"></td>').msg("gadget-uploadMultipleFiles-multiupload"),
$('<td class="mw-input"></td>').append(
$("<label></label>").msg("gadget-uploadMultipleFiles-yes").prepend('<input type="radio" name="multipleFiles" value="yes" /> '),
' ',
$("<label></label>").msg("gadget-uploadMultipleFiles-no" ).prepend('<input type="radio" name="multipleFiles" value="no" checked/> '),
)
)
).after(
$('<tr class="multipleFileSelect" style="display:none;"></tr>').append(
$('<td class="mw-label"></td>').msg("gadget-uploadMultipleFiles-sourcefiles"),
$('<td class="mw-input"></td>').append('<input type="file" id="multiupload" multiple />')
)
);
$("input[name='wpUpload']").addClass("regularFileSelect");
$("#wpDestFile").parent().parent().addClass("regularFileSelect");
$("#wpIgnoreWarning").parent().parent().addClass("regularFileSelect");
// Append "category name" textbox to multiupload section
$("#mw-upload-form #mw-htmlform-description tbody").append(
$('<tr class="mw-htmlform-field-HTMLTextField multipleFileSelect" style="display:none;"></tr>').append(
$('<td class="mw-label"></td>').append('<label for="multiFileCategory"><abbr title="' + mw.msg("gadget-uploadMultipleFiles-categorynamehint") + '">' + mw.msg("gadget-uploadMultipleFiles-categoryname") + '</abbr></label>'),
$('<td class="mw-input"></td>').append('<input id="multiFileCategory" name="multiFileCategory" size="60">')
)
);
$("input[name='wpUpload']").after('<input type="button" value="' + mw.msg("gadget-uploadMultipleFiles-uploadfiles") + '" class="multipleFileSelect" style="display:none;" id="multiFileSubmit" />');
$("input[name='multipleFiles']").change(function() {
if (this.value === 'yes') {
$(".regularFileSelect").hide();
$(".multipleFileSelect").show();
} else {
$(".regularFileSelect").show();
$(".multipleFileSelect").hide();
}
});
$("#multiFileSubmit").click(function() {
var files = $("#multiupload")[0].files;
// Cancel upload if no files are selected
if (files.length === 0) {
alert(mw.msg("gadget-uploadMultipleFiles-nofiles"));
return false;
}
// Cancel upload if no license is selected
if ($("#wpLicense option:selected").val() === "" && !mw.config.get("UMFBypassLicenseCheck")) {
alert(mw.msg("gadget-uploadMultipleFiles-nolicense"));
return false;
}
// Description is summary + license + category
var description = getUploadDescription();
var watch = getWatchlistPreference();
$("#firstHeading").msg("gadget-uploadMultipleFiles-uploading");
$("#mw-content-text").html("<h3>" + mw.msg("gadget-uploadMultipleFiles-uploaded") + "</h3><ul></ul><div style='display:none;' id='multiUploadFailed'><h3>" + mw.msg("gadget-uploadMultipleFiles-failed") + "</h3><ul></ul></div>");
var currentFileIdx = 0;
var uploadCurrentFile;
uploadCurrentFile = function() {
if (currentFileIdx > files.length) {
$("#mw-content-text").append($("<h3></h3>").msg("gadget-uploadMultipleFiles-done"));
return;
}
if (files[currentFileIdx] === undefined) {
currentFileIdx++;
uploadCurrentFile();
return;
}
fd = new FormData();
fd.append("action", "upload");
fd.append("token", mw.user.tokens.get("csrfToken"));
fd.append("filename", files[currentFileIdx].name);
fd.append("file", files[currentFileIdx]);
fd.append("text", description);
fd.append("watchlist", watch);
fd.append("ignorewarnings", 1);
fd.append("format", "json");
const $output = $("#mw-content-text > ul");
const $failed = $("#multiUploadFailed");
const $failedOutput = $('#multiUploadFailed ul');
$.ajax({
url: mw.util.wikiScript("api"),
method: "POST",
data: fd,
cache: false,
contentType: false,
processData: false,
type: "POST"
}).done(function(d) {
if (d.error == undefined) {
$output.append('<li><a href="' + d.upload.imageinfo.descriptionurl + '" target="_blank">' + d.upload.filename + '</a></li>');
}
// specific catch for ratelimiting
else if(d.error.code === "ratelimited") {
timer = 60;
console.log(mw.msg('gadget-uploadMultipleFiles-ratelimited', timer));
$message = $('<li class="multiUploadActive"></li>').msg('gadget-uploadMultipleFiles-ratelimited', $('<span id="rateLimitCounter">' + timer + '</span>'));
$output.append($message);
var countdown = setInterval(function(){
// count the timer down, and remove at 0
timer -= 1;
document.getElementById('rateLimitCounter').textContent = timer;
if (timer <= 0) {
$message.remove()
clearInterval(countdown);
}
}, 1000);
setTimeout(function(){
// redundant clearing of the interval and message in case of race conditions
clearInterval(countdown);
$message.remove();
uploadCurrentFile();
}, timer * 1000);
return;
}
// generic fallback
else {
$failedOutput.append('<li>' + files[currentFileIdx].name + ': ' + d.error.info + '</li>');
$failed.show();
}
currentFileIdx++;
uploadCurrentFile();
}).fail(function() {
$failedOutput.append('<li>' + files[currentFileIdx].name + '</li>');
$failed.show();
currentFileIdx++;
uploadCurrentFile();
});
};
uploadCurrentFile();
});
});
f47e56dc31399578758f15aafbdf732564a80bd3
MediaWiki:Licenses
8
241
265
2025-08-20T01:25:00Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
*Game content
** License|game|This contains content from the game or its official media
*Commonly used
** License|fairuse|This will be used in a way that qualifies as "fair use" under US law
** License|CC0|This file is licensed under the CC0 1.0 License
** License|CC-BY-NC-ND|This is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License
** License|CC-BY-NC-SA|This is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
** License|CC-BY-NC|This is licensed under the Creative Commons Attribution-NonCommercial 3.0 License
** License|CC-BY-ND|This is licensed under the Creative Commons Attribution-NoDerivs 3.0 License
** License|CC-BY-SA|This is licensed under the Creative Commons Attribution-ShareAlike 3.0 License
** License|permission|The copyright holder gave permission to use this work only in wiki.gg articles
** License|CC-BY|This is licensed under the Creative Commons Attribution 3.0 License
** License|CC-PD|This is in the public domain
** License|CC-SRR|This is licensed under the Creative Commons Some Rights Reserved License
*Unsure or unknown
** License|nolicense|I don't know the license
80cf31331a258a3fc3651f6d5961fbb5c1822cee
MediaWiki:Copyright
8
242
266
2025-08-20T01:25:01Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{int:wikigg-copyright|CC BY-SA 4.0|$1}}
999f12b472b0177c515e14cda21d5e4ddc0603e1
MediaWiki:Mainpage
8
243
267
2025-08-20T01:25:02Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
{{SITENAME}}
3879910e8b355a24373fd09ccc909145b2639907
MediaWiki:Apioutput.css
8
244
268
2025-08-20T01:25:02Z
ARTIFICER
564804
Importing default loadout
css
text/css
/* All CSS here is applied on api.php pages */
@media (prefers-color-scheme: dark) {
body {
background-color:#20211f;
border-color: #7b7261;
color: #f6ecdb;
}
h1, h2, h3, h4, h5, h6 {
color: rgb(234, 224, 207);
border-color: rgb(83, 84, 81);
}
.mw-highlight .s2 {
color: rgb(206, 99, 91);
}
a {
color: rgb(133, 180, 221);
}
a:visited {
color: rgb(141, 127, 218);
}
pre, code, .mw-code {
background-color: rgb(34, 35, 33);
color: rgb(234, 224, 207);
border-color: rgb(63, 64, 62);
}
}
c95cf2c22c12d821f22b745f2aa78d4f6f711500
MediaWiki:Gadgets/hoverShowSpoilers/main.css
8
245
269
2025-08-20T01:25:03Z
ARTIFICER
564804
Importing default loadout
css
text/css
.spoiler-content:hover > * {
pointer-events:unset;
opacity: 1;
}
.spoiler-content:hover {
background-color: transparent;
}
1c73aafcb749d7e0e9107c1045310d2af70aae7e
MediaWiki:Common.css/doc
8
246
270
2025-08-20T01:25:03Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<div class="mw-parser-output" id="dl-variable-doc"><!-- hide this in your global.css if you're familiar with how default loadout works and this documentation is just in your way -->
<h2>Documentation</h2>
This wiki is using the theming template from the [[dlw:|default loadout]]. This template is intended to minimize the work required to create a custom colored version of the standard [[mw:Skin:Vector|Vector]] skin, while maximizing the various nooks and crannies that those colors reach, all while keeping everything legible and matching.
Please be aware of the [[support:Customization policy|customization policy]] when modifying the theme.
<h3>Themes</h3>
The [[support:Theme Toggle|Theme Toggle]] extension is installed, and allows multiple themes to be used. In the actual stylesheet below this documentation, you'll find two huge rules at the top, each containing lots of [https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties CSS color variables]. They look like this:
<syntaxhighlight lang=css>
:root,
/* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=light, */
/* individual themes are prefixed with .theme- instead */
.view-light {
/**********************
* Probably edit these * [ LIGHT VIEW ]
***********************/
--wiki-body-background-color: #F6F6F6;
--wiki-body-background-image: url(filepath://Site-background.jpg);
/* and so on */
}
.view-dark {
/**********************
* Probably edit these * [ DARK VIEW ]
***********************/
--wiki-body-background-color: #171717;
--wiki-body-background-image: url(filepath://Site-background-dark.jpg);
/* and so on */
}
</syntaxhighlight>
These are the standard light and dark themes, defined in [[Mediawiki:Theme-definitions]]. '''Important''': if you want your wiki to only support a single theme, edit that page and remove the line you don't want (don't remove both). The <code>:root</code> selector is a fallback, meaning that in case something happens and Theme Toggle fails to work, the following theme will still mostly work. If you have multiple themes, you can move the <code>:root</code> rule to whichever you'd consider the "default" theme.
<h3>Non-color variables</h3>
{| class="wikitable"
! Variable name !! Notes
|-
| --wiki-body-background-image
| This is the image path to the wiki's background image. Usually this is uploaded to File:Site-background.jpg, File:Site-background-light.jpg, and/or File:Site-background-dark.jpg. While there's not a hard file size limit, it is recommended that this not exceed 250 KB. File size can be reduced by resizing (anything over 2560x1440p is excessive), converting to a jpg, and compressed using sites like [https://tinypng.com TinyPNG].
|-
| --wiki-body-background-position
| The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-position background-position] of the background image. Usually this is set to <code>top center</code>.
|-
| --wiki-body-background-size
| The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-size background-size] of the background image. Usually this is set to <code>cover</code>.
|-
| --wiki-body-background-repeat
| The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-repeat background-repeat] of the background image. Usually this is set to <code>no-repeat</code>.
|-
| --wiki-body-background-attachment
| The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-attachment background-attachment] of the background image. Usually this is set to <code>fixed</code>.
|-
| --wiki-body-font-family
| The font family of most of the wiki, such as the sidebar, navigation, and content text. Usually this is sans-serif. If modifying this, use a simple font that is easy to read. See <code>--wiki-heading-font-family</code> if you want to incorporate a more decorative font into the theme.
|-
| --wiki-heading-font-family
| The font family of headings, such as the page title and section headings. This font is usually displayed in a larger size, so it's safer to use a more decorative font than <code>--wiki-body-font-family</code>, but still try to keep it legible.
|-
| --wiki-sidebar-heading-font-family
| The font family of sidebar headings. In contrast to <code>--wiki-heading-font-family</code>, this is usually displayed in a smaller size, so keep it simple and easy to read.
|-
| --wiki-sidebar-border-radius
| The [https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius border-radius] of the sidebar. If <code>--wiki-sidebar-portal-spacing</code> is set to 0, then only the top and bottom corners of the sidebar as a whole will be affected, otherwise every portal will have all its corners affected. Units must be specified even if this is set to 0.
|-
| --wiki-sidebar-portal-spacing
| The space between each portal in the sidebar. Units must be specified even if this is set to 0.
|-
| --wiki-content-border-width
| The thickness of the border around the content area.
|-
| --wiki-sidebar-border-width
| The thickness of the border around the sidebar portals.
|-
| --wiki-content-background-opacity
| The opacity of the main content area, to let the wiki's background image show through. Please keep this high, usually above 90%, or it can make reading text difficult.
|-
| --wiki-sidebar-background-opacity
| The background opacity of the sidebar. Usually this inherits <code>--wiki-content-background-opacity</code>.
|-
| --wiki-icon-general-filter
| A filter applied to many icons to make them visible on dark themes. Usually this is just <code>invert(100%)</code> on dark themes and blank on light themes.
|-
| --wiki-icon-to-link-filter
| A filter that converts many icons into the same color as <code>--wiki-content-link-color</code>. This can be generated by plugging that into https://mrpie5.gitlab.io/css-filter-generator/.
|}
<h3>List of all colors with contrast checking</h3>
The table below shows all the colors currently in use, as well as notes on how to use them. The last column shows which colors are expected to show up as text against other colors. With the exception of <code>--wiki-content-text-mix-color-95</code>, all text in the last column should be ''clearly'' legible. If it is not, you may need to adjust one of the referenced colors in your color palette.
Keep in mind that changes to the opacity variables in the section above will cause the content and sidebar background colors to mix with the body background color/image, so the contrasts below may not be perfectly accurate.
{| class="wikitable"
! Variable name !! Color !! style="width: 40em;" | Notes !! Test contrast against these variables
|-
| --wiki-body-background-color
| style="background-color:var(--wiki-body-background-color);" |
| The background color behind the background image. This usually only shows up if the background image doesn't load, doesn't fill the screen, or has some transparency. This color should be similar to the overall color of the background image, or the top-left corner if it is made up of many different colors. In the former case, https://matkl.github.io/average-color/ is helpful.
| style="background-color:var(--wiki-body-background-color);" |
<span style="color:var(--wiki-body-dynamic-color);">--wiki-body-dynamic-color</span><br/>
<span style="color:var(--wiki-body-dynamic-color--secondary);">--wiki-body-dynamic-color--secondary</span><br/>
|-
| --wiki-body-dynamic-color
| style="background-color:var(--wiki-body-dynamic-color);" |
| This is expected to contrast sharply with the body-background-color, for cases when text needs to be displayed against it. Usually this is {{color|#000}} on light themes and {{color|#fff}} on dark themes.
| style="background-color:var(--wiki-body-dynamic-color);" |
<span style="color:var(--wiki-body-background-color)">--wiki-body-background-color</span><br/>
<span style="color:var(--wiki-body-dynamic-color--inverted);">--wiki-body-dynamic-color--inverted</span><br/>
<span style="color:var(--wiki-body-dynamic-color--secondary--inverted);">--wiki-body-dynamic-color--secondary--inverted</span><br/>
|-
| --wiki-body-dynamic-color--inverted
| style="background-color:var(--wiki-body-dynamic-color--inverted);" |
| The inverse of <code>--wiki-body-dynamic-color</code>. This should optimally have almost no contrast with the body-background-color.
| style="background-color:var(--wiki-body-dynamic-color--inverted);" |
<span style="color:var(--wiki-body-dynamic-color);">--wiki-body-dynamic-color</span><br/>
<span style="color:var(--wiki-body-dynamic-color--secondary);">--wiki-body-dynamic-color--secondary</span><br/>
|-
| --wiki-body-dynamic-color--secondary
| style="background-color:var(--wiki-body-dynamic-color--secondary);" |
| A slightly different version of body-dynamic-color. Usually this is {{color|#333}} on light themes and {{color|#ccc}} on dark themes.
| style="background-color:var(--wiki-body-dynamic-color--secondary);" |
<span style="color:var(--wiki-body-background-color)">--wiki-body-background-color</span><br/>
<span style="color:var(--wiki-body-dynamic-color--inverted);">--wiki-body-dynamic-color--inverted</span><br/>
<span style="color:var(--wiki-body-dynamic-color--secondary--inverted);">--wiki-body-dynamic-color--secondary--inverted</span><br/>
|-
| --wiki-body-dynamic-color--secondary--inverted
| style="background-color:var(--wiki-body-dynamic-color--secondary--inverted);" |
| The inverse of <code>--wiki-body-dynamic-color--secondary</code>.
| style="background-color:var(--wiki-body-dynamic-color--secondary--inverted);" |
<span style="color:var(--wiki-body-dynamic-color);">--wiki-body-dynamic-color</span><br/>
<span style="color:var(--wiki-body-dynamic-color--secondary);">--wiki-body-dynamic-color--secondary</span><br/>
|-
| --wiki-content-background-color
| style="background-color:var(--wiki-content-background-color);" |
| The background color of the main content area.
| style="background-color:var(--wiki-content-background-color);" |
<span style="color:var(--wiki-content-text-color)">--wiki-content-text-color</span><br/>
<span style="color:var(--wiki-content-link-color)">--wiki-content-link-color</span><br/>
<span style="color:var(--wiki-content-link-color--visited)">--wiki-content-link-color--visited</span><br/>
<span style="color:var(--wiki-content-link-color--hover)">--wiki-content-link-color--hover</span><br/>
<span style="color:var(--wiki-content-redlink-color)">--wiki-content-redlink-color</span><br/>
<span style="color:var(--wiki-content-text-mix-color)">--wiki-content-text-mix-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/>
<span style="color:var(--wiki-content-heading-color)">--wiki-content-heading-color</span><br/>
<span style="color:var(--wiki-accent-color)">--wiki-accent-color</span><br/>
<span style="color:var(--wiki-neutral-color)">--wiki-neutral-color</span><br/>
<span style="color:var(--wiki-success-color)">--wiki-success-color</span><br/>
<span style="color:var(--wiki-alert-color)">--wiki-alert-color</span><br/>
|-
| --wiki-content-background-color--secondary
| style="background-color:var(--wiki-content-background-color--secondary);" |
| A secondary content background to highlight certain things. Usually this is <code>--wiki-content-background-color</code> with saturation and/or value reduced or increased by about 10%, but you're free to make it whatever you want provided the contrast checks to the right still pass.
| style="background-color:var(--wiki-content-background-color--secondary);" |
<span style="color:var(--wiki-content-text-color)">--wiki-content-text-color</span><br/>
<span style="color:var(--wiki-content-link-color)">--wiki-content-link-color</span><br/>
<span style="color:var(--wiki-content-link-color--visited)">--wiki-content-link-color--visited</span><br/>
<span style="color:var(--wiki-content-link-color--hover)">--wiki-content-link-color--hover</span><br/>
<span style="color:var(--wiki-content-redlink-color)">--wiki-content-redlink-color</span><br/>
<span style="color:var(--wiki-content-text-mix-color)">--wiki-content-text-mix-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/>
<span style="color:var(--wiki-content-heading-color)">--wiki-content-heading-color</span><br/>
<span style="color:var(--wiki-accent-color)">--wiki-accent-color</span><br/>
<span style="color:var(--wiki-neutral-color)">--wiki-neutral-color</span><br/>
<span style="color:var(--wiki-success-color)">--wiki-success-color</span><br/>
<span style="color:var(--wiki-alert-color)">--wiki-alert-color</span><br/>
|-
| --wiki-content-border-color
| style="background-color:var(--wiki-content-border-color);" |
| Border color for the main content area and elements within it.
| N/A
|-
| --wiki-content-border-color--secondary
| style="background-color:var(--wiki-content-border-color--secondary);" |
| A secondary content border color for elements that do not need to stand out as much. Usually this is <code>--wiki-content-border-color</code> with 50% transparency, but it can be adjusted or made identical if it is too subtle.
| N/A
|-
| --wiki-content-border-color--accent
| style="background-color:var(--wiki-content-border-color--accent);" |
| A border color that is used as an accent. Usually this is <code>--wiki-accent-color</code> with 50% transparency, but it can be any variation of the accent color.
| N/A
|-
| --wiki-content-text-color
| style="background-color:var(--wiki-content-text-color);" |
| Text color for the main content area.
| style="background-color:var(--wiki-content-text-color);" |
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/>
|-
| --wiki-content-link-color
| style="background-color:var(--wiki-content-link-color);" |
| Links within the content area. Please do not make this red, as red links on wikis traditionally denote pages that don't exist.
| style="background-color:var(--wiki-content-link-color);" |
<span style="color:var(--wiki-content-link-label-color);">--wiki-content-link-label-color</span>
|-
| --wiki-content-link-label-color
| style="background-color:var(--wiki-content-link-label-color);" |
| This is used when placing text on an element with the link color as a background, such as a button.
| style="background-color:var(--wiki-content-link-label-color);" |
<span style="color:var(--wiki-content-link-color);">--wiki-content-link-color</span>
|-
| --wiki-content-link-color--visited
| style="background-color:var(--wiki-content-link-color--visited);" |
| The color of visited links. This is optional, and usually inherits <code>--wiki-content-link-color</code>.
| style="background-color:var(--wiki-content-link-color--visited);" |
<span style="color:var(--wiki-content-background-color);">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary);">--wiki-content-background-color--secondary</span>
|-
| --wiki-content-link-color--hover
| style="background-color:var(--wiki-content-link-color--hover);" |
| The color links change to when hovered over. This is optional, and usually inherits <code>--wiki-content-link-color</code>.
| style="background-color:var(--wiki-content-link-color--hover);" |
<span style="color:var(--wiki-content-background-color);">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary);">--wiki-content-background-color--secondary</span>
|-
| --wiki-content-redlink-color
| style="background-color:var(--wiki-content-redlink-color);" |
| The color of links to pages that don't exist. Since these should only rarely be seen, you can be a little lax about choosing a color that contrasts with the background, but it should still be legible.
| style="background-color:var(--wiki-content-redlink-color);" |
<span style="color:var(--wiki-content-background-color);">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary);">--wiki-content-background-color--secondary</span>
|-
| --wiki-content-text-mix-color
| style="background-color:var(--wiki-content-text-mix-color);" |
| A mix of <code>--wiki-content-text-color</code> and <code>--wiki-content-background-color</code>, calculated automatically. This is generally used to mark disabled elements or placeholder text.
| style="background-color:var(--wiki-content-text-mix-color);" |
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/>
<span style="color:var(--wiki-content-text-mix-color-95)">--wiki-content-text-mix-color-95</span>
|-
| --wiki-content-text-mix-color-95
| style="background-color:var(--wiki-content-text-mix-color-95);" |
| The same as <code>--wiki-content-text-mix-color</code>, but the mix is 95% <code>--wiki-content-background-color</code>, calculated automatically. This is used to mark disabled elements. The contrast checker to the right should actually be very hard to read but not impossible.
| style="background-color:var(--wiki-content-text-mix-color-95);" |
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span>
|-
| --wiki-content-dynamic-color
| style="background-color:var(--wiki-content-dynamic-color);" |
| This is expected to contrast sharply with <code>--wiki-content-background-color</code>. Usually this is {{color|#000}} on light themes and {{color|#fff}} on dark themes.
| style="background-color:var(--wiki-content-dynamic-color);" |
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color--inverted)">--wiki-content-dynamic-color--inverted</span><br/>
<span style="color:var(--wiki-content-dynamic-color--secondary--inverted)">--wiki-content-dynamic-color--secondary--inverted</span><br/>
|-
| --wiki-content-dynamic-color--inverted
| style="background-color:var(--wiki-content-dynamic-color--inverted);" |
| The inverse of <code>--wiki-content-dynamic-color</code>.
| style="background-color:var(--wiki-content-dynamic-color--inverted);" |
<span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/>
|-
| --wiki-content-dynamic-color--secondary
| style="background-color:var(--wiki-content-dynamic-color--secondary);" |
| A slightly different version of <code>--wiki-content-dynamic-color</code>. Usually this is {{color|#333}} on light themes and {{color|#ccc}} on dark themes.
| style="background-color:var(--wiki-content-dynamic-color--secondary);" |
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color--inverted)">--wiki-content-dynamic-color--inverted</span><br/>
<span style="color:var(--wiki-content-dynamic-color--secondary--inverted)">--wiki-content-dynamic-color--secondary--inverted</span><br/>
|-
| --wiki-content-dynamic-color--secondary--inverted
| style="background-color:var(--wiki-content-dynamic-color--secondary--inverted);" |
| The inverse of <code>--wiki-content-dynamic-color--secondary</code>.
| style="background-color:var(--wiki-content-dynamic-color--secondary--inverted);" |
<span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/>
<span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/>
|-
| --wiki-content-heading-color
| style="background-color:var(--wiki-content-heading-color);" |
| The color of headings, such as the page title and section headings. Usually this is set to <code>--wiki-content-text-color</code>, but feel free to give it a different color to spice up the theme a little.
| style="background-color:var(--wiki-content-heading-color);" |
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span>
|-
| --wiki-accent-color
| style="background-color:var(--wiki-accent-color);" |
| Used to style infoboxes, navboxes, focused element outlines, and some buttons, such as the save button when editing.
| style="background-color:var(--wiki-accent-color);" |
<span style="color:var(--wiki-accent-label-color)">--wiki-accent-label-color</span><br/>
<span style="color:var(--wiki-accent-link-color)">--wiki-accent-link-color</span><br/>
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/>
|-
| --wiki-accent-color--hover
| style="background-color:var(--wiki-accent-color--hover);" |
| The color of accent-color when hovered over, in some cases. Usually this is just accent-color with saturation and/or value reduced or increased by about 10%, but you're free to make it whatever you want provided the contrast checks to the right still pass.
| style="background-color:var(--wiki-accent-color--hover);" |
<span style="color:var(--wiki-accent-label-color)">--wiki-accent-label-color</span>
|-
| --wiki-accent-label-color
| style="background-color:var(--wiki-accent-label-color);" |
| The color of normal text against the accent color.
| style="background-color:var(--wiki-accent-label-color);" |
<span style="color:var(--wiki-accent-color)">--wiki-accent-color</span><br/>
<span style="color:var(--wiki-accent-color--hover)">--wiki-accent-color--hover</span><br/>
|-
| --wiki-accent-link-color
| style="background-color:var(--wiki-accent-link-color);" |
| The color of links against the accent color.
| style="background-color:var(--wiki-accent-link-color);" |
<span style="color:var(--wiki-accent-color)">--wiki-accent-color</span>
|-
| --wiki-sidebar-background-color
| style="background-color:var(--wiki-sidebar-background-color);" |
| The background color of the sidebar to the left of the content area. Usually this inherits <code>--wiki-content-background-color</code>.
| style="background-color:var(--wiki-sidebar-background-color);" |
<span style="color:var(--wiki-sidebar-link-color)">--wiki-sidebar-link-color</span><br/>
<span style="color:var(--wiki-sidebar-heading-color)">--wiki-sidebar-heading-color</span><br/>
|-
| --wiki-sidebar-border-color
| style="background-color:var(--wiki-sidebar-border-color);" |
| The border color of the sidebar. Usually this inherits <code>--wiki-content-border-color</code>.
| N/A
|-
| --wiki-sidebar-link-color
| style="background-color:var(--wiki-sidebar-link-color);" |
| The color of links in the sidebar. Usually this inherits <code>--wiki-content-link-color</code>.
| style="background-color:var(--wiki-sidebar-link-color);" |
<span style="color:var(--wiki-sidebar-background-color)">--wiki-sidebar-background-color</span>
|-
| --wiki-sidebar-link-color--hover
| style="background-color:var(--wiki-sidebar-link-color--hover);" |
| The color links change to when hovered over. This is optional, and usually inherits <code>--wiki-content-link-color--hover</code>.
| style="background-color:var(--wiki-sidebar-link-color--hover);" |
<span style="color:var(--wiki-sidebar-background-color)">--wiki-sidebar-background-color</span>
|-
| --wiki-sidebar-heading-color
| style="background-color:var(--wiki-sidebar-heading-color);" |
| The color of headings in the sidebar. Usually this inherits <code>--wiki-content-heading-color</code>.
| style="background-color:var(--wiki-sidebar-heading-color);" |
<span style="color:var(--wiki-sidebar-background-color)">--wiki-sidebar-background-color</span>
|-
| --wiki-navigation-background-color
| style="background-color:var(--wiki-navigation-background-color);" |
| The primary background color of the navigation tabs above the content area. Usually this inherits <code>--wiki-content-background-color--secondary</code>.
| style="background-color:var(--wiki-navigation-background-color);" |
<span style="color:var(--wiki-navigation-text-color)">--wiki-navigation-text-color</span><br/>
|-
| --wiki-navigation-background-color--secondary
| style="background-color:var(--wiki-navigation-background-color--secondary);" |
| The upper background color of the navigation tabs, as well as the background color of the "More" menu dropdown. Usually this inherits <code>--wiki-content-background-color</code>.
| style="background-color:var(--wiki-navigation-background-color--secondary);" |
<span style="color:var(--wiki-navigation-text-color)">--wiki-navigation-text-color</span><br/>
|-
| --wiki-navigation-border-color
| style="background-color:var(--wiki-navigation-border-color);" |
| Border color of the navigation tabs. Usually this inherits <code>--wiki-content-border-color</code>.
| N/A
|-
| --wiki-navigation-text-color
| style="background-color:var(--wiki-navigation-text-color);" |
| The color of text in the navigation tabs. Usually this inherits <code>--wiki-content-link-color</code>.
| style="background-color:var(--wiki-navigation-text-color);" |
<span style="color:var(--wiki-navigation-background-color)">--wiki-navigation-background-color</span><br/>
<span style="color:var(--wiki-navigation-background-color--secondary)">--wiki-navigation-background-color--secondary</span><br/>
|-
| --wiki-navigation-text-color--hover
| style="background-color:var(--wiki-navigation-text-color--hover);" |
| The color of text in the navigation tabs when hovered. Usually this inherits <code>--wiki-content-link-color--hover</code>.
| style="background-color:var(--wiki-navigation-text-color--hover);" |
<span style="color:var(--wiki-navigation-background-color)">--wiki-navigation-background-color</span><br/>
<span style="color:var(--wiki-navigation-background-color--secondary)">--wiki-navigation-background-color--secondary</span><br/>
|-
| --wiki-navigation-selected-background-color
| style="background-color:var(--wiki-navigation-selected-background-color);" |
| The background color of the currently active navigation tab. Usually this inherits <code>--wiki-content-background-color</code>
| style="background-color:var(--wiki-navigation-selected-background-color);" |
<span style="color:var(--wiki-navigation-selected-text-color)">--wiki-navigation-selected-text-color</span><br/>
|-
| --wiki-navigation-selected-border-color
| style="background-color:var(--wiki-navigation-selected-border-color);" |
| The border color of the currently active navigation tab. Usually this inherits <code>--wiki-navigation-border-color</code>
| N/A
|-
| --wiki-navigation-selected-text-color
| style="background-color:var(--wiki-navigation-selected-text-color);" |
| The text color of the currently active navigation tab. Usually this inherits <code>--wiki-content-text-color</code>
| style="background-color:var(--wiki-navigation-selected-text-color);" |
<span style="color:var(--wiki-navigation-selected-background-color)">--wiki-navigation-selected-background-color</span><br/>
|-
| --wiki-neutral-color
| style="background-color:var(--wiki-neutral-color);" |
| A gray-ish color for displaying neutral text, such as a diff size of 0 in RecentChanges and page history. Usually this inherits <code>--wiki-content-text-mix-color</code>, but can be set explicitly if that color is not gray enough.
| style="background-color:var(--wiki-neutral-color);" |
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span>
|-
| --wiki-alert-color
| style="background-color:var(--wiki-alert-color);" |
| A general, usually red-ish color used for negative notices, most notably negative diffs in RecentChanges and page history, and the "cancel" button when editing.
| style="background-color:var(--wiki-alert-color);" |
<span style="color:var(--wiki-alert-label-color)">--wiki-alert-label-color</span><br/>
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/>
|-
| --wiki-alert-label-color
| style="background-color:var(--wiki-alert-label-color);" |
| The color of text against <code>--wiki-alert-color</code> as a background.
| style="background-color:var(--wiki-alert-label-color);" |
<span style="color:var(--wiki-alert-color)">--wiki-alert-color</span><br/>
|-
| --wiki-warning-color
| style="background-color:var(--wiki-warning-color);" |
| A general, usually orange-ish color used for warning notices.
| style="background-color:var(--wiki-warning-color);" |
<span style="color:var(--wiki-warning-label-color)">--wiki-warning-label-color</span><br/>
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
|-
| --wiki-warning-label-color
| style="background-color:var(--wiki-warning-label-color);" |
| The color of text against <code>--wiki-warning-color</code> as a background.
| style="background-color:var(--wiki-warning-label-color);" |
<span style="color:var(--wiki-warning-color)">--wiki-warning-color</span><br/>
|-
| --wiki-success-color
| style="background-color:var(--wiki-success-color);" |
| A general, usually green-ish color used for success notices, most noticeably positive diffs in RecentChanges and page history.
| style="background-color:var(--wiki-success-color);" |
<span style="color:var(--wiki-success-label-color)">--wiki-success-label-color</span><br/>
<span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/>
<span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/>
|-
| --wiki-success-label-color
| style="background-color:var(--wiki-success-label-color);" |
| The color of text against <code>--wiki-success-color</code> as a background.
| style="background-color:var(--wiki-success-label-color);" |
<span style="color:var(--wiki-success-color)">--wiki-success-color</span><br/>
|}
<h2>Stylesheet</h2>
<!-- When rendered on common.css, the actual stylesheet will be right here -->
</div>
46bda3c0aabbc7ea35b816706b99b474a2dc06df
MediaWiki:DataMaps.css
8
247
271
2025-08-20T01:25:04Z
ARTIFICER
564804
Importing default loadout
css
text/css
/** Container */
.ext-datamaps-container-content .ext-datamaps-container-leaflet {
background: var(--wiki-content-background-color--secondary);
}
/** Legend */
.ext-datamaps-container .ext-datamaps-control-expandable[aria-expanded="true"] {
background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 95%, transparent);
}
.ext-datamaps-container .oo-ui-tabOptionWidget {
color: var(--wiki-content-link-color);
}
.ext-datamaps-container .oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected {
background: var(--wiki-content-link-color);
box-shadow: none;
color: var(--wiki-content-link-label-color);
}
/** Popups */
.ext-datamaps-container .leaflet-popup-content-wrapper,
.ext-datamaps-container .leaflet-popup-tip {
background: var(--wiki-content-background-color--secondary);
color: var(--wiki-content-text-color);
}
.ext-datamaps-container .ext-datamaps-popup-buttons a,
.ext-datamaps-container .leaflet-popup-close-button {
filter: var(--wiki-icon-general-filter);
cursor: pointer;
}
.ext-datamaps-popup-header .ext-datamaps-popup-subtitle, .ext-datamaps-popup-header .ext-datamaps-popup-location {
color: var(--wiki-content-text-mix-color);
}
.ext-datamaps-popup .ext-datamaps-popup-tools li a {
border: 1px solid var(--wiki-content-link-color);
transition: background 100ms, color 100ms;
}
.ext-datamaps-popup .ext-datamaps-popup-tools li a:hover {
background: var(--wiki-content-link-color);
color: var(--wiki-content-link-label-color);
}
/** Controls */
.ext-datamaps-container .leaflet-bar {
background-color: var(--wiki-content-background-color--secondary);
border-color: color-mix(in srgb, var(--wiki-content-link-color) 50%, transparent);
}
.ext-datamaps-container .leaflet-bar button:hover {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 25%, transparent);
}
.ext-datamaps-container .leaflet-control {
color: var(--wiki-content-text-color);
}
.leaflet-control-container .oo-ui-buttonElement > .oo-ui-buttonElement-button {
min-height: unset;
}
.ext-datamaps-container .leaflet-control button {
border-bottom-color: color-mix(in srgb, var(--wiki-content-link-color) 50%, transparent);
color: var(--wiki-content-text-color);
}
/* HACK: awful selector, v1.0 will prolly use a standard class on these */
.ext-datamaps-container .ext-datamaps-control span[class^="oo-ui-icon"] {
filter: var(--wiki-icon-general-filter);
}
/** Search */
.ext-datamaps-container .ext-datamaps-control-search ul.ext-datamaps-control-search-results {
background: var(--wiki-content-background-color--secondary);
}
.ext-datamaps-container .ext-datamaps-control-search ul.ext-datamaps-control-search-results li:focus,
.ext-datamaps-container .ext-datamaps-control-search ul.ext-datamaps-control-search-results li[data-highlighted="true"] {
background: color-mix(in srgb, var(--wiki-content-link-color) 15%, transparent);
color: var(--wiki-content-link-color);
}
.ext-datamaps-container .ext-datamaps-container-status > :not(.oo-ui-widget) {
background:var(--wiki-content-background-color--secondary);
color:var(--wiki-content-text-mix-color);
}
.ext-datamaps-container .leaflet-control-container .ext-datamaps-control-coords {
background: var(--background-color-neutral-subtle);
color: var(--color-base--subtle);
}
f3ef9024b4b537b9fa9bceff82bbbeaf0feb7f7a
MediaWiki:Gadgets/mpEditLinks/main.js
8
248
272
2025-08-20T01:25:05Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
$.when( $.ready )
.then(function(){
if(!document.getElementById('mp-container')) return;
var rootpage = document.getElementById('mp-container').dataset['rootpage']; // Get the rootpage passed from the main page module, so we don't need to make an API call
/* generate the links here instead of in the wikitext, so that users who can't see them don't have them
* in the DOM at all, and screenreaders and search engines don't get confused */
function createLinks(){
$('.mp-box').each(function(_, el){
var params = '?action=edit';
// only add the long preload stuff if the box doesn't exist, for prettier urls
if ( $(el).hasClass('missing') ){
params += '&preload=Template:Main page box/preload&preloadparams[0]=' + el.dataset['boxId'].charAt(0).toUpperCase() + el.dataset['boxId'].slice(1); /* preloadparam is box id with first letter capitalized */
}
$('<a></a>', {href: mw.util.getUrl(rootpage + '/' + el.dataset['boxId']) + params})
.msg('gadget-mpEditLinks-edit-link-text', rootpage + '/' + el.dataset['boxId'])
.appendTo(
$('<div></div>', {
class: 'mp-edit-link'
}).prependTo(el)
);
});
}
function toggleLinks(){
$('.mp-edit-link').each(function(_, el){
$(el).toggle().css('display none;');
});
}
$('<span></span>', {
text: mw.msg('gadget-mpEditLinks-toggle-link-text'),
class: 'mp-edit-toggle',
on: {click: toggleLinks},
}).appendTo($('#top'));
createLinks();
});
6174d3c34c950700a1700ea0707b008195b25ce1
MediaWiki:Gadgets/mpEditLinks/main.css
8
249
273
2025-08-20T01:25:06Z
ARTIFICER
564804
Importing default loadout
css
text/css
.mp-edit-link {
display:block;
position:absolute;
z-index:99;
right:0.5em;
top:0.5em;
background:var(--wiki-content-background-color);
}
.mp-edit-link a {
display:block;
padding:0.1em;
border:1px solid var(--wiki-content-link-color);
}
.mp-edit-link a::before {
display:inline-block;
content:'';
background-image:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3E edit %3C/title%3E%3Cpath d=%22m16.77 8 1.94-2a1 1 0 0 0 0-1.41l-3.34-3.3a1 1 0 0 0-1.41 0L12 3.23zM1 14.25V19h4.75l9.96-9.96-4.75-4.75z%22/%3E%3C/svg%3E");
background-size:contain;
width:1em;
height:1em;
filter:var(--wiki-icon-to-link-filter);
vertical-align:text-top;
margin-right:0.2em;
}
c5fd62c547dd14df99d3f223cdca962743d492d1
MediaWiki:Gadgets/ranger/main.css
8
250
274
2025-08-20T01:25:06Z
ARTIFICER
564804
Importing default loadout
css
text/css
/** as of Module:navbox version 1.2.4 **/
.ranger-navbox{
border-color: var(--navbox-outer-border-color);
border-style: var(--navbox-outer-border-style);
border-width: var(--navbox-outer-border-width);
border-radius: var(--navbox-outer-border-radius);
padding: var(--navbox-padding);
font-size: var(--navbox-font-size);
margin: var(--navbox-margin);
background: var(--navbox-background);
line-height: 1.5;
clear:both;
}
.ranger-navbox * {
border: 0;
}
.ranger-navbox .center *{
margin-left: unset;
margin-right: unset;
}
.ranger-navbox,
.ranger-navbox .ranger-section,
.ranger-navbox .ranger-listbox{
display: flex;
flex-direction: column;
gap: var(--navbox-gap);
}
.ranger-navbox .ranger-title,
.ranger-navbox .ranger-header{
text-align: center;
min-height: 1.5em;
position: relative;
z-index: 0;
font-weight: bold;
}
.ranger-navbox .ranger-title{
color: var(--navbox-title-color);
background: var(--navbox-title-background);
font-size: var(--navbox-title-font-size);
padding: var(--navbox-title-padding--y) calc(1.5em + var(--navbox-icon-offset--x)); /* left and right padding equal to the size and position of the edit/collapse buttons */
}
.ranger-navbox .ranger-title a,
.ranger-navbox .ranger-title a:visited,
.ranger-navbox .ranger-title a:hover,
.ranger-navbox .ranger-title a.external,
.ranger-navbox .ranger-title a.external:visited,
.ranger-navbox .ranger-title a.external:hover {
text-decoration: var(--navbox-title-link-decoration);
}
.ranger-navbox .ranger-title a.new,
.ranger-navbox .ranger-title a.new:visited {
text-decoration: var(--navbox-title-redlink-decoration);
}
.ranger-navbox .ranger-title a,
.ranger-navbox .ranger-title a.external,
.ranger-navbox .ranger-title a.external:visited {
color: var(--navbox-title-link-color);
}
.ranger-navbox .ranger-title a:visited{
color: var(--navbox-title-link-color--visited);
}
.ranger-navbox .ranger-title a.new,
.ranger-navbox .ranger-title a.new:visited{
color:var(--navbox-title-redlink-color);
}
.ranger-navbox .ranger-title a:hover,
.ranger-navbox .ranger-title a:visited:hover,
.ranger-navbox .ranger-title a.external:hover,
.ranger-navbox .ranger-title a.external:visited:hover {
color:var(--navbox-title-link-color--hover);
}
.ranger-navbox .ranger-header{
color: var(--navbox-header-color);
background: var(--navbox-header-background);
font-size: var(--navbox-header-font-size);
padding: var(--navbox-header-padding--y) calc(1.5em + var(--navbox-icon-offset--x)); /* left and right padding equal to the size and position of the edit/collapse buttons */
}
.ranger-navbox .ranger-sublist .ranger-header{
font-size: var(--navbox-subheader-font-size);
padding: var(--navbox-subheader-padding--y) calc(1.5em + var(--navbox-icon-offset--x)); /* left and right padding equal to the size and position of the edit/collapse buttons */
}
.ranger-navbox .ranger-header a,
.ranger-navbox .ranger-header a:visited,
.ranger-navbox .ranger-header a:hover,
.ranger-navbox .ranger-header a.external,
.ranger-navbox .ranger-header a.external:visited,
.ranger-navbox .ranger-header a.external:hover {
text-decoration: var(--navbox-header-link-decoration);
}
.ranger-navbox .ranger-header a.new,
.ranger-navbox .ranger-header a.new:visited {
text-decoration: var(--navbox-header-redlink-decoration);
}
.ranger-navbox .ranger-header a,
.ranger-navbox .ranger-header a.external,
.ranger-navbox .ranger-header a.external:visited {
color: var(--navbox-header-link-color);
}
.ranger-navbox .ranger-header a:visited{
color: var(--navbox-header-link-color--visited);
}
.ranger-navbox .ranger-header a.new,
.ranger-navbox .ranger-header a.new:visited{
color:var(--navbox-header-redlink-color);
}
.ranger-navbox .ranger-header a:hover,
.ranger-navbox .ranger-header a:visited:hover,
.ranger-navbox .ranger-header a.external:hover,
.ranger-navbox .ranger-header a.external:visited:hover {
color:var(--navbox-header-link-color--hover);
}
.ranger-navbox .ranger-meta{
font-size: var(--navbox-title-font-size);
position: absolute;
left: var(--navbox-icon-offset--x);
top: calc(var(--navbox-title-padding--y) + 0.08em); /* 0.08em: vertial offset tweak based on the icon graph */
display: block;
}
.ranger-navbox .ranger-meta .nv{
--mask: var(--icon-metalinks);
display: block;
width: 0.84em; /* based on the icon graph */
height: 0.84em;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: center center;
mask-position: center center;
background-color: var(--navbox-title-icon-color);
}
.ranger-navbox .ranger-meta .nv > a{
display: block;
width: 100%;
height: 100%;
opacity: 0;
}
.ranger-navbox .ranger-meta .nv > a > span{
display: block;
width: 100%;
height: 100%;
overflow: hidden;
}
.ranger-navbox .ranger-meta:has(.mw-selflink){
display: none;
}
.ranger-navbox,
.ranger-navbox .ranger-section{
position: relative;
}
.ranger .mw-collapsible-toggle-placeholder{
display: none;
}
.ranger-navbox .ranger-title > .ranger-title-text,
.ranger-navbox .ranger-header > .ranger-header-text{
pointer-events: none;
}
.ranger-navbox .ranger-title > .ranger-title-text a,
.ranger-navbox .ranger-header > .ranger-header-text a{
pointer-events: auto;
}
.ranger-navbox .ranger-title > .mw-collapsible-toggle,
.ranger-navbox .ranger-header > .mw-collapsible-toggle{
--mask: var(--icon-chevron-down);
position: absolute;
right: 0;
top: 0;
z-index: -1;
display: block;
width: 100%;
height: 100%;
overflow:hidden;
}
.ranger-navbox.small-collapsible-toggle-click-area .ranger-title > .mw-collapsible-toggle,
.ranger-navbox.small-collapsible-toggle-click-area .ranger-header > .mw-collapsible-toggle{
width: 1.5em;
height: 1.5em;
right: var(--navbox-icon-offset--x);
}
.ranger-navbox.small-collapsible-toggle-click-area .ranger-title > .mw-collapsible-toggle{
top: var(--navbox-title-padding--y);
}
.ranger-navbox.small-collapsible-toggle-click-area .ranger-header > .mw-collapsible-toggle{
top: var(--navbox-header-padding--y);
}
.ranger-navbox.small-collapsible-toggle-click-area .ranger-sublist .ranger-header > .mw-collapsible-toggle{
top: var(--navbox-subheader-padding--y);
}
.ranger-navbox .ranger-title > .mw-collapsible-toggle::before,
.ranger-navbox .ranger-header > .mw-collapsible-toggle::before{
content: "";
display: block;
width: 1.5em;
height: 1.5em;
position: absolute;
right: var(--navbox-icon-offset--x);
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: center center;
mask-position: center center;
background-color: var(--navbox-title-icon-color);
transform: scaleY(-1);
}
.ranger-navbox .ranger-title > .mw-collapsible-toggle::before{
top: var(--navbox-title-padding--y);
}
.ranger-navbox .ranger-header > .mw-collapsible-toggle::before{
top: var(--navbox-header-padding--y);
}
.ranger-navbox .ranger-sublist .ranger-header > .mw-collapsible-toggle::before{
top: var(--navbox-subheader-padding--y);
}
.ranger-navbox.small-collapsible-toggle-click-area .ranger-title > .mw-collapsible-toggle::before,
.ranger-navbox.small-collapsible-toggle-click-area .ranger-header > .mw-collapsible-toggle::before{
top: 0;
right: 0;
}
.ranger-navbox .ranger-header > .mw-collapsible-toggle::before{
background-color: var(--navbox-header-icon-color);
}
.ranger-navbox .ranger-title > .mw-collapsible-toggle.mw-collapsible-toggle-collapsed::before,
.ranger-navbox .ranger-header > .mw-collapsible-toggle.mw-collapsible-toggle-collapsed::before{
transform: none;
}
.ranger-navbox .ranger-title > .mw-collapsible-toggle *,
.ranger-navbox .ranger-title > .mw-collapsible-toggle::after,
.ranger-navbox .ranger-header > .mw-collapsible-toggle *,
.ranger-navbox .ranger-header > .mw-collapsible-toggle::after{
display: none;
}
.ranger-navbox .ranger-list{
width: unset;
padding: var(--navbox-list-padding);
}
.ranger-navbox .ranger-above{
background: var(--navbox-above-background);
color: var(--navbox-above-color);
padding: var(--navbox-above-padding);
width: unset;
}
.ranger-navbox .ranger-below{
background: var(--navbox-below-background);
color: var(--navbox-below-color);
padding: var(--navbox-below-padding);
width: unset;
}
.ranger-navbox .ranger-sublist{
display: flex;
flex-direction: column;
gap: var(--navbox-gap);
}
.ranger-navbox .ranger-section-body{
display: grid;
gap: var(--navbox-gap);
grid-template-columns: auto minmax(0,1fr);
}
/* gap fix for collapsed content */
.ranger-navbox [class^="ranger-"][hidden="until-found"]{
margin-top: calc(0px - var(--navbox-gap)) !important;
}
.ranger-navbox .ranger-row{
display: contents;
}
.ranger-navbox .ranger-group,
.ranger-navbox .ranger-subgroup{
text-align: var(--navbox-group-text-align);
font-weight: bold;
background: var(--navbox-group-background);
color: var(--navbox-group-color);
padding: var(--navbox-group-padding);
width: unset;
}
/* for desktop view */
.ranger-navbox.group-align-left .ranger-group,
.ranger-navbox.group-align-left .ranger-subgroup{
--navbox-group-text-align: left;
}
.ranger-navbox.group-align-center .ranger-group,
.ranger-navbox.group-align-center .ranger-subgroup{
--navbox-group-text-align: center;
}
.ranger-navbox.group-align-right .ranger-group,
.ranger-navbox.group-align-right .ranger-subgroup{
--navbox-group-text-align: right;
}
/* for mobile view */
.ranger-navbox.mobile-group-align-left .ranger-group,
.ranger-navbox.mobile-group-align-left .ranger-subgroup{
--navbox-group-text-align--mobile: left;
}
.ranger-navbox.mobile-group-align-center .ranger-group,
.ranger-navbox.mobile-group-align-center .ranger-subgroup{
--navbox-group-text-align--mobile: center;
}
.ranger-navbox.mobile-group-align-right .ranger-group,
.ranger-navbox.mobile-group-align-right .ranger-subgroup{
--navbox-group-text-align--mobile: right;
}
/* for desktop view */
.ranger-navbox.list-align-left .ranger-listbox{
--navbox-list-text-align: left;
}
.ranger-navbox.list-align-center .ranger-listbox{
--navbox-list-text-align: center;
}
.ranger-navbox.list-align-right .ranger-listbox{
--navbox-list-text-align: right;
}
/* for mobile view */
.ranger-navbox.mobile-list-align-left .ranger-listbox{
--navbox-list-text-align--mobile: left;
}
.ranger-navbox.mobile-list-align-center .ranger-listbox{
--navbox-list-text-align--mobile: center;
}
.ranger-navbox.mobile-list-align-right .ranger-listbox{
--navbox-list-text-align--mobile: right;
}
.ranger-navbox .ranger-listbox > .ranger-wrap{
text-align: var(--navbox-list-text-align);
background: var(--navbox-list-background);
color: var(--navbox-list-color);
flex-grow: 1;
}
.ranger-navbox .ranger-sublist{
flex-grow: var(--count);
}
.ranger-navbox .ranger-listbox:first-child{ /* A list-n without group-n */
grid-column-end: span 2;
}
.ranger-navbox .ranger-group,
.ranger-navbox .ranger-subgroup,
.ranger-navbox .ranger-listbox > .ranger-wrap{
display: grid;
justify-items: stretch;
align-items: center;
}
.ranger-navbox.striped-even .ranger-even,
.ranger-navbox.striped-odd .ranger-odd{
background: var(--navbox-list-background--striped);
}
/* make links use full line height (larger click box)*/
.ranger-navbox .hlist a{
display: inline-block;
}
.ranger-navbox .align-left,
.ranger-navbox .alignleft{
text-align: left;
}
.ranger-navbox .align-center,
.ranger-navbox .aligncenter{
text-align: center;
}
.ranger-navbox .align-right,
.ranger-navbox .alignright{
text-align: right;
}
/* responsive */
@media screen and (max-width: 720px) {
.ranger-navbox .ranger-section-body,
.ranger-navbox .ranger-sublist {
display: flex;
flex-flow: column;
}
.ranger-navbox .ranger-row{
display: block;
}
.ranger-navbox .ranger-group + .ranger-listbox > .ranger-sublist:first-child,
.ranger-navbox .ranger-subgroup + .ranger-listbox > .ranger-sublist:first-child{
margin-top: var(--navbox-gap);
}
.ranger-navbox .ranger-listbox.empty{
display: none;
}
.ranger-navbox .ranger-group,
.ranger-navbox .ranger-subgroup{
text-align: var(--navbox-group-text-align--mobile, left);
max-width: unset !important;
}
.ranger-navbox .ranger-group > *,
.ranger-navbox .ranger-subgroup > *{
max-width: unset !important;
}
.ranger-navbox .ranger-sublist {
padding-left: var(--navbox-tree-indent);
margin-left: var(--navbox-tree-line-indent);
}
.ranger-navbox .ranger-subgroup,
.ranger-navbox .ranger-listbox {
position:relative;
}
.ranger-navbox .ranger-group br,
.ranger-navbox .ranger-subgroup br{
display: none;
}
.ranger-navbox .ranger-listbox > .ranger-wrap{
text-align: var(--navbox-list-text-align--mobile, left);
}
.ranger-navbox .ranger-sublist > .ranger-section > .ranger-header{
margin-left: calc( 0px - var(--navbox-tree-indent) - var(--navbox-tree-line-indent));
}
.ranger-navbox .ranger-sublist .ranger-row > ::before{
position: absolute;
left: calc(0px - var(--navbox-tree-indent));
top: 0;
width: var(--navbox-tree-line-width);
height: 100%;
content: '';
display: block;
background-color: var(--navbox-tree-line-color);
}
.ranger-navbox .ranger-sublist .ranger-row > .ranger-listbox::before,
.ranger-navbox .ranger-row.empty-list > .ranger-subgroup::before{
height: calc(100% + var(--navbox-gap));
}
.ranger-navbox .ranger-sublist .ranger-row:last-child > ::before {
display: none;
}
.ranger-navbox .ranger-sublist .ranger-row:last-child > :first-child::before {
display: block;
height: calc(50% + var(--navbox-tree-line-width)/2);
}
.ranger-navbox .ranger-subgroup::after,
.ranger-navbox .ranger-row .ranger-row.empty-group > .ranger-listbox > .ranger-wrap::after{
position: absolute;
left: calc(0px - var(--navbox-tree-indent) + var(--navbox-tree-line-width));
width: calc(var(--navbox-tree-indent) - var(--navbox-tree-line-spacing) - var(--navbox-tree-line-width));
height: var(--navbox-tree-line-width);
content: '';
background-color: var(--navbox-tree-line-color);
}
/* increase height for links */
.ranger-navbox .hlist{
line-height: 2;
}
}
/**** `.pill` class: the "pill" style ****/
/* remove middle dots betweem items */
.ranger-navbox.pill .hlist dd:not(:last-child)::after,
.ranger-navbox.pill .hlist li:not(:last-child)::after{
display: none;
}
/* remove parentheses around nested lists*/
.ranger-navbox.pill .hlist dd ol::before,
.ranger-navbox.pill .hlist dd ul::before,
.ranger-navbox.pill .hlist dd dl::before,
.ranger-navbox.pill .hlist dt ol::before,
.ranger-navbox.pill .hlist dt ul::before,
.ranger-navbox.pill .hlist dt dl::before,
.ranger-navbox.pill .hlist li ol::before,
.ranger-navbox.pill .hlist li ul::before,
.ranger-navbox.pill .hlist li dl::before,
.ranger-navbox.pill .hlist dd ol::after,
.ranger-navbox.pill .hlist dd ul::after,
.ranger-navbox.pill .hlist dd dl::after,
.ranger-navbox.pill .hlist dt ol::after,
.ranger-navbox.pill .hlist dt ul::after,
.ranger-navbox.pill .hlist dt dl::after,
.ranger-navbox.pill .hlist li ol::after,
.ranger-navbox.pill .hlist li ul::after,
.ranger-navbox.pill .hlist li dl::after {
display: none;
}
/* make lists inline-flex */
.ranger-navbox.pill .hlist ul,
.ranger-navbox.pill .hlist ol,
.ranger-navbox.pill .hlist dl{
display: inline-flex;
gap: var(--navbox-pill-gap);
flex-wrap: wrap;
}
/* "pill" style for items */
.ranger-navbox.pill .hlist li,
.ranger-navbox.pill .hlist dt,
.ranger-navbox.pill .hlist dd{
padding: var(--navbox-pill-padding);
border-radius: var(--navbox-pill-border-radius);
box-shadow: var(--navbox-pill-box-shadow);
background: var(--navbox-pill-background);
/* 100% height */
display: flex;
align-items: center;
/* for nested lists */
gap: var(--navbox-pill-gap);
flex-wrap: wrap;
}
/* Add a hover / focus feedback style */
.ranger-navbox.pill .hlist dd:hover,
.ranger-navbox.pill .hlist dd:focus,
.ranger-navbox.pill .hlist dt:hover,
.ranger-navbox.pill .hlist dt:focus,
.ranger-navbox.pill .hlist li:hover,
.ranger-navbox.pill .hlist li:focus {
box-shadow: var(--navbox-pill-box-shadow--hover);
background: var(--navbox-pill-background--hover);
}
/* pill with selflink
*
* Only select the deepest level for nested lists.
* We have to use :has() to pick pills with selflink and
* all browsers which support :has() should also support :is() and :not(),
* therefore we can use :is() and :not() here safely.
*/
.ranger-navbox.pill .hlist .ranger-list :is(li,dt,dd):has(.mw-selflink):not(:has(li, dt, dd)){
background: var(--navbox-pill-selflink-background);
}
/**** `.pill-mobile` class: only apply the "pill" style on mobile ****/
@media screen and (max-width: 720px) {
/* remove middle dots betweem items */
.ranger-navbox.pill-mobile .hlist dd:not(:last-child)::after,
.ranger-navbox.pill-mobile .hlist li:not(:last-child)::after{
display: none;
}
/* remove parentheses around nested lists*/
.ranger-navbox.pill-mobile .hlist dd ol::before,
.ranger-navbox.pill-mobile .hlist dd ul::before,
.ranger-navbox.pill-mobile .hlist dd dl::before,
.ranger-navbox.pill-mobile .hlist dt ol::before,
.ranger-navbox.pill-mobile .hlist dt ul::before,
.ranger-navbox.pill-mobile .hlist dt dl::before,
.ranger-navbox.pill-mobile .hlist li ol::before,
.ranger-navbox.pill-mobile .hlist li ul::before,
.ranger-navbox.pill-mobile .hlist li dl::before,
.ranger-navbox.pill-mobile .hlist dd ol::after,
.ranger-navbox.pill-mobile .hlist dd ul::after,
.ranger-navbox.pill-mobile .hlist dd dl::after,
.ranger-navbox.pill-mobile .hlist dt ol::after,
.ranger-navbox.pill-mobile .hlist dt ul::after,
.ranger-navbox.pill-mobile .hlist dt dl::after,
.ranger-navbox.pill-mobile .hlist li ol::after,
.ranger-navbox.pill-mobile .hlist li ul::after,
.ranger-navbox.pill-mobile .hlist li dl::after {
display: none;
}
/* make lists inline-flex */
.ranger-navbox.pill-mobile .hlist ul,
.ranger-navbox.pill-mobile .hlist ol,
.ranger-navbox.pill-mobile .hlist dl{
display: inline-flex;
gap: var(--navbox-pill-gap);
flex-wrap: wrap;
}
/* "pill" style for items */
.ranger-navbox.pill-mobile .hlist li,
.ranger-navbox.pill-mobile .hlist dt,
.ranger-navbox.pill-mobile .hlist dd{
/* 100% height */
display: flex;
align-items: center;
/* for nested lists */
gap: var(--navbox-pill-gap);
flex-wrap: wrap;
}
/* "pill" style for items */
.ranger-navbox.pill-mobile .hlist li,
.ranger-navbox.pill-mobile .hlist dt,
.ranger-navbox.pill-mobile .hlist dd{
padding: var(--navbox-pill-padding);
border-radius: var(--navbox-pill-border-radius);
box-shadow: var(--navbox-pill-box-shadow);
background: var(--navbox-pill-background);
/* 100% height */
display: flex;
align-items: center;
/* for nested lists */
gap: var(--navbox-pill-gap);
flex-wrap: wrap;
}
/* Add a hover / focus feedback style */
.ranger-navbox.pill-mobile .hlist dd:hover,
.ranger-navbox.pill-mobile .hlist dd:focus,
.ranger-navbox.pill-mobile .hlist dt:hover,
.ranger-navbox.pill-mobile .hlist dt:focus,
.ranger-navbox.pill-mobile .hlist li:hover,
.ranger-navbox.pill-mobile .hlist li:focus {
box-shadow: var(--navbox-pill-box-shadow--hover);
background: var(--navbox-pill-background--hover);
}
/* pill with selflink
*
* Only select the deepest level for nested lists.
* We have to use :has() to pick pills with selflink and
* all browsers which support :has() should also support :is() and :not(),
* therefore we can use :is() and :not() here safely.
*/
.ranger-navbox.pill-mobile .hlist .ranger-list :is(li,dt,dd):has(.mw-selflink):not(:has(li, dt, dd)){
background: var(--navbox-pill-selflink-background);
}
}
/*********************
* End Template:Navbox*
**********************/
fe54cb7ce715e835bcc0c972d76364cbc18f5bc6
MediaWiki:Gadgets/ranger
8
251
275
2025-08-20T01:25:07Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": false,
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [
"Pages with navboxes"
],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"variables.css",
"main.css",
"custom.css"
],
"dependencies": [],
"type": "styles"
}
}
0e59fa9520b52214b9fedaecae9f41d86afd197f
MediaWiki:Gadgets/druid
8
252
276
2025-08-20T01:25:08Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"package": false,
"section": "",
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [
"Pages with DRUID infoboxes"
],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"variablesEditMe.css",
"mainReadonly.css",
"customEditMe.css"
],
"dependencies": [],
"type": "styles"
}
}
5c21b27bf41aba17b090e0d888010c308bd5d0bb
MediaWiki:Gadgets/druid/mainReadonly.css
8
253
277
2025-08-20T01:25:08Z
ARTIFICER
564804
Importing default loadout
css
text/css
/* --------------------------------------------- */
/* Do not edit this file please */
/* You can edit variablesEditMe and customEditMe */
/* --------------------------------------------- */
.druid-container {
border: 4px solid var(--druid-border-color);
border-radius: 3px;
background: var(--druid-background-color);
float: right;
clear: right;
margin: 0 0 1em 1em;
width:100%;
max-width:22em;
box-sizing: border-box;
border-collapse: collapse;
}
@media screen and (max-width: 720px) {
.druid-container {
float: none;
margin: 0.5rem auto;
}
}
.druid-main-images-file,
.druid-main-image {
text-align:center;
}
.druid-infobox .druid-title,
.druid-infobox .druid-section {
background:var(--druid-secondary-background-color); /* fallback */
background:color-mix(in srgb, var(--druid-secondary-background-color) 75%, transparent);
color:var(--druid-secondary-background-label-color);
text-align:center;
font-size:1.5em;
padding:1px;
}
.druid-infobox .druid-section {
font-size: 1.25em;
font-weight: 500;
}
.druid-infobox .druid-collapsible .druid-section {
flex-grow: 1;
}
.druid-label {
font-weight:bold;
text-align: right;
box-sizing: border-box;
}
.druid-row > .druid-label {
width: 48%;
flex-shrink: 0;
}
.druid-row > .druid-label,
.druid-row > .druid-data {
padding-inline: 0.3em;
}
.druid-main-image,
.druid-main-images {
padding:5px;
}
.druid-main-image img,
.druid-main-images img {
max-width:100%;
height:auto;
}
.druid-main-images-labels {
display:flex;
flex-direction:row;
flex-wrap:wrap;
justify-content: space-evenly;
margin:0.25em;
gap:0.25em;
}
.druid-main-images-label {
cursor:pointer;
flex:1 1 auto;
text-align:center;
transition:.1s ease-in;
outline:1px solid var(--druid-link-color);
}
.druid-main-images-label.focused {
background:var(--druid-link-color);
color:var(--druid-link-label-color);
}
.druid-main-images-label:not(.focused):hover {
background:var(--druid-link-color); /* fallback */
background:color-mix(in srgb, var(--druid-link-color) 25%, transparent);
}
.druid-toggleable-data:not(.focused),
.druid-main-images-file:not(.focused),
.druid-toggleable-heading:not(.focused),
.druid-row:not(:has(.druid-grid)):has(.druid-toggleable-data-empty.focused),
.druid-grid-item:has(.druid-toggleable-data-empty.focused),
.druid-section:has(.druid-toggleable-heading-empty.focused),
.druid-section-container:has(.druid-toggleable-data-empty.focused):not(:has(.druid-toggleable-data-nonempty.focused)):not(:has(.druid-data-nonempty)) {
display:none;
}
.druid-grid {
display:grid;
gap: 0.3em;
padding: 0.35em;
}
.druid-grid-item {
background:var(--druid-tertiary-background-color);
padding:0.25em;
border:1px solid var(--druid-border-color); /* fallback */
border:1px solid color-mix(in srgb, var(--druid-border-color) 50%, transparent);
border-radius: 2px;
}
.druid-grid-item .druid-label,
.druid-grid-item .druid-data {
text-align: center;
}
.druid-data-wide {
width:100%;
}
.druid-section-container > .druid-collapsible {
display: flex;
justify-content: space-between;
align-items: center;
}
.druid-collapsed {
display:none !important;
}
.druid-collapsible {
cursor:pointer;
position:relative;
}
.druid-collapsible::after {
content: "";
display: block;
position: absolute;
right: 10px;
width: 20px;
height: 20px;
--mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3E collapse %3C/title%3E%3Cpath d='M1 13.75l1.5 1.5 7.5-7.5 7.5 7.5 1.5-1.5-9-9-9 9z'/%3E%3C/svg%3E") no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: center center;
mask-position: center center;
background-color: var(--druid-secondary-background-label-color);
}
.druid-collapsible-collapsed::after {
transform: rotate(180deg);
}
/*****************************************
Div support
*****************************************/
div.druid-row {
display:flex;
margin-block: 1px;
}
div.druid-row + div.druid-row {
margin-top: 0;
}
div.druid-row > .druid-label {
background: var(--druid-tertiary-background-color);
}
.druid-infobox .druid-title {
font-weight: 700;
}
.druid-infobox #toc {
display:none;
}
/********
Custom display classes
*********/
div.druid-stacked.druid-row,
.druid-stacked div.druid-row {
flex-direction: column;
}
.druid-stacked.druid-row > .druid-label,
.druid-stacked .druid-row > .druid-label {
text-align: left;
width: 100%;
flex-basis:unset;
}
.druid-stacked.druid-row > .druid-data,
.druid-stacked .druid-row > .druid-data {
padding-left: .75em;
}
/* --------------------------------------------- */
/* Do not edit this file please */
/* You can edit variablesEditMe and customEditMe */
/* --------------------------------------------- */
b012f61bd994e50b85508138467794f6a296ed2d
MediaWiki:Gadgets/druid/variablesEditMe.css
8
254
278
2025-08-20T01:25:09Z
ARTIFICER
564804
Importing default loadout
css
text/css
/* These variables are designed to inherit from your wiki's color variables.
If your wiki uses a different naming scheme, change the inner names to match yours.
If your wiki doesn't use color variables you should consider doing so,
otherwise you can replace the inner variables or the fallback values with colors that match your wiki.
*/
/* Light and dark are separated to make it easier for you to do local customizations but in the default version they are identical */
:root, .view-light .druid-container {
--druid-background-color: var(--wiki-content-background-color, #ffffff);
--druid-secondary-background-color: var(--wiki-accent-color, #36c);
--druid-secondary-background-label-color: var(--wiki-accent-label-color, #fff);
--druid-tertiary-background-color: var(--wiki-content-background-color--secondary, #eaecf0);
--druid-border-color: var(--wiki-content-border-color, #a7d7f9);
--druid-link-color: var(--wiki-content-link-color, #0645ad);
--druid-link-label-color: var(--wiki-content-link-label-color, #fff);
}
.view-dark .druid-container {
--druid-background-color: var(--wiki-content-background-color, #101418);
--druid-secondary-background-color: var(--wiki-accent-color, #36c);
--druid-secondary-background-label-color: var(--wiki-accent-label-color, #fff);
--druid-tertiary-background-color: var(--wiki-content-background-color--secondary, #202122);
--druid-border-color: var(--wiki-content-border-color, #72777d);
--druid-link-color: var(--wiki-content-link-color, #6d8afb);
--druid-link-label-color: var(--wiki-content-link-label-color, #000);
}
8fbdba8a0bd21c0bc819a404a5bec10170782fc2
MediaWiki:Gadgets/druid/customEditMe.css
8
255
279
2025-08-20T01:25:09Z
ARTIFICER
564804
Importing default loadout
css
text/css
/* Custom DRUID styles should go here */
7ecb3c635f03ba714e419c200113f47043f0e358
MediaWiki:Gadgets/druid/doc
8
256
280
2025-08-20T01:25:10Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
<includeonly>This gadget provides styles for {{ml|Infobox}}. You can customize:
* [[MediaWiki:Gadgets/druid/variablesEditMe.css]] - to customize the built-in variables (e.g. if you want to make the color of your infobox not match the wiki accent color). This file will load '''first''' out of all of the DRUID CSS files.
* [[MediaWiki:Gadgets/druid/customEditMe.css]] - to otherwise customize DRUID (e.g. if you want to change the padding, or add a border image, something that's not supported through variables. This file will load '''last''' out of all of the DRUID CSS files, so all rules here will overwrite rules in [[MediaWiki:Gadgets/druid/mainReadonly.css]] with equal specificity.
Please do NOT modify [[MediaWiki:Gadgets/druid/mainReadonly.css]]!! That page may be updated by wiki.gg staff via script, and the updates will not function if you modify it.
More documentation can be found at [[support:DRUID infoboxes|DRUID infoboxes]]<!--
--></includeonly><noinclude>This is the documentation page for [[{{#titleparts:{{FULLPAGENAME}}|-1}}]].</noinclude>
2813eb77787e37161b0ed7e4e85c9f5f2d7ad92e
MediaWiki:Newarticletext
8
257
281
2025-08-20T01:25:10Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
You have followed a link to a page that does not exist yet.
To create the page, start typing in the box below (see the [$1 help page] for more info).
If you are here by mistake, click your browser's <strong>back</strong> button.
778f9ef242eb3058ef30ed3325b901adb762a2af
MediaWiki:Gadgets
8
258
282
2025-08-20T01:25:11Z
ARTIFICER
564804
Importing default loadout
wikitext
text/x-wiki
See also: [[Special:Gadgets]] for a list of all installed gadgets, formatted in a friendly way.
{{Special:PrefixIndex/MediaWiki:Gadgets}}
14815d26ea4ae878b5e77e1781eeb35cd742ad2c
MediaWiki:Gadgets/druidScripts
8
259
283
2025-08-20T01:25:12Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [
"Pages with DRUID infoboxes"
],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.js"
],
"dependencies": [
"jquery"
],
"type": "general"
}
}
5df47905f5c565c4a5c0da774413a6dee76eb7d1
MediaWiki:Gadgets/druidScripts/main.js
8
260
284
2025-08-20T01:25:12Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
mw.hook( 'wikipage.content' ).add( () => {
$( '.druid-title-tab' ).off( 'click' )
.on( 'click', function () {
const $parent = $( this ).closest( '.druid-container' );
$parent.find( '.druid-toggleable' ).removeClass( 'focused' );
const i = $( this ).attr( 'data-druid' );
$parent.find( `.druid-toggleable[data-druid="${i}"]` ).addClass( 'focused' );
} );
$( '.druid-section-tab' ).off( 'click' )
.on( 'click', function () {
const $parent = $( this ).closest( '.druid-section-container' );
$parent.find( '.druid-toggleable' ).removeClass( 'focused' );
const i = $( this ).attr( 'data-druid' );
$parent.find( `.druid-toggleable[data-druid="${i}"]` ).addClass( 'focused' );
} );
$( '.druid-collapsible' ).off( 'click' )
.on( 'click', function () {
const kind = $( this ).attr( 'data-druid-section' );
$( this )
.toggleClass( 'druid-collapsible-collapsed' )
.closest( '.druid-container' )
.find( `[data-druid-section-row="${kind}"]` )
.toggleClass( 'druid-collapsed' );
} );
} );
/* End DRUID */
af8f73fc414f3fc0dae8d97a044675e9912fa457
MediaWiki:Gadgets/discordTemplate
8
261
285
2025-08-20T01:25:13Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [
"Pages with Discord embeds"
],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.js"
],
"dependencies": [
"jquery"
],
"type": "general"
}
}
1232b7fbe2ff589295233393f6f387cf52793a2a
MediaWiki:Gadgets/discordTemplate/main.js
8
262
286
2025-08-20T01:25:13Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
/**
* DiscordCompact.js
* ----------------------
* A very simple script to display a Discord widget.
* Version 0.0.2
* https://support.wiki.gg/wiki/DiscordCompact
* ----------------------
*/
$(function() {
var widget = $("#content #discord-compact-widget");
// Bail out if we didn't find a widget.
if (!widget.length) return;
var id = widget.attr("data-id");
// Ensure that the id is not blank.
if (id === "") throw new Error("DiscordCompact has a blank server id!");
// Ensure that the id consists only of numbers and is at least 17 characters long.
if (!new RegExp("^[0-9]{17}[0-9]+$").test(id)) throw new Error("DiscordCompact has an invalid server id!");
var apiBase = "https://discord.com/api/guilds/" + id;
// Get some information about the server, such as online member count and invite url.
// This also tells us if the server exists or has widgets disabled, so we look out for that too.
$.ajax(apiBase + "/widget.json").fail(function(req){
if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status);
switch (req.responseJSON.code) {
case 10004:
throw new Error("DiscordCompact has a valid server id, but no such server exists!");
case 50004:
throw new Error("DiscordCompact has a valid server id, but that server has widgets disabled!");
default:
throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status + "; code: " + req.responseJSON.code + ")");
}
}).done(function(res){
const inviteURL = res.instant_invite;
// Warn if we can't get an invite URL.
if (inviteURL == null) console.warn("DiscordCompact cannot get an invite URL; does this server have an invite channel set in Widget settings?");
// Now get the widget image.
$.ajax({url: apiBase + "/widget.png?style=banner2", xhrFields: {responseType: "blob"}}).fail(function(req){
if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status);
throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status + "; code: " + req.responseJSON.code + ")");
}).done(function(blob){
// Convert the image data into base64. This prevents us having to make the client request it a second time.
const imageReader = new FileReader();
imageReader.readAsDataURL(blob);
imageReader.onloadend = function() {
const b64Data = imageReader.result;
// Replace the widget with an <a> tag
widget.replaceWith(function() {
return $("<a>", {
id: widget.attr("id"),
class: widget.attr("class"),
style: widget.attr("style"),
alt: "Discord server widget",
href: inviteURL
});
});
// We need to grab the widget again to update it.
widget = $("#discord-compact-widget");
// Setup the CSS so that the image is displayed.
widget.css("display", "block");
widget.css("max-height", "76px");
widget.css("max-width", "320px");
// Create the image.
const widgetImage = document.createElement("img");
widgetImage.src = b64Data;
widgetImage.style.width = "100%";
widgetImage.style.height = "100%";
widgetImage.style.borderRadius = "5px";
widget.append(widgetImage);
// Prevent image dragging.
widget.on("dragstart", function(e) { e.preventDefault(); });
// We're done here.
console.log("DiscordCompact loaded successfully!");
}
});
});
});
/**
* based on https://dev.fandom.com/wiki/MediaWiki:DiscordIntegrator/code.js
*
* used by other wikis.
*/
$(function() {
'use strict';
var mconfig = mw.config.get([
'wgContentLanguage',
'wgUserLanguage',
'wgUserName'
]);
if (window.DiscordIntegratorLoaded) {
return;
}
window.DiscordIntegratorLoaded = true;
/**
* Main object
* @static
*/
var DiscordIntegrator = {
/**
* Initializing
*/
init: function() {
mw.hook('wikipage.content').add($.proxy(this.insertToContent, this));
},
/**
* Finding the designated places in content
* in which to place the widget and placing it
*/
insertToContent: function($content) {
$content.find('.DiscordIntegrator:not(.loaded)').each($.proxy(function(cabbage, el) {
el = $(el);
el.html(this.generateContent(el.data())).addClass('loaded');
}, this));
},
/**
* Determines the theme of the widget.
* @param {string} config Configured theme
* @return {string} 'light' or 'dark' depending on the wiki theme and configuration
*/
determineTheme: function(config) {
// If explicitly configured to light or dark.
if (config === 'dark') {
return 'dark';
}
if (config === 'light') {
return 'light';
}
/** If not configured **/
// try to determine based on wiki theme (set by themeToggle):
var clas = $(':root').attr('class');
var regex = /(^|\s)theme-(\w+)(\s|$)/;
var match = clas.match(regex);
if(match){
var wikiThemeName = match[2];
if(typeof(config) === 'object' && config !== null){ //with json theme config
if(config[wikiThemeName]){
return config[wikiThemeName];
}
}
if(wikiThemeName === 'light'){
return 'light';
}
if(wikiThemeName === 'dark'){
return 'dark';
}
}
// Otherwise, default to dark.
return 'dark';
},
/**
* Generating widget content from an object
* @return {string} Content of the widget
*/
generateContent: function(config) {
if (!config.id || !String(config.id).match(/\d{17,19}/)) {
return "Error: ID of the widget is malformed or not supplied, please see <a href='https://support.wiki.gg/wiki/DiscordWidget' title='the instructions'>the instructions</a> for how to find your server's ID. Please make sure you are not inserting <strong>the DiscordIntegrator template</strong> when asked for <strong>your widget ID</strong>.";
}
if (
(
config.loggedIn === true ||
Boolean(config['logged-in']) === true &&
config['logged-in'] !== 'false' &&
config['logged-in'] !== '{{{loggedIn}}}'
) && !mconfig.wgUserName
) {
return "Please <a href='/Special:UserLogin' title='log in'>log in</a> to see this widget.";
}
var username = config.username === '@disabled' ?
'' :
config.username === '@function' &&
typeof window.DiscordIntegratorGetUsername === 'function' ?
window.DiscordIntegratorGetUsername() :
config.username || mconfig.wgUserName;
return mw.html.element('iframe', {
src: 'https://discord.com/widget?id=' + config.id +
'&theme=' + this.determineTheme(config.theme) +
'&username=' + encodeURIComponent(username),
width: config.width || '100%',
height: config.height || '400px',
allowtransparency: 'true',
frameborder: '0',
title: "Discord server widget"
});
}
};
DiscordIntegrator.init();
});
1e1fd5704120cf67e15a757bd964c7295bdb464e
MediaWiki:Gadgets/luaImportLinks
8
263
287
2025-08-20T01:25:14Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [
828
],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.js"
],
"dependencies": [
"jquery"
],
"type": "general"
}
}
e5843d78effc2d04aa1fde18970885a1845ae525
MediaWiki:Gadgets/luaImportLinks/main.js
8
264
288
2025-08-20T01:25:14Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
/* Link to imported modules from Lua code */
$(function() {
var config = mw.config.get([
'wgCanonicalNamespace',
'wgFormattedNamespaces'
]);
if (config.wgCanonicalNamespace !== 'Module') {
return;
}
var localizedNamespace = config.wgFormattedNamespaces[828];
$('.s1, .s2, .s').each(function() {
var $this = $(this);
var html = $this.html();
var quote = html[0];
var isLongStringQuote = quote === '[';
var quoteRE = new RegExp('^\\' + quote + '|\\' + quote + '$', 'g');
if (isLongStringQuote) {
quoteRE = /^\[\[|\]\]$/g;
}
var name = html.replace(quoteRE, '');
var isEnglishPrefix = name.startsWith('Module:');
var isLocalizedPrefix = name.startsWith(localizedNamespace + ':');
var isDevPrefix = name.startsWith('Dev:');
if (isEnglishPrefix || isLocalizedPrefix || isDevPrefix) {
var attrs = {
href: mw.util.getUrl(name)
};
if (isDevPrefix) {
attrs.href = 'https://commons.wiki.gg/wiki/Module:' + mw.util.wikiUrlencode(name.replace('Dev:', ''));
attrs.target = '_blank';
attrs.rel = 'noopener';
}
var link = mw.html.element('a', attrs, name);
var str = quote + link + quote;
if (isLongStringQuote) {
str = '[[' + link + ']]';
}
$this.html(str);
}
});
});
dc09796545586723653a906ae1fed87411f49536
MediaWiki:Gadgets/spoilers/main.js
8
265
289
2025-08-20T01:25:15Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
/* [[Template:Spoiler]] */
mw.hook('wikipage.content').add(function() {
$('.spoiler-content')
.off('click') // in case this code is loaded twice
.on('click', function(e){
$(this).toggleClass('show');
}).find('a').on('click', function(e){
e.stopPropagation();
});
});
/* End Template:Spoiler */
c96e5a798a1781287a56037db79ab9094a3eae2b
MediaWiki:Gadgets/spoilers
8
266
290
2025-08-20T01:25:16Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [
"Pages with spoilers"
],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.js"
],
"dependencies": [
"jquery"
],
"type": "general"
}
}
e2aacbae968c704385f3937e6b0004f263907193
MediaWiki:Gadgets/charInserts
8
267
291
2025-08-20T01:25:16Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [
"edit"
],
"categories": [],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.js"
],
"dependencies": [
"jquery"
],
"type": "general"
}
}
518bbdc62f3fe767736f2de6ee9ba2b7eb9ab0a8
MediaWiki:Gadgets/charInserts/main.js
8
268
292
2025-08-20T01:25:17Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
$(function() {
$('.mw-charinsert-item').each(function() {
$(this).text($(this).closest('div').attr('data-ci-label'));
$(this).css('display', 'inline-block');
});
$('.ci-loading-text').css('display','none');
});
daabc4b17b7729432f5c146630a0715a7abc13e9
MediaWiki:Gadgets/themeColorEditor
8
269
293
2025-08-20T01:25:18Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": false,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [
8
],
"contentModels": [
"css"
],
"rights": [
"editinterface"
]
},
"module": {
"pages": [
"main.js"
],
"dependencies": [],
"type": "general"
}
}
b512452ab2c0b2fd4d86d6a70c4c80fba41d14ed
MediaWiki:Gadgets/themeColorEditor/main.js
8
270
294
2025-08-20T01:25:18Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
$(function() {
if (mw.config.get('wgPageName') != "MediaWiki:Common.css") return;
mw.loader.load( 'https://commons.wiki.gg/load.php?lang=en&modules=ext.gadget.themeColorEditorScript&skin=vector&maxage=360&smaxage=360' )
});
a6d1c6789815c3c323c2afd84def2c1ca23d5efe
MediaWiki:Gadgets/ranger/variables.css
8
271
295
2025-08-20T01:25:19Z
ARTIFICER
564804
Importing default loadout
css
text/css
.ranger-navbox{
--navbox-background: var(--wiki-content-background-color); /* for entire navbox */
--navbox-margin: 0.5em auto;
--navbox-padding: 4px;
--navbox-gap: 3px; /* when using zero-value, it must be 0px */
--navbox-outer-border-color: var(--wiki-content-border-color--accent);
--navbox-outer-border-width: 1px;
--navbox-outer-border-style: solid;
--navbox-outer-border-radius: 0px;
--navbox-font-size: calc(1em - 2px);
--navbox-title-color: var(--wiki-accent-label-color);
--navbox-title-font-size: calc(125%);
--navbox-title-background: var(--wiki-accent-color);
--navbox-title-icon-color: var(--wiki-accent-label-color);
--navbox-title-link-color: var(--navbox-title-color);
--navbox-title-link-color--visited: var(--navbox-title-link-color);
--navbox-title-link-color--hover: var(--wiki-accent-link-color);
--navbox-title-redlink-color: var(--navbox-title-link-color);
--navbox-title-link-decoration: underline solid;
--navbox-title-redlink-decoration: underline wavy;
--navbox-title-padding--y: 0.5em;
--navbox-above-background: color-mix(in srgb, var(--wiki-content-text-color) 15%, transparent);
--navbox-above-color: var(--wiki-content-text-color);
--navbox-above-padding: var(--navbox-list-padding);
--navbox-below-background: var(--navbox-above-background);
--navbox-below-color: var(--navbox-above-color);
--navbox-below-padding: var(--navbox-above-padding);
--navbox-header-color: var(--navbox-title-color);
--navbox-header-font-size: calc(110%);
--navbox-header-background: var(--navbox-title-background);
--navbox-header-icon-color: var(--navbox-title-icon-color);
--navbox-header-link-color: var(--navbox-title-link-color);
--navbox-header-link-color--visited: var(--navbox-title-link-color--visited);
--navbox-header-link-color--hover: var(--navbox-title-link-color--hover);
--navbox-header-redlink-color: var(--navbox-title-redlink-color);
--navbox-header-link-decoration: var(--navbox-title-link-decoration);
--navbox-header-redlink-decoration: var(--navbox-title-redlink-decoration);
--navbox-header-padding--y: 0.3em;
--navbox-subheader-font-size: calc(100%);
--navbox-subheader-padding--y: calc(var(--navbox-header-padding--y)/2);
--navbox-list-background: color-mix(in srgb, var(--wiki-content-text-color) 5%, transparent);
--navbox-list-background--striped: color-mix(in srgb, var(--wiki-content-text-color) 8%, transparent);
--navbox-list-color: var(--wiki-content-text-color);
--navbox-list-padding: 0.25em 0.5em;
/* --navbox-group-* also apply to .ranger-subgroup */
--navbox-group-text-align: left;
--navbox-group-text-align--mobile: left; /* only for mobile view */
--navbox-group-background: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent);
--navbox-group-color: var(--wiki-content-text-color);
--navbox-group-padding: var(--navbox-list-padding);
--navbox-tree-line-color: color-mix(in srgb, var(--wiki-accent-color) 30%, transparent);
--navbox-tree-line-width: 2px;
--navbox-tree-indent: 1em;
--navbox-tree-line-indent: 0.5em;
--navbox-tree-line-spacing: var(--navbox-gap);
--icon-chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-down' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M6 9l6 6l6 -6'%3E%3C/path%3E%3C/svg%3E");
--icon-metalinks: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-edit' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1'%3E%3C/path%3E%3Cpath d='M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z'%3E%3C/path%3E%3Cpath d='M16 5l3 3'%3E%3C/path%3E%3C/svg%3E");
--navbox-icon-offset--x: 0.5rem; /* should be an absolute length (rem-based or px-based) */
}
.ranger-navbox.pill,
.ranger-navbox.pill-mobile{
/** vars for the "pill" style only (`.pill` and ".pill-mobile" clases) **/
--navbox-pill-gap: 0.3em;
--navbox-pill-padding: 0.25em 0.75em;
--navbox-pill-border-radius: 3px;
--navbox-pill-box-shadow: none;
--navbox-pill-background: color-mix(in srgb, var(--wiki-content-text-color) 5%, transparent);
--navbox-pill-box-shadow--hover: inset 0 0 3px var(--navbox-list-color);
--navbox-pill-background--hover: var(--navbox-pill-background);
--navbox-pill-selflink-background: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);/* background of pills with selflink in them */
/* remove list cell background */
--navbox-list-background: none;
--navbox-list-background--striped: color-mix(in srgb, var(--wiki-content-text-color) 3%, transparent);
}
.ranger-navbox.no-underline-title-links{
--navbox-title-link-color: var(--wiki-accent-link-color);
--navbox-title-link-decoration: none;
--navbox-title-redlink-decoration: none;
}
.ranger-navbox.noborder,
.ranger-navbox.no-border{
--navbox-padding: 0px;
--navbox-outer-border-width: 0px;
}
/******************************
* Fallback for older browsers *
*******************************/
@supports not (color:color-mix(in srgb, #000, transparent)) {
.ranger-navbox {
--navbox-above-background: var(--wiki-content-background-color--secondary);
--navbox-list-background: transparent;
--navbox-list-background--striped: var(--wiki-content-background-color--secondary);
--navbox-group-background: var(--wiki-content-background-color--secondary);
--navbox-tree-line-color: var(--wiki-content-background-color--secondary);
}
.ranger-navbox.pill,
.ranger-navbox.pill-mobile {
--navbox-pill-background: var(--wiki-content-background-color--secondary);
--navbox-list-background--striped: transparent;
--navbox-pill-selflink-background: var(--wiki-content-background-color--secondary);
}
}
/***************
* End fallback *
****************/
0f49887270380cdac6968f16cfc75a115818c39a
MediaWiki:Gadgets/hoverShowSpoilers
8
272
296
2025-08-20T01:25:19Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": false,
"default": false,
"hidden": false,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [
"Pages with spoilers"
],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.css"
],
"dependencies": [],
"type": "styles"
}
}
427adff0005c5bf986f2bca5bf83943f65359867
MediaWiki:Gadgets/mpEditLinks
8
273
297
2025-08-20T01:25:20Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": false,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [],
"contentModels": [],
"rights": [
"editprotected"
]
},
"module": {
"pages": [
"main.css",
"main.js"
],
"messages": [
"gadget-mpEditLinks-edit-link-text",
"gadget-mpEditLinks-toggle-link-text"
],
"dependencies": [
"jquery",
"mediawiki.jqueryMsg",
"mediawiki.util"
],
"type": "general"
}
}
a6733e82425fccced50edfeace86534103f0424b
MediaWiki:Gadgets/collapsibleSidebarSections
8
274
298
2025-08-20T01:25:21Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "appearance",
"package": true,
"default": false,
"hidden": false,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.css",
"main.js"
],
"dependencies": [
"jquery"
],
"type": "general"
}
}
d67dc8fabaf4e1d275a3b17c42f3d707f00b707c
MediaWiki:Gadgets/collapsibleSidebarSections/main.js
8
275
299
2025-08-20T01:25:21Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
$(function(){
// CONFIG section, you can edit this part
// a list of sections that should be collapsed by default for *all users*.
// This should be the name of the heading as listed in Mediawiki:Sidebar and is case-sensitive.
// For example, if you have '* Character_Classes' and you want that section collapsed, add 'Character_Classes' into the brackets below.
// Separate entries with commas and use underscores instead of spaces.
// Example list: ['Character_Classes', 'Items', 'External_Links']
// Please DO NOT add navigation or tb into this list, as they are expected functionality.
var INITIALLY_COLLAPSED_IDS = [];
var MIN_ACTIVATION_WIDTH = 721;
//END CONFIG
// add the p- onto ids for ease of use, if not present
INITIALLY_COLLAPSED_IDS.forEach(function(id, index){
if(!id.startsWith('p-')){
INITIALLY_COLLAPSED_IDS[index] = 'p-' + id;
}
});
var $portals = $("#mw-panel .vector-menu-portal");
var setup = function(){
$portals.each(function(index, el){
if(window.innerWidth < MIN_ACTIVATION_WIDTH) {
return;
}
var $el = $(el);
var $id = $el.attr("id");
if(!$id){
return;
}
// check if this portal should be collapsed
if(
// portal is set to be initially collapsed and user has not indicated that they want it open
(INITIALLY_COLLAPSED_IDS.includes($id) && localStorage.getItem('sidebar_c_'+$id) != "n")
|| // or
// user has indicated they want this portal collapsed
(localStorage.getItem('sidebar_c_'+$id) === "y")
){
$el.addClass('collapsed').find('.vector-menu-content').slideUp(0);
}
});
}
setup();
$(window).on('resize', setup);
$portals.on("click", "h3", function(event){
if(window.innerWidth < MIN_ACTIVATION_WIDTH) {
return;
}
var $el = $(this).parent();
var $id = $el.attr("id");
if(!$id){
return;
}
$el.toggleClass('collapsed');
if($el.hasClass('collapsed')){ // more consistent between class and slide status.
localStorage.setItem('sidebar_c_'+$id, "y");
$el.find('.vector-menu-content').slideUp('fast');
}
else{
localStorage.setItem('sidebar_c_'+$id, "n");
$el.find('.vector-menu-content').slideDown('fast');
}
});
});
63d4425138f9c81e8294fbd01a08de9e1f58256a
MediaWiki:Gadgets/collapsibleSidebarSections/main.css
8
276
300
2025-08-20T01:25:22Z
ARTIFICER
564804
Importing default loadout
css
text/css
@media screen and (min-width: 721px) {
.client-js #mw-panel .portal:not(#p-ext-discordwidget) .vector-menu-heading {
cursor: pointer;
display: flex;
align-items: center;
justify-content: space-between;
transition: all 0.2s;
}
.client-js #mw-panel .portal:not(#p-ext-discordwidget) .vector-menu-heading::after {
content: "";
display: block;
pointer-events: none;
width: 1em;
height: 1em;
margin-top: 1px; /* offset */
--mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-down' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M6 9l6 6l6 -6'%3E%3C/path%3E%3C/svg%3E") no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: center center;
mask-position: center center;
background-color: var(--wiki-sidebar-heading-color, var(--wiki-sidebar-link-color));
transform: rotate(180deg);
}
.client-js #mw-panel .portal:not(#p-ext-discordwidget).collapsed .vector-menu-heading::after {
transform: rotate(0deg);
}
.client-js #mw-panel .vector-menu-portal.collapsed .vector-menu-heading {
margin-bottom: 0;
}
}
5ab6f9e9146615a8038e81b9990004fdb06e00c0
MediaWiki:Gadgets/uploadMultipleFiles
8
277
301
2025-08-20T01:25:23Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": false,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [
-1
],
"contentModels": [],
"rights": [
"edit",
"upload"
]
},
"module": {
"pages": [
"main.js"
],
"dependencies": [
"jquery",
"mediawiki.util"
],
"type": "general"
}
}
13bc1e984c367575a7b4f4ac29d2cf75b4f01c6c
MediaWiki:Gadgets/purge
8
278
302
2025-08-20T01:25:23Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": false,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [],
"contentModels": [],
"rights": [
"edit"
]
},
"module": {
"pages": [
"main.js"
],
"messages": [
"cargo-purgecache",
"cargo-purgecache-failed",
"action-purge"
],
"dependencies": [
"mediawiki.util",
"mediawiki.api",
"mediawiki.jqueryMsg"
],
"type": "general"
}
}
ebb5f4bfef49746bef46514b0ffaccee57f3f1cd
MediaWiki:Gadgets/ranger/custom.css
8
279
303
2025-08-20T01:25:24Z
ARTIFICER
564804
Importing default loadout
css
text/css
/* Custom RANGER styles can go here. Rules here will override rules of equal specificity in main.css */
769d3248cef93d2b58dcf7339da923494f5173f8
MediaWiki:Gadgets/vectorScripts
8
280
304
2025-08-20T01:25:24Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": true,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [],
"contentModels": [],
"rights": [],
"skins": [
"vector"
]
},
"module": {
"pages": [
"main.js"
],
"dependencies": [],
"type": "general"
}
}
f26fca963d213febee869477a05933a6fedfc542
MediaWiki:Gadgets/vectorScripts/main.js
8
281
305
2025-08-20T01:25:25Z
ARTIFICER
564804
Importing default loadout
javascript
text/javascript
/*** Mobile navigation toggle button ***/
( function () {
const BUTTON_CLASS = 'mobile-nav-toggle';
const EXPANDED_CLASS = 'nav--expanded';
if (document.querySelector('button.' + BUTTON_CLASS)){return;} // early return to avoid double button if this runs twice
let mobileSidebarButton = document.createElement( 'button' );
let sidebar = document.getElementById( 'mw-panel' );
mobileSidebarButton.className = BUTTON_CLASS;
mobileSidebarButton.addEventListener( 'click', function () {
mobileSidebarButton.classList.toggle( EXPANDED_CLASS );
sidebar.classList.toggle( EXPANDED_CLASS );
} );
sidebar.prepend( mobileSidebarButton );
document.body.classList.add( 'has-vector-mobile-menu' );
} )();
/*** End mobile navigation toggle button ***/
/*** #mw-head collapsing fix ***/
/*** IMPORTANT: Do not copy this code if your wiki is not updated to default loadout 2.0 (May 22, 2025) or later, or your navigation tabs will break ***/
mw.loader.using('skins.vector.legacy.js', function() {
$.collapsibleTabs.calculateTabDistance = function(){
return parseInt(window.getComputedStyle(document.getElementById( 'right-navigation' ), '::before').width ) - 1;
}
});
/*** END #mw-head collapsing fix ***/
cb209a13dfc674d9ad471ec79784c4d65ad785f1
MediaWiki:Gadgets/userProfile
8
282
306
2025-08-20T01:25:26Z
ARTIFICER
564804
Importing default loadout
GadgetDefinition
application/json
{
"settings": {
"section": "",
"package": true,
"default": true,
"hidden": false,
"supportsUrlLoad": false
},
"loadConditions": {
"actions": [],
"categories": [],
"namespaces": [
-1,
2,
3
],
"contentModels": [],
"rights": []
},
"module": {
"pages": [
"main.js",
"main.css"
],
"dependencies": [
"mediawiki.interface.helpers.styles",
"mediawiki.util",
"mediawiki.api",
"jquery"
],
"type": "general"
}
}
e9c76b459199205abae5373548f6ff36e83fefcc
File:Site-favicon.ico
6
283
307
2025-08-20T23:13:27Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|game}}
5fdc0517c60eec1aa02a1fef9763fa88c38be9ad
308
307
2025-08-20T23:14:46Z
Sharparam
284703
Protected "[[File:Site-favicon.ico]]": Favicon used for the entire site ([Edit=Allow only users with a confirmed email address] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite))
wikitext
text/x-wiki
== Licensing ==
{{License|game}}
5fdc0517c60eec1aa02a1fef9763fa88c38be9ad
File:Site-logo.png
6
284
309
2025-08-20T23:16:37Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|game}}
5fdc0517c60eec1aa02a1fef9763fa88c38be9ad
310
309
2025-08-20T23:17:03Z
Sharparam
284703
Protected "[[File:Site-logo.png]]": Logo for the whole wiki ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite))
wikitext
text/x-wiki
== Licensing ==
{{License|game}}
5fdc0517c60eec1aa02a1fef9763fa88c38be9ad
Template:Navbox/Items
10
285
323
322
2025-08-20T23:22:44Z
Sharparam
284703
12 revisions imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = [[Essential items|Essential]]
| list1 =
* [[Ability Splinter]]
* [[Handler Echo]]
* [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]])
* [[Mobius Blade]]
* [[Old Key]]
* [[Perk Essence]] ([[Unstable Perk Essence|Unstable]])
* [[Plagued Blood]]
* [[Scanner]]
| group1.1 = [[Upgrade items|Upgrade]]
| list1.1 =
* [[Upgrade Splinter]]
* [[Upgrade Module]]
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
7ddddd74185f43622c0032fb924e9ea4df3f2c1d
Template:Navbox/Consumables
10
286
330
329
2025-08-20T23:22:44Z
Sharparam
284703
6 revisions imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
| group2 = Fluids
| list2 =
* [[Greater Ionization Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Regenerative Fluid]]
* [[Restorative Fluid]]
| group3 = Concoctions
| list3 =
* [[Diver's Lungs Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Fluxshield Concoction]]
* [[Jaeger's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Dreadguard's Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Technomancer's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Forsaken Concoction]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Health Regen]]
* [[Concoction: Flux Regen]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Agility]]
* [[Concoction: Constitution]]
* [[Concoction: Intelligence]]
* [[Concoction: All Attributes]]
* [[Concoction: Zealot's Tears]]
* [[Experience Concoction]]
* [[Mystery Concoction]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
e9736a1ea6833ecda5952ac6a85bce948c9cf19a
Template:Navbox/Capes
10
287
336
335
2025-08-20T23:22:44Z
Sharparam
284703
5 revisions imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Capes
| title = [[Capes]]
| list1 =
* [[Agile Cape]]
* [[Corrupted Cape]]
* [[Folk Cape]]
* [[Fur Cape]]
* [[Ronin Scarf]]
* [[Sentinel Overcoat]]
* [[Spectre Scarf]]
* [[Tattered Cape]]
* [[Techpriest Cape]]
* [[Traveler Cape]]
* [[Wanderer Cape]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
25d3fe6cdc6b4cce6fe483d3b4b7218599b53b34
Template:Navbox/Anomalous crystals
10
288
339
338
2025-08-20T23:22:44Z
Sharparam
284703
2 revisions imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Anomalous crystals
| title = [[Anomalous crystals]]
| list1=
* [[Lesser Anomalous Crystal]]
* [[Anomalous Crystal]]
* [[Greater Anomalous Crystal]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
ebedb2789af69363588ddf5553b8868dcbf7005d
Template:Navbox/Lore
10
289
344
343
2025-08-20T23:22:45Z
Sharparam
284703
4 revisions imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Lore
| title = [[Lore]]
| group1 = [[Data logs]]
| list1 = {{Navbox/Data logs|child}}
| group2 = [[Documents]]
| list2 = {{Navbox/Documents|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
cc386cacfb50aa464ec9e6065463991e75c6ef65
Template:Navbox/Data logs
10
290
367
366
2025-08-20T23:22:45Z
Sharparam
284703
22 revisions imported: Import from private test wiki
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Vermillion]]
* [[A Broken Reality]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[Understanding]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
09b921cd27b38e22701e9064c302db0e3c8d90f3
Template:Navbox/Documents
10
291
369
368
2025-08-20T23:22:45Z
Sharparam
284703
1 revision imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Documents
| title = [[Documents]]
| list1 =
* [[Konrad's War Log]]
* [[Helena's Diary Fragment]]
* [[Hellicar's Maxims]]
* [[Guiscard's Manifest]]
* [[Untitled Log]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
4859742a1634980b598ee96ab98cf1b44828e159
Template:Navbox/Rings
10
292
376
375
2025-08-20T23:22:46Z
Sharparam
284703
6 revisions imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
* [[Ring of Casting Speed]]
* [[Ring of Hawk]]
* [[Ring of Rammstein]]
* [[Ring of Lesser Talent]]
* [[Ring of Talent]]
* [[Ring of Exceeding Talent]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
a26fb4e5bb5097e037bde34bbe50c7f6f0fd3453
Template:Navbox/Locations
10
293
383
382
2025-08-20T23:22:46Z
Sharparam
284703
6 revisions imported: Import from private test wiki
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]])
* [[Blok 6147]]
* [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]])
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]])
* [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]])
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
* [[Unknown (location)|Unknown]]
* [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]] · [[Vermillion Fields#Temple|Temple]])
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
7716644faea4dd5aee763d21d89daca0de53c69c
Template:Navbox/NPCs
10
294
385
384
2025-08-20T23:22:46Z
Sharparam
284703
1 revision imported: Import from private test wiki
wikitext
text/x-wiki
{{Navbox
| {{{child|}}}
| template = Navbox/NPCs
| title = [[NPCs]]
| list1 =
* [[Abandoned Soldier]]
* [[Abelard the Brave]]
* [[Anselm the Pure]]
* [[Archinquisitor Belisarius]]
* [[The Handler]]
* [[Inquisitor Commander Alexius]]
* [[Mysterious Woman]]
* [[Royal Division Captain Yulia]]
* [[Stranger]]
* [[Yaroslav]]
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
<noinclude>
19819092a7dffc936dc5330f6d3c7764bede86db
User:Sharparam
2
295
386
2025-08-20T23:25:19Z
Sharparam
284703
Created page with "{{#invoke:infobox|main | title = Sharparam | image = [[File:Sharparam.png|300px|link=]] | sections = Basic Info,Socials | Basic Info = Pronouns, Website | Pronouns = He/Him or They/Them | Website = [https://sharparam.com sharparam.com] | Socials = GitHub, Reddit, Discord | Socials_columns = 3 | GitHub = [https://github.com/Sharparam Sharparam] | Reddit = [https://reddit.com/u/Sharparam Sharparam] | Discord = sharparam }} Hello, I am '''Sharparam'''! I use my /sandbox..."
wikitext
text/x-wiki
{{#invoke:infobox|main
| title = Sharparam
| image = [[File:Sharparam.png|300px|link=]]
| sections = Basic Info,Socials
| Basic Info = Pronouns, Website
| Pronouns = He/Him or They/Them
| Website = [https://sharparam.com sharparam.com]
| Socials = GitHub, Reddit, Discord
| Socials_columns = 3
| GitHub = [https://github.com/Sharparam Sharparam]
| Reddit = [https://reddit.com/u/Sharparam Sharparam]
| Discord = sharparam
}}
Hello, I am '''Sharparam'''!
I use my [[/sandbox|sandbox]] to test stuff.
== Data mining ==
The results of my data mining attempts can be found in a [https://drive.google.com/drive/folders/1UXX_9w59D19ZmgBzf_bN6tIHxZuyJdWx?usp=sharing Shared GDrive folder].
== My user styles and scripts ==
=== Styles ===
* [[/common.css]]
=== Scripts ===
* [[/common.js]]
== MediaWiki "bookmarks" ==
* [[MediaWiki:Common.css]]
* [[MediaWiki:Vector.css]]
735978aec72a43447f01b77eefc887f01ca6ee63
Bleak Faith: Forsaken Wiki/external
0
8
387
15
2025-08-20T23:30:01Z
Sharparam
284703
Replace example links with Bleak Faith links
wikitext
text/x-wiki
{{Main page box/start
| title = External links
}}
<div class="mp-links columns-2">
* {{MP link|Official site|link=http://www.bleakfaith.com/}}
* {{MP link|Discord|link=https://discord.com/invite/x7UCRbHAAq|image=Discord.svg|size=64x64px}}
* {{MP link|Reddit|link=https://www.reddit.com/r/Bleak_Faith/|image=Reddit.svg|size=64x64px}}
* {{MP link|Steam|link=https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/|image=Steam.svg|size=64x64px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
5bd796659a5bafa38b5bab3f000fecaaeaa472aa
Module:Coordinates
828
296
388
2025-08-21T14:51:06Z
Sharparam
284703
Created page with "local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or ''..."
Scribunto
text/plain
local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$"
local NS_TO_CATEGORISE = {
[0] = true, -- main
[6] = true, -- file
[14] = true -- category
}
local args_util = require('Module:ArgsUtil')
local p = {}
---@param val number
---@param label string
local function coordNode(val, label)
return mw.html.create('span')
:addClass(label)
:wikitext(p.formatCoord(val))
end
---@param val number
---@return string
function p.formatCoord(val)
local sign = val < 0 and '-' or ''
val = math.abs(val)
val = math.floor(val * 100) / 100
local str = tostring(val)
local int = string.match(str, "^%d+")
local dec = string.match(str, "%.(%d-)0*$") or ''
local int_len = #int
local dec_len = #dec
if int_len >= 3 then
return sign .. string.sub(int, 1, 4)
end
if dec_len == 0 then return sign .. int end
return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2))
end
function p.main(frame)
local args = args_util.merge()
return p._main(args)
end
function p._main(args)
local x = tonumber(args.x or args[1]) or 0
local y = tonumber(args.y or args[2]) or 0
local z = tonumber(args.z or args[3]) or 0
local xdec = string.sub(tostring(math.fmod(x, 1)), 3)
local ydec = string.sub(tostring(math.fmod(y, 1)), 3)
local zdec = string.sub(tostring(math.fmod(z, 1)), 3)
local inaccurate = #xdec ~= 2 or #ydec ~= 2 or #zdec ~= 2
local tooltip = string.format("X: %d, Y: %d, Z: %d", x, y, z)
local elem = mw.html.create('span')
:css('border-bottom', '1px dotted')
:attr('data-x', x)
:attr('data-y', y)
:attr('data-z', z)
:attr('title', tooltip)
:addClass('coordinates')
:addClass('nowrap')
:node(coordNode(x, 'x'))
:wikitext('::')
:node(coordNode(y, 'y'))
:wikitext('::')
:node(coordNode(z, 'z'))
elem = tostring(elem)
local ns = mw.title.getCurrentTitle().namespace
if NS_TO_CATEGORISE[ns] then
if inaccurate then
elem = elem .. '[[Category:Pages with inaccurate coordinates]]'
end
elem = elem .. '[[Category:Pages with coordinates]]'
end
return elem
end
return p
de47bf0e464009651055c19beae22b5024ae6aa3
397
388
2025-08-21T14:59:20Z
Sharparam
284703
Fix tooltip display not showing decimals
Scribunto
text/plain
local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$"
local NS_TO_CATEGORISE = {
[0] = true, -- main
[6] = true, -- file
[14] = true -- category
}
local args_util = require('Module:ArgsUtil')
local p = {}
---@param val number
---@param label string
local function coordNode(val, label)
return mw.html.create('span')
:addClass(label)
:wikitext(p.formatCoord(val))
end
---@param val number
---@return string
function p.formatCoord(val)
local sign = val < 0 and '-' or ''
val = math.abs(val)
val = math.floor(val * 100) / 100
local str = tostring(val)
local int = string.match(str, "^%d+")
local dec = string.match(str, "%.(%d-)0*$") or ''
local int_len = #int
local dec_len = #dec
if int_len >= 3 then
return sign .. string.sub(int, 1, 4)
end
if dec_len == 0 then return sign .. int end
return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2))
end
function p.main(frame)
local args = args_util.merge()
return p._main(args)
end
function p._main(args)
local x = tonumber(args.x or args[1]) or 0
local y = tonumber(args.y or args[2]) or 0
local z = tonumber(args.z or args[3]) or 0
local xdec = string.sub(tostring(math.fmod(x, 1)), 3)
local ydec = string.sub(tostring(math.fmod(y, 1)), 3)
local zdec = string.sub(tostring(math.fmod(z, 1)), 3)
local inaccurate = #xdec ~= 2 or #ydec ~= 2 or #zdec ~= 2
local tooltip = string.format("X: %.1f, Y: %.1f, Z: %.1f", x, y, z)
local elem = mw.html.create('span')
:css('border-bottom', '1px dotted')
:attr('data-x', x)
:attr('data-y', y)
:attr('data-z', z)
:attr('title', tooltip)
:addClass('coordinates')
:addClass('nowrap')
:node(coordNode(x, 'x'))
:wikitext('::')
:node(coordNode(y, 'y'))
:wikitext('::')
:node(coordNode(z, 'z'))
elem = tostring(elem)
local ns = mw.title.getCurrentTitle().namespace
if NS_TO_CATEGORISE[ns] then
if inaccurate then
elem = elem .. '[[Category:Pages with inaccurate coordinates]]'
end
elem = elem .. '[[Category:Pages with coordinates]]'
end
return elem
end
return p
2e9e52b2c3ce3d680e6c156a74e9794100f9de20
Template:Coordinates
10
297
389
2025-08-21T14:52:10Z
Sharparam
284703
Created page with "{{#invoke:Coordinates|main}}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{#invoke:Coordinates|main}}<noinclude>{{Documentation}}</noinclude>
f6c5bc6a93e6c91ac2daccb423e3ca4e2e61b94f
Template:Coordinates/doc
10
298
390
2025-08-21T14:52:43Z
Sharparam
284703
Created page with "This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "des..."
wikitext
text/x-wiki
This template uses the {{ml|Coordinates}} Lua module.
== Usage ==
<templatedata>
{
"params": {
"x": {
"aliases": [
"1"
],
"label": "X",
"description": "X coordinate",
"example": "52",
"type": "number",
"required": true
},
"y": {
"aliases": [
"2"
],
"label": "Y",
"description": "Y coordinate",
"example": "12.5",
"type": "number",
"required": true
},
"z": {
"aliases": [
"3"
],
"label": "Z",
"description": "Z coordinate (vertical axis)",
"example": "-5.6",
"type": "number",
"required": true
}
},
"description": "Used to describe a location in the game.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12|y=50|z=-32}}</syntaxhighlight> → {{Coordinates|x=12|y=50|z=-32}}
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.5|42.5|-4.4}}</syntaxhighlight> → {{Coordinates|16.5|42.5|-4.4}}
0374227811c51975a2c4f372bfd6877f1362368f
396
390
2025-08-21T14:56:54Z
Sharparam
284703
Add some shorthand examples
wikitext
text/x-wiki
This template uses the {{ml|Coordinates}} Lua module.
== Usage ==
<templatedata>
{
"params": {
"x": {
"aliases": [
"1"
],
"label": "X",
"description": "X coordinate",
"example": "52",
"type": "number",
"required": true
},
"y": {
"aliases": [
"2"
],
"label": "Y",
"description": "Y coordinate",
"example": "12.5",
"type": "number",
"required": true
},
"z": {
"aliases": [
"3"
],
"label": "Z",
"description": "Z coordinate (vertical axis)",
"example": "-5.6",
"type": "number",
"required": true
}
},
"description": "Used to describe a location in the game.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12|y=50|z=-32}}</syntaxhighlight> → {{Coordinates|x=12|y=50|z=-32}}
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.5|42.5|-4.4}}</syntaxhighlight> → {{Coordinates|16.5|42.5|-4.4}}
* <syntaxhighlight lang="wikitext" inline>{{coords|1.2|3.4|5.6}}</syntaxhighlight> → {{coords|1.2|3.4|5.6}}
* <syntaxhighlight lang="wikitext" inline>{{pos|6.5|4.3|2.1}}</syntaxhighlight> → {{pos|6.5|4.3|2.1}}
7af2ee703d6da0280470b4042899b8ff0fbb5115
Template:Coords
10
299
391
2025-08-21T14:53:49Z
Sharparam
284703
Redirected page to [[Template:Coordinates]]
wikitext
text/x-wiki
#REDIRECT [[Template:Coordinates]]
b5be2dd4498d085b3d37c3f6a8be85ba839892d5
Template:Position
10
300
392
2025-08-21T14:54:07Z
Sharparam
284703
Redirected page to [[Template:Coordinates]]
wikitext
text/x-wiki
#REDIRECT [[Template:Coordinates]]
b5be2dd4498d085b3d37c3f6a8be85ba839892d5
Template:Pos
10
301
393
2025-08-21T14:54:26Z
Sharparam
284703
Redirected page to [[Template:Coordinates]]
wikitext
text/x-wiki
#REDIRECT [[Template:Coordinates]]
b5be2dd4498d085b3d37c3f6a8be85ba839892d5
Template:Coord
10
302
394
2025-08-21T14:54:43Z
Sharparam
284703
Redirected page to [[Template:Coordinates]]
wikitext
text/x-wiki
#REDIRECT [[Template:Coordinates]]
b5be2dd4498d085b3d37c3f6a8be85ba839892d5
Template:Coordinate
10
303
395
2025-08-21T14:55:03Z
Sharparam
284703
Redirected page to [[Template:Coordinates]]
wikitext
text/x-wiki
#REDIRECT [[Template:Coordinates]]
b5be2dd4498d085b3d37c3f6a8be85ba839892d5
Template:Yesno
10
304
398
2025-08-21T15:10:37Z
Sharparam
284703
Created page with "{{<includeonly>safesubst:</includeonly>#switch: {{<includeonly>safesubst:</includeonly>lc: {{{1|¬}}} }} |no |n |false |0 = {{{no|<!-- null -->}}} | = {{{blank|{{{no|<!-- null -->}}}}}} |¬ = {{{¬|}}} |yes |y |true |1 = {{{yes|yes}}} |#default = {{{def|{{{yes|yes}}}}}} }}<noinclude> {{Documentation}} </noinclude>"
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#switch: {{<includeonly>safesubst:</includeonly>lc: {{{1|¬}}} }}
|no
|n
|false
|0 = {{{no|<!-- null -->}}}
| = {{{blank|{{{no|<!-- null -->}}}}}}
|¬ = {{{¬|}}}
|yes
|y
|true
|1 = {{{yes|yes}}}
|#default = {{{def|{{{yes|yes}}}}}}
}}<noinclude>
{{Documentation}}
</noinclude>
166fab9e5411aacd02ca4c9e93fbc7bf6bcf26ac
Template:Sandbox other
10
305
399
2025-08-21T15:22:25Z
Sharparam
284703
Created page with "{{#switch:{{SUBPAGENAME}}|sandbox|doc={{{1|}}}|#default={{{2|}}}}}<noinclude> {{documentation}} </noinclude>"
wikitext
text/x-wiki
{{#switch:{{SUBPAGENAME}}|sandbox|doc={{{1|}}}|#default={{{2|}}}}}<noinclude>
{{documentation}}
</noinclude>
278877c2ad3ab9f7df5d91845dc67d2f4e2c6a46
Template:Sandbox other/doc
10
306
400
2025-08-21T15:23:28Z
Sharparam
284703
Created page with "<!-- {{Documentation subpage}} --> <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> <templatedata> { "description": { "en": "This template displays different output on sandbox and documentation pages than other ones." }, "params": { "1": { "label": { "en": "Sandbox text" }, "description": { "en": "Text displayed on sandbox (/sandbox) and documentation (/doc) subpages. Usually this doesn’t contain categories, but i..."
wikitext
text/x-wiki
<!-- {{Documentation subpage}} -->
<!-- Categories go at the bottom of this page and interwikis go in Wikidata. -->
<templatedata>
{
"description": {
"en": "This template displays different output on sandbox and documentation pages than other ones."
},
"params": {
"1": {
"label": {
"en": "Sandbox text"
},
"description": {
"en": "Text displayed on sandbox (/sandbox) and documentation (/doc) subpages. Usually this doesn’t contain categories, but it may contain a link to the main template."
},
"type": "content",
"suggested": true
},
"2": {
"label": {
"en": "Normal text"
},
"description": {
"en": "Text displayed everywhere except for sandbox and documentation subpages. Usually this contains categories for the template."
},
"type": "content",
"suggested": true
}
}
}
</templatedata>
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
[[Category:Templates]]
}}</includeonly>
d4d9f60bd1d1c7555fdc8529a0039406cfd26726
Template:Yesno/doc
10
307
401
2025-08-21T15:23:49Z
Sharparam
284703
Created page with "<!-- {{Documentation subpage}} --> <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> This template normalises an input to be a yes/no output. == Usage == The template has five possible outputs depending on the default parameter (input if you will). In its simplest usage, these will all be either "yes" or "" (blank = nothing no characters). * {{Tlx|Yesno|yes}} → "yes" (also applies to "Yes", "YeS", etc, "Y", "y" and "1") * {{Tlx|Yesno|no}}..."
wikitext
text/x-wiki
<!-- {{Documentation subpage}} -->
<!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE -->
This template normalises an input to be a yes/no output.
== Usage ==
The template has five possible outputs depending on the default parameter (input if you will).
In its simplest usage, these will all be either "yes" or "" (blank = nothing no characters).
* {{Tlx|Yesno|yes}} → "yes" (also applies to "Yes", "YeS", etc, "Y", "y" and "1")
* {{Tlx|Yesno|no}} → "" (also applies to "No", "NO", "nO", "N", "n" and "0")
* {{Tlx|Yesno}} → ""
* {{Tlx|Yesno|¬}} → ""
* {{Tlx|Yesno|purplemonkeydishwasher}} → "yes" (also applies to any other value not given above)
Each of these can be over-ridden.
* {{Tlx|Yesno|yes|yes{{=}}bacon}} → "{{Yesno|yes|yes=bacon}}" (also applies to "Yes", "YeS", etc, "Y", "y" and "1")
* {{Tlx|Yesno|no|no{{=}}ham}} → "{{Yesno|no|no=ham}}" (also applies to "No", "NO", "nO", "N", "n" and "0")
* {{Tlx|Yesno||blank{{=}}eggs}} → "{{Yesno||blank=eggs}}"
** but {{Tlx|Yesno||no{{=}}ham}} → "{{Yesno||no=ham}}"
** and {{Tlx|Yesno||blank{{=}}eggs|no{{=}}ham}} → "{{Yesno||blank=eggs|no=ham}}"
* {{Tlx|Yesno|¬|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬|¬=sausage|blank=eggs|no=ham}}"
** and {{Tlx|Yesno|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬=sausage|blank=eggs|no=ham}}"
* {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}} → "{{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}}" (also applies to any other value not given above)
** but {{Tlx|Yesno|purplemonkeydishwasher|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|yes=bacon}}"
** and {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|def=cup-of-tea|yes=bacon}}"
This may be used (apparently perversely) thus:
* {{Tlx|Yesno|yes|yes{{=}}no|no{{=}}yes}} → "{{Yesno|yes|yes=no|no=yes}}"
* {{Tlx|Yesno|no|yes{{=}}no|no{{=}}yes}} → "{{Yesno|no|yes=no|no=yes}}"
This creates a logical inversion.
== TemplateData ==
<!-- {{TemplateData header}} -->
<templatedata>
{
"description": {
"en": "This template normalises an input to be a yes or nil output."
},
"format": "inline",
"params": {
"1": {
"label": {
"en": "Input value"
},
"description": {
"en": "The value to be evaluated."
},
"type": "string",
"required": true
},
"yes": {
"label": {
"en": "Output on yes"
},
"description": {
"en": "Specifies the output of the template when the input value is a case-insensitive forms of 'Yes', 'Y', 'True' or '1'."
},
"type": "string",
"required": false
},
"no": {
"label": {
"en": "Output on no"
},
"description": {
"en": "Specifies the output of the template when the input value is a case-insensitive forms of 'No', 'N', 'False', or '0'."
},
"type": "string",
"required": false
},
"blank": {
"label": {
"en": "Output on blank input"
},
"description": {
"en": "Specifies the output of the template when the input value is defined but is either empty or contains nothing but whitespace character(s)."
},
"type": "string",
"required": false
},
"¬": {
"label": {
"en": "Output on ¬"
},
"description": {
"en": "Specifies the output of the template when the input value is either '¬' or entirely missing (undefined)."
},
"type": "string",
"required": false
},
"def": {
"label": {
"en": "Definite output"
},
"description": {
"en": "Specifies the output of the template when the input value is defined but not a form of 'yes', 'no', '1', '0', '¬' or blank."
},
"type": "string",
"required": false
}
}
}
</templatedata>
== See also ==
* [[Module:Yesno]]
<includeonly>{{Sandbox other||
<!-- CATEGORIES AND INTERWIKIS HERE, THANKS -->
[[Category:Utility templates]]
}}</includeonly>
5715454d5a5aa65485043e4addc761a7d31454a5
Category:Utility templates
14
308
402
2025-08-21T15:24:23Z
Sharparam
284703
Created page with "Utility templates for editing."
wikitext
text/x-wiki
Utility templates for editing.
1efcbd3d8e1b3f909b9b968892e50b13cda3f04e
Module:Yesno
828
309
403
2025-08-21T15:25:12Z
Sharparam
284703
Created page with "-- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val =..."
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or val == 'off'
or tonumber(val) == 0
then
return false
else
return default
end
end
f767643e7d12126d020d88d662a3dd057817b9dc
Module:Yesno/doc
828
310
404
2025-08-21T15:36:10Z
Sharparam
284703
Created page with "<noinclude><!-- --><!--{{#ifeq:{{SUBPAGENAME}}|doc||{{Documentation subpage}}}}--><!-- --></noinclude> <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "1", "0", "yes", "no", etc...."
wikitext
text/x-wiki
<noinclude><!--
--><!--{{#ifeq:{{SUBPAGENAME}}|doc||{{Documentation subpage}}}}--><!--
--></noinclude>
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
This module provides a consistent interface for processing boolean or boolean-style string input.
While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "1", "0", "yes", "no", etc.
This module processes these kinds of strings and turns them into boolean input for Lua to process.
It also returns <code>nil</code> values as <code>nil</code>, to allow for distinctions between <code>nil</code> and <code>false</code>.
The module also accepts other Lua structures as input, i.e. booleans, numbers, tables, and functions.
If it is passed input that it does not recognise as boolean or <code>nil</code>, it is possible to specify a default value to return.
== Syntax ==
<syntaxhighlight lang="lua">
yesno(value, default)
</syntaxhighlight>
<code>value</code> is the value to be tested.
Boolean input or boolean-style input (see below) always evaluates to either <code>true</code> or <code>false</code>, and <code>nil</code> always evaluates to <code>nil</code>.
Other values evaluate to <code>default</code>.
== Usage ==
First, load the module. Note that it can only be loaded from other Lua modules, not from normal wiki pages.
For normal wiki pages you can use {{tlx|yesno}} instead.
<syntaxhighlight lang="lua">
local yesno = require('Module:Yesno')
</syntaxhighlight>
Some input values always return <code>true</code>, and some always return <code>false</code>.
<code>nil</code> values always return <code>nil</code>.
<syntaxhighlight lang="lua">
-- These always return true:
yesno('yes')
yesno('y')
yesno('true')
yesno('t')
yesno('1')
yesno(1)
yesno(true)
-- These always return false:
yesno('no')
yesno('n')
yesno('false')
yesno('f')
yesno('0')
yesno(0)
yesno(false)
-- A nil value always returns nil:
yesno(nil)
</syntaxhighlight>
String values are converted to lower case before they are matched:
<syntaxhighlight lang="lua">
-- These always return true:
yesno('Yes')
yesno('YES')
yesno('yEs')
yesno('Y')
yesno('tRuE')
-- These always return false:
yesno('No')
yesno('NO')
yesno('nO')
yesno('N')
yesno('fALsE')
</syntaxhighlight>
You can specify a default value if <code>yesno</code> receives input other than that listed above.
If you don't supply a default, the module will return <code>nil</code> for these inputs.
<syntaxhighlight lang="lua">
-- These return nil:
yesno('foo')
yesno({})
yesno(5)
yesno(function() return 'This is a function.' end)
-- These return true:
yesno('foo', true)
yesno({}, true)
yesno(5, true)
yesno(function() return 'This is a function.' end, true)
-- These return "bar":
yesno('foo', 'bar')
yesno({}, 'bar')
yesno(5, 'bar')
yesno(function() return 'This is a function.' end, 'bar')
</syntaxhighlight>
Note that the blank string also functions this way:
<syntaxhighlight lang="lua">
yesno('') -- Returns nil.
yesno('', true) -- Returns true.
yesno('', 'bar') -- Returns "bar".
</syntaxhighlight>
Although the blank string usually evaluates to <code>false</code> in wikitext, it evaluates to <code>true</code> in Lua.
This module prefers the Lua behaviour over the wikitext behaviour.
If treating the blank string as <code>false</code> is important for your module, you will need to remove blank arguments at an earlier stage of processing.
<includeonly>{{Sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Modules]]
}}</includeonly><noinclude>
[[Category:Module documentation pages]]
</noinclude>
f0ef7ef64ea0756ea01bcaa9847ceca9782026b5
Template:About
10
311
405
2025-08-21T15:41:21Z
Sharparam
284703
Redirected page to [[Template:Disambiguation]]
wikitext
text/x-wiki
#REDIRECT [[Template:Disambiguation]]
42512ae1befdd6da09e528969fc1aff8da1c9a01
448
405
2025-08-21T16:25:56Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
wikitext
text/x-wiki
#REDIRECT [[Template:Disambiguation]]
42512ae1befdd6da09e528969fc1aff8da1c9a01
449
448
2025-08-21T16:27:25Z
Sharparam
284703
Use WP About template source
wikitext
text/x-wiki
{{#invoke:about|about}}<noinclude>
{{Documentation}}
</noinclude>
34b07e47d9b8220bf56dd9882945ad464b21a731
Module:Arguments
828
312
406
2025-08-21T15:46:08Z
Sharparam
284703
Created page with "-- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string'..."
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
3134ecce8429b810d445e29eae115e2ae4c36c53
Module:Arguments/doc
828
313
407
2025-08-21T15:48:06Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Module:Arguments|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Utility modules]] }}</includeonly> <noinclude> [[Category:Module documentation pages]] </noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Module:Arguments|Module and documentation on Wikipedia]]
<includeonly>{{Sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Utility modules]]
}}</includeonly>
<noinclude>
[[Category:Module documentation pages]]
</noinclude>
28b94b568a78688d3d0ac27f55e89b64d30cbc2c
Module:Redirect
828
314
408
2025-08-21T15:52:26Z
Sharparam
284703
Created page with "-- This module provides functions for getting the target of a redirect page. local p = {} -- Gets a mw.title object, using pcall to avoid generating script errors if we -- are over the expensive function count limit (among other possible causes). local function getTitle(...) local success, titleObj = pcall(mw.title.new, ...) if success then return titleObj else return nil end end -- Gets the name of a page that a redirect leads to, or nil if it isn't a -- redi..."
Scribunto
text/plain
-- This module provides functions for getting the target of a redirect page.
local p = {}
-- Gets a mw.title object, using pcall to avoid generating script errors if we
-- are over the expensive function count limit (among other possible causes).
local function getTitle(...)
local success, titleObj = pcall(mw.title.new, ...)
if success then
return titleObj
else
return nil
end
end
-- Gets the name of a page that a redirect leads to, or nil if it isn't a
-- redirect.
function p.getTargetFromText(text)
local target = string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
) or string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
)
return target and mw.uri.decode(target, 'PATH')
end
-- Gets the target of a redirect. If the page specified is not a redirect,
-- returns nil.
function p.getTarget(page, fulltext)
-- Get the title object. Both page names and title objects are allowed
-- as input.
local titleObj
if type(page) == 'string' or type(page) == 'number' then
titleObj = getTitle(page)
elseif type(page) == 'table' and type(page.getContent) == 'function' then
titleObj = page
else
error(string.format(
"bad argument #1 to 'getTarget'"
.. " (string, number, or title object expected, got %s)",
type(page)
), 2)
end
if not titleObj then
return nil
end
local targetTitle = titleObj.redirectTarget
if targetTitle then
if fulltext then
return targetTitle.fullText
else
return targetTitle.prefixedText
end
else
return nil
end
end
--[[
-- Given a single page name determines what page it redirects to and returns the
-- target page name, or the passed page name when not a redirect. The passed
-- page name can be given as plain text or as a page link.
--
-- Returns page name as plain text, or when the bracket parameter is given, as a
-- page link. Returns an error message when page does not exist or the redirect
-- target cannot be determined for some reason.
--]]
function p.luaMain(rname, bracket, fulltext)
if type(rname) ~= "string" or not rname:find("%S") then
return nil
end
bracket = bracket and "[[%s]]" or "%s"
rname = rname:match("%[%[(.+)%]%]") or rname
local target = p.getTarget(rname, fulltext)
local ret = target or rname
ret = getTitle(ret)
if ret then
if fulltext then
ret = ret.fullText
else
ret = ret.prefixedText
end
return bracket:format(ret)
else
return nil
end
end
-- Provides access to the luaMain function from wikitext.
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
end
-- Returns true if the specified page is a redirect, and false otherwise.
function p.luaIsRedirect(page)
local titleObj = getTitle(page)
if not titleObj then
return false
end
if titleObj.isRedirect then
return true
else
return false
end
end
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
-- if the specified page is a redirect, and the blank string otherwise.
function p.isRedirect(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
if p.luaIsRedirect(args[1]) then
return 'yes'
else
return ''
end
end
return p
a224c45940343d66f49a78b0a39b2045e2c45d20
Category:Utility modules
14
315
409
2025-08-21T15:55:00Z
Sharparam
284703
Created page with "Utility Lua modules."
wikitext
text/x-wiki
Utility Lua modules.
0aa79c3b49606d401d8b0a12fa6c596e821621d8
Category:Module documentation pages
14
316
410
2025-08-21T15:55:36Z
Sharparam
284703
Created page with "Pages that document usage for Lua modules."
wikitext
text/x-wiki
Pages that document usage for Lua modules.
85aa5bf005bae53b26da6d5726824c4daf1e9ab5
Module:Redirect/doc
828
317
411
2025-08-21T15:56:47Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Module:Redirect|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| [[Category:Utility modules]] }}</includeonly> <noinclude> [[Category:Module documentation pages]] </noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Module:Redirect|Module and documentation on Wikipedia]]
<includeonly>{{Sandbox other||
[[Category:Utility modules]]
}}</includeonly>
<noinclude>
[[Category:Module documentation pages]]
</noinclude>
436eeeb7a653286c92f328a118549b21f6c450a5
Module:Wikitext Parsing
828
318
412
2025-08-21T16:00:52Z
Sharparam
284703
Created page with "require("strict") --Helper functions local function startswith(text, subtext) return string.sub(text, 1, #subtext) == subtext end local function endswith(text, subtext) return string.sub(text, -#subtext, -1) == subtext end local function allcases(s) return s:gsub("%a", function(c) return "["..c:upper()..c:lower().."]" end) end local trimcache = {} local whitespace = {[" "]=1, ["\n"]=1, ["\t"]=1, ["\r"]=1} local function cheaptrim(str) --mw.text.trim is surprising..."
Scribunto
text/plain
require("strict")
--Helper functions
local function startswith(text, subtext)
return string.sub(text, 1, #subtext) == subtext
end
local function endswith(text, subtext)
return string.sub(text, -#subtext, -1) == subtext
end
local function allcases(s)
return s:gsub("%a", function(c)
return "["..c:upper()..c:lower().."]"
end)
end
local trimcache = {}
local whitespace = {[" "]=1, ["\n"]=1, ["\t"]=1, ["\r"]=1}
local function cheaptrim(str) --mw.text.trim is surprisingly expensive, so here's an alternative approach
local quick = trimcache[str]
if quick then
return quick
else
-- local out = string.gsub(str, "^%s*(.-)%s*$", "%1")
local lowEnd
local strlen = #str
for i = 1,strlen do
if not whitespace[string.sub(str, i, i)] then
lowEnd = i
break
end
end
if not lowEnd then
trimcache[str] = ""
return ""
end
for i = strlen,1,-1 do
if not whitespace[string.sub(str, i, i)] then
local out = string.sub(str, lowEnd, i)
trimcache[str] = out
return out
end
end
end
end
--[=[ Implementation notes
---- NORMAL HTML TAGS ----
Tags are very strict on how they want to start, but loose on how they end.
The start must strictly follow <[tAgNaMe](%s|>) with no room for whitespace in
the tag's name, but may then flow as they want afterwards, making
<div\nclass\n=\n"\nerror\n"\n> valid
There's no sense of escaping < or >
E.g.
<div class="error\>"> will end at \> despite it being inside a quote
<div class="<span class="error">error</span>"> will not process the larger div
If a tag has no end, it will consume all text instead of not processing
---- NOPROCESSING TAGS (nowiki, pre, syntaxhighlight, source, etc.) ----
(In most comments, <source> will not be mentioned. This is because it is the
deprecated version of <syntaxhighlight>)
No-Processing tags have some interesting differences to the above rules.
For example, their syntax is a lot stricter. While an opening tag appears to
follow the same set of rules, A closing tag can't have any sort of extra
formatting period. While </div a/a> is valid, </nowiki a/a> isn't - only
newlines and spaces/tabs are allowed in closing tags.
Note that, even though <pre> tags cause a visual change when the ending tag has
extra formatting, it won't cause the no-processing effects. For some reason, the
format must be strict for that to apply.
Both the content inside the tag pair and the content inside each side of the
pair is not processed. E.g. <nowiki |}}>|}}</nowiki> would have both of the |}}
escaped in practice.
When something in the code is referenced to as a "Nowiki Tag", it means a tag
which causes wiki text to not be processed, which includes <nowiki>, <pre>,
and <syntaxhighlight>
Since we only care about these tags, we can ignore the idea of an intercepting
tag preventing processing, and just go straight for the first ending we can find
If there is no ending to find, the tag will NOT consume the rest of the text in
terms of processing behaviour (though <pre> will appear to have an effect).
Even if there is no end of the tag, the content inside the opening half will
still be unprocessed, meaning {{X20|<nowiki }}>}} wouldn't end at the first }}
despite there being no ending to the tag.
Note that there are some tags, like <math>, which also function like <nowiki>
which are included in this aswell. Some other tags, like <ref>, have far too
unpredictable behaviour to be handled currently (they'd have to be split and
processed as something seperate - its complicated, but maybe not impossible.)
I suspect that every tag listed in [[Special:Version]] may behave somewhat like
this, but that's far too many cases worth checking for rarely used tags that may
not even have a good reason to contain {{ or }} anyways, so we leave them alone.
---- HTML COMMENTS AND INCLUDEONLY ----
HTML Comments are about as basic as it could get for this
Start at <!--, end at -->, no extra conditions. Simple enough
If a comment has no end, it will eat all text instead of not being processed
includeonly tags function mostly like a regular nowiki tag, with the exception
that the tag will actually consume all future text if not given an ending as
opposed to simply giving up and not changing anything. Due to complications and
the fact that this is far less likely to be present on a page, aswell as being
something that may not want to be escaped, includeonly tags are ignored during
our processing
--]=]
local validtags = {nowiki=1, pre=1, syntaxhighlight=1, source=1, math=1}
--This function expects the string to start with the tag
local function TestForNowikiTag(text, scanPosition)
local tagName = (string.match(text, "^<([^\n />]+)", scanPosition) or ""):lower()
if not validtags[tagName] then
return nil
end
local nextOpener = string.find(text, "<", scanPosition+1) or -1
local nextCloser = string.find(text, ">", scanPosition+1) or -1
if nextCloser > -1 and (nextOpener == -1 or nextCloser < nextOpener) then
local startingTag = string.sub(text, scanPosition, nextCloser)
--We have our starting tag (E.g. '<pre style="color:red">')
--Now find our ending...
if endswith(startingTag, "/>") then --self-closing tag (we are our own ending)
return {
Tag = tagName,
Start = startingTag,
Content = "", End = "",
Length = #startingTag
}
else
local endingTagStart, endingTagEnd = string.find(text, "</"..allcases(tagName).."[ \t\n]*>", scanPosition)
if endingTagStart then --Regular tag formation
local endingTag = string.sub(text, endingTagStart, endingTagEnd)
local tagContent = string.sub(text, nextCloser+1, endingTagStart-1)
return {
Tag = tagName,
Start = startingTag,
Content = tagContent,
End = endingTag,
Length = #startingTag + #tagContent + #endingTag
}
else --Content inside still needs escaping (also linter error!)
return {
Tag = tagName,
Start = startingTag,
Content = "", End = "",
Length = #startingTag
}
end
end
end
return nil
end
local function TestForComment(text, scanPosition) --Like TestForNowikiTag but for <!-- -->
if string.match(text, "^<!%-%-", scanPosition) then
local commentEnd = string.find(text, "-->", scanPosition+4, true)
if commentEnd then
return {
Start = "<!--", End = "-->",
Content = string.sub(text, scanPosition+4, commentEnd-1),
Length = commentEnd-scanPosition+3
}
else --Consumes all text if not given an ending
return {
Start = "<!--", End = "",
Content = string.sub(text, scanPosition+4),
Length = #text-scanPosition+1
}
end
end
return nil
end
--[[ Implementation notes
The goal of this function is to escape all text that wouldn't be parsed if it
was preprocessed (see above implementation notes).
Using keepComments will keep all HTML comments instead of removing them. They
will still be escaped regardless to avoid processing errors
--]]
local function PrepareText(text, keepComments)
local newtext = {}
local scanPosition = 1
while true do
local NextCheck = string.find(text, "<[NnSsPpMm!]", scanPosition) --Advance to the next potential tag we care about
if not NextCheck then --Done
newtext[#newtext+1] = string.sub(text,scanPosition)
break
end
newtext[#newtext+1] = string.sub(text,scanPosition,NextCheck-1)
scanPosition = NextCheck
local Comment = TestForComment(text, scanPosition)
if Comment then
if keepComments then
newtext[#newtext+1] = Comment.Start .. mw.text.nowiki(Comment.Content) .. Comment.End
end
scanPosition = scanPosition + Comment.Length
else
local Tag = TestForNowikiTag(text, scanPosition)
if Tag then
local newTagStart = "<" .. mw.text.nowiki(string.sub(Tag.Start,2,-2)) .. ">"
local newTagEnd =
Tag.End == "" and "" or --Respect no tag ending
"</" .. mw.text.nowiki(string.sub(Tag.End,3,-2)) .. ">"
local newContent = mw.text.nowiki(Tag.Content)
newtext[#newtext+1] = newTagStart .. newContent .. newTagEnd
scanPosition = scanPosition + Tag.Length
else --Nothing special, move on...
newtext[#newtext+1] = string.sub(text, scanPosition, scanPosition)
scanPosition = scanPosition + 1
end
end
end
return table.concat(newtext, "")
end
--[=[ Implementation notes
This function is an alternative to Transcluder's getParameters which considers
the potential for a singular { or } or other odd syntax that %b doesn't like to
be in a parameter's value.
When handling the difference between {{ and {{{, mediawiki will attempt to match
as many sequences of {{{ as possible before matching a {{
E.g.
{{{{A}}}} -> { {{{A}}} }
{{{{{{{{Text|A}}}}}}}} -> {{ {{{ {{{Text|A}}} }}} }}
If there aren't enough triple braces on both sides, the parser will compromise
for a template interpretation.
E.g.
{{{{A}} }} -> {{ {{ A }} }}
While there are technically concerns about things such as wikilinks breaking
template processing (E.g. {{[[}}]]}} doesn't stop at the first }}), it shouldn't
be our job to process inputs perfectly when the input has garbage ({ / } isn't
legal in titles anyways, so if something's unmatched in a wikilink, it's
guaranteed GIGO)
Setting dontEscape will prevent running the input text through EET. Avoid
setting this to true if you don't have to set it.
Returned values:
A table of all templates. Template data goes as follows:
Text: The raw text of the template
Name: The name of the template
Args: A list of arguments
Children: A list of immediate template children
--]=]
--Helper functions
local function boundlen(pair)
return pair.End-pair.Start+1
end
--Main function
local function ParseTemplates(InputText, dontEscape)
--Setup
if not dontEscape then
InputText = PrepareText(InputText)
end
local function finalise(text)
if not dontEscape then
return mw.text.decode(text)
else
return text
end
end
local function CreateContainerObj(Container)
Container.Text = {}
Container.Args = {}
Container.ArgOrder = {}
Container.Children = {}
-- Container.Name = nil
-- Container.Value = nil
-- Container.Key = nil
Container.BeyondStart = false
Container.LastIndex = 1
Container.finalise = finalise
function Container:HandleArgInput(character, internalcall)
if not internalcall then
self.Text[#self.Text+1] = character
end
if character == "=" then
if self.Key then
self.Value[#self.Value+1] = character
else
self.Key = cheaptrim(self.Value and table.concat(self.Value, "") or "")
self.Value = {}
end
else --"|" or "}"
if not self.Name then
self.Name = cheaptrim(self.Value and table.concat(self.Value, "") or "")
self.Value = nil
else
self.Value = self.finalise(self.Value and table.concat(self.Value, "") or "")
if self.Key then
self.Key = self.finalise(self.Key)
self.Args[self.Key] = cheaptrim(self.Value)
self.ArgOrder[#self.ArgOrder+1] = self.Key
else
local Key = tostring(self.LastIndex)
self.Args[Key] = self.Value
self.ArgOrder[#self.ArgOrder+1] = Key
self.LastIndex = self.LastIndex + 1
end
self.Key = nil
self.Value = nil
end
end
end
function Container:AppendText(text, ftext)
self.Text[#self.Text+1] = (ftext or text)
if not self.Value then
self.Value = {}
end
self.BeyondStart = self.BeyondStart or (#table.concat(self.Text, "") > 2)
if self.BeyondStart then
self.Value[#self.Value+1] = text
end
end
function Container:Clean(IsTemplate)
self.Text = table.concat(self.Text, "")
if self.Value and IsTemplate then
self.Value = {string.sub(table.concat(self.Value, ""), 1, -3)} --Trim ending }}
self:HandleArgInput("|", true) --Simulate ending
end
self.Value = nil
self.Key = nil
self.BeyondStart = nil
self.LastIndex = nil
self.finalise = nil
self.HandleArgInput = nil
self.AppendText = nil
self.Clean = nil
end
return Container
end
--Step 1: Find and escape the content of all wikilinks on the page, which are stronger than templates (see implementation notes)
local scannerPosition = 1
local wikilinks = {}
local openWikilinks = {}
while true do
local Position, _, Character = string.find(InputText, "([%[%]])%1", scannerPosition)
if not Position then --Done
break
end
scannerPosition = Position+2 --+2 to pass the [[ / ]]
if Character == "[" then --Add a [[ to the pending wikilink queue
openWikilinks[#openWikilinks+1] = Position
else --Pair up the ]] to any available [[
if #openWikilinks >= 1 then
local start = table.remove(openWikilinks) --Pop the latest [[
wikilinks[start] = {Start=start, End=Position+1, Type="Wikilink"} --Note the pair
end
end
end
--Step 2: Find the bounds of every valid template and variable ({{ and {{{)
local scannerPosition = 1
local templates = {}
local variables = {}
local openBrackets = {}
while true do
local Start, _, Character = string.find(InputText, "([{}])%1", scannerPosition)
if not Start then --Done (both 9e9)
break
end
local _, End = string.find(InputText, "^"..Character.."+", Start)
scannerPosition = Start --Get to the {{ / }} set
if Character == "{" then --Add the {{+ set to the queue
openBrackets[#openBrackets+1] = {Start=Start, End=End}
else --Pair up the }} to any available {{, accounting for {{{ / }}}
local BracketCount = End-Start+1
while BracketCount >= 2 and #openBrackets >= 1 do
local OpenSet = table.remove(openBrackets)
if boundlen(OpenSet) >= 3 and BracketCount >= 3 then --We have a {{{variable}}} (both sides have 3 spare)
variables[OpenSet.End-2] = {Start=OpenSet.End-2, End=scannerPosition+2, Type="Variable"} --Done like this to ensure chronological order
BracketCount = BracketCount - 3
OpenSet.End = OpenSet.End - 3
scannerPosition = scannerPosition + 3
else --We have a {{template}} (both sides have 2 spare, but at least one side doesn't have 3 spare)
templates[OpenSet.End-1] = {Start=OpenSet.End-1, End=scannerPosition+1, Type="Template"} --Done like this to ensure chronological order
BracketCount = BracketCount - 2
OpenSet.End = OpenSet.End - 2
scannerPosition = scannerPosition + 2
end
if boundlen(OpenSet) >= 2 then --Still has enough data left, leave it in
openBrackets[#openBrackets+1] = OpenSet
end
end
end
scannerPosition = End --Now move past the bracket set
end
--Step 3: Re-trace every object using their known bounds, collecting our parameters with (slight) ease
local scannerPosition = 1
local activeObjects = {}
local finalObjects = {}
while true do
local LatestObject = activeObjects[#activeObjects] --Commonly needed object
local NNC, _, Character --NNC = NextNotableCharacter
if LatestObject then
NNC, _, Character = string.find(InputText, "([{}%[%]|=])", scannerPosition)
else
NNC, _, Character = string.find(InputText, "([{}])", scannerPosition) --We are only after templates right now
end
if not NNC then
break
end
if NNC > scannerPosition and LatestObject then
local scannedContent = string.sub(InputText, scannerPosition, NNC-1)
LatestObject:AppendText(scannedContent, finalise(scannedContent))
end
scannerPosition = NNC+1
if Character == "{" or Character == "[" then
local Container = templates[NNC] or variables[NNC] or wikilinks[NNC]
if Container then
CreateContainerObj(Container)
if Container.Type == "Template" then
Container:AppendText("{{")
scannerPosition = NNC+2
elseif Container.Type == "Variable" then
Container:AppendText("{{{")
scannerPosition = NNC+3
else --Wikilink
Container:AppendText("[[")
scannerPosition = NNC+2
end
if LatestObject and Container.Type == "Template" then --Only templates count as children
LatestObject.Children[#LatestObject.Children+1] = Container
end
activeObjects[#activeObjects+1] = Container
elseif LatestObject then
LatestObject:AppendText(Character)
end
elseif Character == "}" or Character == "]" then
if LatestObject then
LatestObject:AppendText(Character)
if LatestObject.End == NNC then
if LatestObject.Type == "Template" then
LatestObject:Clean(true)
finalObjects[#finalObjects+1] = LatestObject
else
LatestObject:Clean(false)
end
activeObjects[#activeObjects] = nil
local NewLatest = activeObjects[#activeObjects]
if NewLatest then
NewLatest:AppendText(LatestObject.Text) --Append to new latest
end
end
end
else --| or =
if LatestObject then
LatestObject:HandleArgInput(Character)
end
end
end
--Step 4: Fix the order
local FixedOrder = {}
local SortableReference = {}
for _,Object in next,finalObjects do
SortableReference[#SortableReference+1] = Object.Start
end
table.sort(SortableReference)
for i = 1,#SortableReference do
local start = SortableReference[i]
for n,Object in next,finalObjects do
if Object.Start == start then
finalObjects[n] = nil
Object.Start = nil --Final cleanup
Object.End = nil
Object.Type = nil
FixedOrder[#FixedOrder+1] = Object
break
end
end
end
--Finished, return
return FixedOrder
end
local p = {}
--Main entry points
p.PrepareText = PrepareText
p.ParseTemplates = ParseTemplates
--Extra entry points, not really required
p.TestForNowikiTag = TestForNowikiTag
p.TestForComment = TestForComment
return p
--[==[ console tests
local s = [=[Hey!{{Text|<nowiki | ||>
Hey! }}
A</nowiki>|<!--AAAAA|AAA-->Should see|Shouldn't see}}]=]
local out = p.PrepareText(s)
mw.logObject(out)
local s = [=[B<!--
Hey!
-->A]=]
local out = p.TestForComment(s, 2)
mw.logObject(out); mw.log(string.sub(s, 2, out.Length))
local a = p.ParseTemplates([=[
{{User:Aidan9382/templates/dummy
|A|B|C {{{A|B}}} { } } {
|<nowiki>D</nowiki>
|<pre>E
|F</pre>
|G|=|a=|A = [[{{PAGENAME}}|A=B]]{{Text|1==<nowiki>}}</nowiki>}}|A B=Success}}
]=])
mw.logObject(a)
]==]
0e960df7b62b2131c8e704eb249b7ce1654ad5c3
Module:Wikitext Parsing/doc
828
319
413
2025-08-21T16:01:43Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Module:Wikitext Parsing|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Module:Wikitext Parsing|Module and documentation on Wikipedia]]
<noinclude>[[Category:Module documentation pages]]</noinclude>
ac42eaa08fed582c3bee9fe96d8926c3a348bd4c
Module:Disambiguation/templates
828
320
414
2025-08-21T16:06:25Z
Sharparam
284703
Created page with "-- This page contains a table of all disambiguation templates and their -- redirects. Templates names are capitalized, and the Template: prefix is -- removed. Templates are grouped with the main template first, followed by -- its redirects. return { -- ["Disambiguation"] = true, -- ["DAB"] = true, -- ["Dab"] = true, -- ["Dab page"] = true, -- ["Dabpage"] = true, -- ["Dbig"] = true, -- ["Dis"] = true, -- ["Disam"] = true, -- ["Disamb"] = true, -- ["Disambig"] =..."
Scribunto
text/plain
-- This page contains a table of all disambiguation templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
-- ["Disambiguation"] = true,
-- ["DAB"] = true,
-- ["Dab"] = true,
-- ["Dab page"] = true,
-- ["Dabpage"] = true,
-- ["Dbig"] = true,
-- ["Dis"] = true,
-- ["Disam"] = true,
-- ["Disamb"] = true,
-- ["Disambig"] = true,
-- ["Disambig misspelling"] = true,
-- ["Disambiguation page"] = true,
-- ["Project disambiguation"] = true,
-- ["Shortcut disambig"] = true,
-- ["Disambiguation cleanup"] = true,
-- ["Cleanup disambig"] = true,
-- ["Cleanup disambiguation"] = true,
-- ["CleanupDisambig"] = true,
-- ["Dab cleanup"] = true,
-- ["Dab-cleanup"] = true,
-- ["Dabclean"] = true,
-- ["Disamb-cleanup"] = true,
-- ["Disambcleanup"] = true,
-- ["Disambig cleanup"] = true,
-- ["Disambig-cleanup"] = true,
-- ["Disambig-CU"] = true,
-- ["Disambig-cu"] = true,
-- ["Disambigcleanup"] = true,
-- ["Disambiguate-cleanup"] = true,
-- ["Disambiguation-cleanup"] = true,
-- ["Template disambiguation"] = true,
-- ["Template ambiguous"] = true,
-- ["Template dab"] = true,
-- ["Template disambig"] = true
}
a19e74ebb8bfa5dd246ddd3c8e8c7856e6846121
Module:Disambiguation/templates/doc
828
321
415
2025-08-21T16:07:04Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Module:Disambiguation/templates|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Module:Disambiguation/templates|Module and documentation on Wikipedia]]
<noinclude>[[Category:Module documentation pages]]</noinclude>
bb28f1f1a9660ec5d6848300320ed9d8d83cca8a
Module:Disambiguation
828
322
416
2025-08-21T16:07:30Z
Sharparam
284703
Created page with "local p = {} local mRedirect = require('Module:Redirect') local disambiguationTemplates = mw.loadData('Module:Disambiguation/templates') local PrepareText = require('Module:Wikitext Parsing').PrepareText local function capitalize(s) -- This function only works on ASCII strings. If your wiki has -- disambiguation templates that use Unicode strings, use the commented-out -- line instead. Enwiki uses ASCII string manipulation only here to improve -- performance. retur..."
Scribunto
text/plain
local p = {}
local mRedirect = require('Module:Redirect')
local disambiguationTemplates = mw.loadData('Module:Disambiguation/templates')
local PrepareText = require('Module:Wikitext Parsing').PrepareText
local function capitalize(s)
-- This function only works on ASCII strings. If your wiki has
-- disambiguation templates that use Unicode strings, use the commented-out
-- line instead. Enwiki uses ASCII string manipulation only here to improve
-- performance.
return s:sub(1, 1):upper() .. s:sub(2, -1)
-- return mw.ustring.upper(mw.ustring.sub(1, 1)) .. mw.ustring.sub(2, -1)
end
local function isDisambiguationTemplate(template)
return disambiguationTemplates[capitalize(template)] or false
end
p.isDisambiguation = function(content)
-- false if there is no content
if content == nil then
return false
end
-- redirects are not disambiguation pages
if mRedirect.getTargetFromText(content) ~= nil then
return false
end
-- check for disambiguation templates in the content
local templateNames = {}
-- remove nowiki content and html comments for this check
local activecontent = PrepareText(content)
for template in string.gmatch(activecontent, "{{%s*([^|}]-)%s*[|}]") do
if isDisambiguationTemplate(template) then
return true
end
end
-- check for magic word
if string.find(content, "__DISAMBIG__", 1, true) ~= nil then
return true
end
return false
end
p._isDisambiguationPage = function(page)
-- Look "(disambiguation)" in the title
if string.find(page, "(disambiguation)",0,true) ~= nil then
return true;
end
-- Look for disamiguation template in page content
local title = mw.title.new(page)
if not title then return false end
local content = title:getContent()
return p.isDisambiguation(content)
end
-- Entry points for templates
p.isDisambiguationPage = function(frame)
local title = frame.args[1]
return p._isDisambiguationPage(title) and "yes" or ""
end
return p
8095747d2821274b0f3dbe8e4bfff65ac7787407
Module:Disambiguation/doc
828
323
417
2025-08-21T16:08:23Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Module:Disambiguation|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| [[Category:Utility modules]] }}</includeonly> <noinclude>[[Category:Module documentation pages]]</noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Module:Disambiguation|Module and documentation on Wikipedia]]
<includeonly>{{Sandbox other||
[[Category:Utility modules]]
}}</includeonly>
<noinclude>[[Category:Module documentation pages]]</noinclude>
0f383624152331145768651c39cb19c828697ea9
MediaWiki:Sidebar
8
324
418
2025-08-21T16:21:20Z
Sharparam
284703
Add import and export links
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help-mediawiki
* sidebar-customizing-wiki
** MediaWiki:Sidebar|sidebar-edit-sidebar
** MediaWiki:Common.css|sidebar-edit-common-css
** MediaWiki:Vector.css|sidebar-edit-vector-css
** MediaWiki:Common.js|sidebar-edit-common-js
** Special:Gadgets|sidebar-gadgets
** Special:Import|sidebar-special-import
** Special:Export|sidebar-special-export
** Special:AllPages|sidebar-all-pages
** Special:SpecialPages|sidebar-special-pages
* wiki.gg
** support:|sidebar-support-wiki
** Wikigg-ticket-link|sidebar-submit-ticket
** wikigg-socialmedia-joinlink|wikigg-socialmedia-jointext-sidebar
4650a34e226dda6dd5e60c0168ab899130e28b31
MediaWiki:Sidebar-special-import
8
325
419
2025-08-21T16:22:53Z
Sharparam
284703
Created page with "Import"
wikitext
text/x-wiki
Import
d6fbc9d2bdd580e18ed0bc5805dc26db323d6f5f
MediaWiki:Sidebar-special-export
8
326
420
2025-08-21T16:23:11Z
Sharparam
284703
Created page with "Export"
wikitext
text/x-wiki
Export
f3e4fadb9e370a1e2c0c622c01fc8c77daf93a2c
Module:Exponential search
828
327
422
421
2025-08-21T16:23:41Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
-- This module provides a generic exponential search algorithm.
require[[strict]]
local checkType = require('libraryUtil').checkType
local floor = math.floor
local function midPoint(lower, upper)
return floor(lower + (upper - lower) / 2)
end
local function search(testFunc, i, lower, upper)
if testFunc(i) then
if i + 1 == upper then
return i
end
lower = i
if upper then
i = midPoint(lower, upper)
else
i = i * 2
end
return search(testFunc, i, lower, upper)
else
upper = i
i = midPoint(lower, upper)
return search(testFunc, i, lower, upper)
end
end
return function (testFunc, init)
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 2, init, 'number', true)
if init and (init < 1 or init ~= floor(init) or init == math.huge) then
error(string.format(
"invalid init value '%s' detected in argument #2 to " ..
"'Exponential search' (init value must be a positive integer)",
tostring(init)
), 2)
end
init = init or 2
if not testFunc(1) then
return nil
end
return search(testFunc, init, 1, nil)
end
a9037be0c44536be79b2d7a26155bfb907368ae7
Module:TableTools
828
328
424
423
2025-08-21T16:23:42Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and v ~= v
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
checkType('removeDuplicates', 1, arr, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(arr) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local isNan = p.isNan
local map = {}
for i, v in ipairs(arr) do
if not isNan(v) then
map[v] = i
end
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
checkType("listToSet", 1, arr, "table")
local isNan = p.isNan
local set = {}
for _, v in ipairs(arr) do
if not isNan(v) then
set[v] = true
end
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
if type(orig) ~= "table" then
return orig
end
-- already_seen stores copies of tables indexed by the original table.
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
copy = {}
already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
setmetatable(copy, _deepCopy(mt, true, already_seen))
end
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen or {})
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if searchElement is a member of the array, and false otherwise.
-- Equivalent to JavaScript array.includes(searchElement) or
-- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed
------------------------------------------------------------------------------------
function p.inArray(array, searchElement, fromIndex)
checkType("inArray", 1, array, "table")
-- if searchElement is nil, error?
fromIndex = tonumber(fromIndex)
if fromIndex then
if (fromIndex < 0) then
fromIndex = #array + fromIndex + 1
end
if fromIndex < 1 then fromIndex = 1 end
for _, v in ipairs({unpack(array, fromIndex)}) do
if v == searchElement then
return true
end
end
else
for _, v in pairs(array) do
if v == searchElement then
return true
end
end
end
return false
end
------------------------------------------------------------------------------------
-- merge
--
-- Given the arrays, returns an array containing the elements of each input array
-- in sequence.
------------------------------------------------------------------------------------
function p.merge(...)
local arrays = {...}
local ret = {}
for i, arr in ipairs(arrays) do
checkType('merge', i, arr, 'table')
for _, v in ipairs(arr) do
ret[#ret + 1] = v
end
end
return ret
end
------------------------------------------------------------------------------------
-- extend
--
-- Extends the first array in place by appending all elements from the second
-- array.
------------------------------------------------------------------------------------
function p.extend(arr1, arr2)
checkType('extend', 1, arr1, 'table')
checkType('extend', 2, arr2, 'table')
for _, v in ipairs(arr2) do
arr1[#arr1 + 1] = v
end
end
return p
27b6a4e23d902c05ad6e005059248318bffc2a4e
Module:Namespace detect
828
329
426
425
2025-08-21T16:23:42Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--[[
--------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a --
-- few improvements: all namespaces and all namespace aliases are supported, --
-- and namespace names are detected automatically for the local wiki. The --
-- module can also use the corresponding subject namespace value if it is --
-- used on a talk page. Parameter names can be configured for different wikis --
-- by altering the values in the "cfg" table in --
-- Module:Namespace detect/config. --
-- --
--------------------------------------------------------------------------------
--]]
local data = mw.loadData('Module:Namespace detect/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings
local yesno = require('Module:Yesno')
local mArguments -- Lazily initialise Module:Arguments
local mTableTools -- Lazily initilalise Module:TableTools
local ustringLower = mw.ustring.lower
local p = {}
local function fetchValue(t1, t2)
-- Fetches a value from the table t1 for the first key in array t2 where
-- a non-nil value of t1 exists.
for i, key in ipairs(t2) do
local value = t1[key]
if value ~= nil then
return value
end
end
return nil
end
local function equalsArrayValue(t, value)
-- Returns true if value equals a value in the array t. Otherwise
-- returns false.
for i, arrayValue in ipairs(t) do
if value == arrayValue then
return true
end
end
return false
end
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case of
-- errors, e.g. being over the expensive function count limit.
if page then
local success, pageObject = pcall(mw.title.new, page)
if success then
return pageObject
else
return nil
end
else
return mw.title.getCurrentTitle()
end
end
-- Provided for backward compatibility with other modules
function p.getParamMappings()
return mappings
end
local function getNamespace(args)
-- This function gets the namespace name from the page object.
local page = fetchValue(args, argKeys.demopage)
if page == '' then
page = nil
end
local demospace = fetchValue(args, argKeys.demospace)
if demospace == '' then
demospace = nil
end
local subjectns = fetchValue(args, argKeys.subjectns)
local ret
if demospace then
-- Handle "demospace = main" properly.
if equalsArrayValue(argKeys.main, ustringLower(demospace)) then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- Get the subject namespace if the option is set,
-- otherwise use "talk".
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = 'talk'
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
ret = ret:gsub('_', ' ')
return ustringLower(ret)
end
function p._main(args)
-- Check the parameters stored in the mappings table for any matches.
local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys
local params = mappings[namespace] or {}
local ret = fetchValue(args, params)
--[[
-- If there were no matches, return parameters for other namespaces.
-- This happens if there was no text specified for the namespace that
-- was detected or if the demospace parameter is not a valid
-- namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
--]]
if ret == nil then
ret = fetchValue(args, argKeys.other)
end
return ret
end
function p.main(frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {removeBlanks = false})
local ret = p._main(args)
return ret or ''
end
function p.table(frame)
--[[
-- Create a wikitable of all subject namespace parameters, for
-- documentation purposes. The talk parameter is optional, in case it
-- needs to be excluded in the documentation.
--]]
-- Load modules and initialise variables.
mTableTools = require('Module:TableTools')
local namespaces = mw.site.namespaces
local cfg = data.cfg
local useTalk = type(frame) == 'table'
and type(frame.args) == 'table'
and yesno(frame.args.talk) -- Whether to use the talk parameter.
-- Get the header names.
local function checkValue(value, default)
if type(value) == 'string' then
return value
else
return default
end
end
local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace')
local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases')
-- Put the namespaces in order.
local mappingsOrdered = {}
for nsname, params in pairs(mappings) do
if useTalk or nsname ~= 'talk' then
local nsid = namespaces[nsname].id
-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.
nsid = nsid + 1
mappingsOrdered[nsid] = params
end
end
mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)
-- Build the table.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. nsHeader
.. '\n! ' .. aliasesHeader
for i, params in ipairs(mappingsOrdered) do
for j, param in ipairs(params) do
if j == 1 then
ret = ret .. '\n|-'
.. '\n| <code>' .. param .. '</code>'
.. '\n| '
elseif j == 2 then
ret = ret .. '<code>' .. param .. '</code>'
else
ret = ret .. ', <code>' .. param .. '</code>'
end
end
end
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
a4757000273064f151f0f22dc0e139092e5ff443
Module:Namespace detect/config
828
330
428
427
2025-08-21T16:23:42Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0e4ff08d13c4b664d66b32c232deb129b77c1a56
Module:Namespace detect/data
828
331
430
429
2025-08-21T16:23:42Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local defaultKeys = {
'main',
'talk',
'other',
'subjectns',
'demospace',
'demopage'
}
local argKeys = {}
for i, defaultKey in ipairs(defaultKeys) do
argKeys[defaultKey] = {defaultKey}
end
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
d224f42a258bc308ef3ad8cc8686cd7a4f47d005
Module:Pagetype
828
332
432
431
2025-08-21T16:23:42Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- This meta-module which automatically detects namespaces, and allows --
-- for a great deal of customisation. It can easily be ported to other --
-- wikis by changing the values in the [[Module:Pagetype/config]]. --
-- --
--------------------------------------------------------------------------------
-- Load config.
local cfg = mw.loadData('Module:Pagetype/config')
-- Load required modules.
local yesno = require('Module:Yesno')
local p = {}
-- Look up a namespace argument in the args table.
local function lookUpNamespaceArg(args, key)
local arg = args[key]
-- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave
-- other values the same.
return yesno(arg, arg)
end
-- Append multiple values to an array
local function appendMultiple(target, source)
for _, value in ipairs(source) do
table.insert(target, value)
end
end
-- Get argument keys for a title's namespace
local function getNamespaceArgKeys(title)
local nsInfo = mw.site.namespaces[title.namespace]
local customAliases = cfg.customNamespaceAliases[title.namespace] or {}
local keys = {}
if nsInfo.name ~= '' then
table.insert(keys, nsInfo.name)
end
if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then
table.insert(keys, nsInfo.canonicalName)
end
appendMultiple(keys, nsInfo.aliases)
appendMultiple(keys, customAliases)
return keys
end
-- Get the argument for a title's namespace, if it was specified in the args table.
local function getNamespaceArg(title, args)
if title.isTalkPage then
return lookUpNamespaceArg(args, cfg.talk)
end
for _, key in ipairs(getNamespaceArgKeys(title)) do
local arg = lookUpNamespaceArg(args, mw.ustring.lower(key))
if arg ~= nil then
return arg
end
end
return nil
end
-- Look up a page type specific to the title's namespace
local function getExplicitPageType(title)
if title.isTalkPage then
return cfg.talkDefault
else
return cfg.pagetypes[title.namespace]
end
end
-- Get a default page type that is not specific to the title's namespace
local function getDefaultPageType(args)
local other = lookUpNamespaceArg(args, cfg.other)
if type(other) == 'string' then
return other
else
return cfg.otherDefault
end
end
local function detectRedirects(title, args)
local redirect = lookUpNamespaceArg(args, cfg.redirect)
if redirect == false then
-- Don't detect redirects if they have been specifically disallowed.
return nil
end
-- Allow custom values for redirects.
if not title.isRedirect then
return nil
elseif type(redirect) == 'string' then
return redirect
else
return cfg.redirectDefault
end
end
local function capitalize(pageType)
local first = mw.ustring.sub(pageType, 1, 1)
local rest = mw.ustring.sub(pageType, 2)
return mw.ustring.upper(first) .. rest
end
local function pluralize(pageType)
if cfg.irregularPlurals[pageType] then
return cfg.irregularPlurals[pageType]
else
return pageType .. cfg.plural -- often 's'
end
end
local function parseContent(title, args, optionsList)
if title.namespace==828 and title.subpageText~='doc' -- don't detect modules
or not title.exists -- can't check unless page exists
then
return nil
end
local content = title:getContent()
if content == nil then
return nil
end
local templates -- lazily evaluated
for _, options in next, optionsList do
local list, parameter, default, articleOnly = unpack(options, 1, 4)
if not articleOnly or title.namespace==0 then -- only check for templates if we should...
local out = lookUpNamespaceArg(args, parameter)
if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them
if not templates then
templates = {} -- do our delayed evaluation now that we are required to
content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect
for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do
templates[#templates+1] = capitalize(template)
end
end
local wantedTemplates = mw.loadData('Module:Pagetype/' .. list)
local templateFound = false
for _, template in next, templates do
if wantedTemplates[template] then
templateFound = true
break
end
end
if templateFound then
if type(out)=='string' then
return out
elseif out ~= false and default then
return default
end
end
end
end
end
end
-- Find pages which do not exist
local function nonExistent(title, args)
local arg = lookUpNamespaceArg(args, cfg.ne)
if arg == false then
return nil
end
local exists = false
if title.exists then -- not an article if it does not exist
exists = true
elseif title.namespace==8 and mw.message.new(title.text):exists() then
exists = true
elseif title.namespace==6 and title.fileExists then
exists = true
end
if not exists then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
end
end
-- Get page types for mainspaces pages with an explicit class specified
local function getMainNamespaceClassPageType(title, args)
local class = args[1]
if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match
class = mw.ustring.lower(class)
end
local arg = lookUpNamespaceArg(args, cfg.na)
if arg == false then -- don't check for this class if it is specifically disallowed
return nil
end
if cfg.naAliases[class] then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
else
return nil
end
end
-- Get page type specified by an explicit namespace argument.
local function getNamespaceArgPageType(title, args)
local namespaceArg = getNamespaceArg(title, args)
if namespaceArg == true then
-- Namespace has been explicitly enabled, so return the default for
-- this namespace
return getExplicitPageType(title)
elseif namespaceArg == false then
-- Namespace has been explicitly disabled
return getDefaultPageType(args)
elseif namespaceArg then
-- This namespaces uses custom text
return namespaceArg
else
return nil
end
end
-- Get page type not specified or detected by other means
local function getOtherPageType(title, args)
-- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes.
local isInDefaultActiveNamespace = false
local defaultNamespacesKey = args[cfg.defaultns]
if defaultNamespacesKey == cfg.defaultnsAll then
isInDefaultActiveNamespace = true
else
local defaultNamespaces
if defaultNamespacesKey == cfg.defaultnsExtended then
defaultNamespaces = cfg.extendedNamespaces
elseif defaultNamespacesKey == cfg.defaultnsNone then
defaultNamespaces = {}
else
defaultNamespaces = cfg.defaultNamespaces
end
isInDefaultActiveNamespace = defaultNamespaces[title.namespace]
end
if isInDefaultActiveNamespace then
return getExplicitPageType(title)
else
return getDefaultPageType(args)
end
end
function p._main(args)
local title
if args.page then
title = mw.title.new(args.page)
else
title = mw.title.getCurrentTitle()
end
if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then
title = title.subjectPageTitle
end
local pageType = detectRedirects(title, args)
or nonExistent(title, args)
or parseContent(title, args, {
{'softredirect', cfg.softRedirect, cfg.softRedirectDefault},
{'setindex', cfg.sia, cfg.siaDefault, true},
{'disambiguation', cfg.dab, cfg.dabDefault, true},
{'rfd', cfg.rfd, cfg.rfdDefault},
})
or (title.namespace == 0 and getMainNamespaceClassPageType(title, args))
or getNamespaceArgPageType(title, args)
or getOtherPageType(title, args)
if yesno(args.plural, false) then
pageType = pluralize(pageType)
end
if yesno(args.caps, false) then
pageType = capitalize(pageType)
end
return pageType
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
return p._main(args)
end
return p
cb47b460d74d5df739ee7e300eeae512798bc475
451
432
2025-08-21T16:33:26Z
Sharparam
284703
Disable some unused types
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- This meta-module which automatically detects namespaces, and allows --
-- for a great deal of customisation. It can easily be ported to other --
-- wikis by changing the values in the [[Module:Pagetype/config]]. --
-- --
--------------------------------------------------------------------------------
-- Load config.
local cfg = mw.loadData('Module:Pagetype/config')
-- Load required modules.
local yesno = require('Module:Yesno')
local p = {}
-- Look up a namespace argument in the args table.
local function lookUpNamespaceArg(args, key)
local arg = args[key]
-- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave
-- other values the same.
return yesno(arg, arg)
end
-- Append multiple values to an array
local function appendMultiple(target, source)
for _, value in ipairs(source) do
table.insert(target, value)
end
end
-- Get argument keys for a title's namespace
local function getNamespaceArgKeys(title)
local nsInfo = mw.site.namespaces[title.namespace]
local customAliases = cfg.customNamespaceAliases[title.namespace] or {}
local keys = {}
if nsInfo.name ~= '' then
table.insert(keys, nsInfo.name)
end
if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then
table.insert(keys, nsInfo.canonicalName)
end
appendMultiple(keys, nsInfo.aliases)
appendMultiple(keys, customAliases)
return keys
end
-- Get the argument for a title's namespace, if it was specified in the args table.
local function getNamespaceArg(title, args)
if title.isTalkPage then
return lookUpNamespaceArg(args, cfg.talk)
end
for _, key in ipairs(getNamespaceArgKeys(title)) do
local arg = lookUpNamespaceArg(args, mw.ustring.lower(key))
if arg ~= nil then
return arg
end
end
return nil
end
-- Look up a page type specific to the title's namespace
local function getExplicitPageType(title)
if title.isTalkPage then
return cfg.talkDefault
else
return cfg.pagetypes[title.namespace]
end
end
-- Get a default page type that is not specific to the title's namespace
local function getDefaultPageType(args)
local other = lookUpNamespaceArg(args, cfg.other)
if type(other) == 'string' then
return other
else
return cfg.otherDefault
end
end
local function detectRedirects(title, args)
local redirect = lookUpNamespaceArg(args, cfg.redirect)
if redirect == false then
-- Don't detect redirects if they have been specifically disallowed.
return nil
end
-- Allow custom values for redirects.
if not title.isRedirect then
return nil
elseif type(redirect) == 'string' then
return redirect
else
return cfg.redirectDefault
end
end
local function capitalize(pageType)
local first = mw.ustring.sub(pageType, 1, 1)
local rest = mw.ustring.sub(pageType, 2)
return mw.ustring.upper(first) .. rest
end
local function pluralize(pageType)
if cfg.irregularPlurals[pageType] then
return cfg.irregularPlurals[pageType]
else
return pageType .. cfg.plural -- often 's'
end
end
local function parseContent(title, args, optionsList)
if title.namespace==828 and title.subpageText~='doc' -- don't detect modules
or not title.exists -- can't check unless page exists
then
return nil
end
local content = title:getContent()
if content == nil then
return nil
end
local templates -- lazily evaluated
for _, options in next, optionsList do
local list, parameter, default, articleOnly = unpack(options, 1, 4)
if not articleOnly or title.namespace==0 then -- only check for templates if we should...
local out = lookUpNamespaceArg(args, parameter)
if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them
if not templates then
templates = {} -- do our delayed evaluation now that we are required to
content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect
for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do
templates[#templates+1] = capitalize(template)
end
end
local wantedTemplates = mw.loadData('Module:Pagetype/' .. list)
local templateFound = false
for _, template in next, templates do
if wantedTemplates[template] then
templateFound = true
break
end
end
if templateFound then
if type(out)=='string' then
return out
elseif out ~= false and default then
return default
end
end
end
end
end
end
-- Find pages which do not exist
local function nonExistent(title, args)
local arg = lookUpNamespaceArg(args, cfg.ne)
if arg == false then
return nil
end
local exists = false
if title.exists then -- not an article if it does not exist
exists = true
elseif title.namespace==8 and mw.message.new(title.text):exists() then
exists = true
elseif title.namespace==6 and title.fileExists then
exists = true
end
if not exists then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
end
end
-- Get page types for mainspaces pages with an explicit class specified
local function getMainNamespaceClassPageType(title, args)
local class = args[1]
if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match
class = mw.ustring.lower(class)
end
local arg = lookUpNamespaceArg(args, cfg.na)
if arg == false then -- don't check for this class if it is specifically disallowed
return nil
end
if cfg.naAliases[class] then
if type(arg) == 'string' then
return arg
else
return cfg.naDefault
end
else
return nil
end
end
-- Get page type specified by an explicit namespace argument.
local function getNamespaceArgPageType(title, args)
local namespaceArg = getNamespaceArg(title, args)
if namespaceArg == true then
-- Namespace has been explicitly enabled, so return the default for
-- this namespace
return getExplicitPageType(title)
elseif namespaceArg == false then
-- Namespace has been explicitly disabled
return getDefaultPageType(args)
elseif namespaceArg then
-- This namespaces uses custom text
return namespaceArg
else
return nil
end
end
-- Get page type not specified or detected by other means
local function getOtherPageType(title, args)
-- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes.
local isInDefaultActiveNamespace = false
local defaultNamespacesKey = args[cfg.defaultns]
if defaultNamespacesKey == cfg.defaultnsAll then
isInDefaultActiveNamespace = true
else
local defaultNamespaces
if defaultNamespacesKey == cfg.defaultnsExtended then
defaultNamespaces = cfg.extendedNamespaces
elseif defaultNamespacesKey == cfg.defaultnsNone then
defaultNamespaces = {}
else
defaultNamespaces = cfg.defaultNamespaces
end
isInDefaultActiveNamespace = defaultNamespaces[title.namespace]
end
if isInDefaultActiveNamespace then
return getExplicitPageType(title)
else
return getDefaultPageType(args)
end
end
function p._main(args)
local title
if args.page then
title = mw.title.new(args.page)
else
title = mw.title.getCurrentTitle()
end
if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then
title = title.subjectPageTitle
end
local pageType = detectRedirects(title, args)
or nonExistent(title, args)
or parseContent(title, args, {
{'softredirect', cfg.softRedirect, cfg.softRedirectDefault},
-- {'setindex', cfg.sia, cfg.siaDefault, true},
{'disambiguation', cfg.dab, cfg.dabDefault, true},
-- {'rfd', cfg.rfd, cfg.rfdDefault},
})
or (title.namespace == 0 and getMainNamespaceClassPageType(title, args))
or getNamespaceArgPageType(title, args)
or getOtherPageType(title, args)
if yesno(args.plural, false) then
pageType = pluralize(pageType)
end
if yesno(args.caps, false) then
pageType = capitalize(pageType)
end
return pageType
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
return p._main(args)
end
return p
fadbfaea763964bc8d117a6fa7f890efde4cbf12
Module:Pagetype/config
828
333
434
433
2025-08-21T16:23:43Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Pagetype configuration data --
-- This page holds localisation and configuration data for Module:Pagetype. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
-- This table holds the default page types for each namespace. Keys to this
-- table should be integers that can be used as keys to mw.site.namespaces.
cfg.pagetypes = {
[0] = 'article', -- Main namespace
[2] = 'user page',
[4] = 'project page',
[6] = 'file',
[8] = 'interface page', -- MediaWiki namespace
[10] = 'template',
[12] = 'help page',
[14] = 'category',
[100] = 'portal',
[118] = 'draft',
[710] = 'Timed Text page',
[828] = 'module',
[2300] = 'gadget',
[2302] = 'gadget definition',
[-1] = 'special page',
[-2] = 'file', -- Media namespace
}
-- This table holds the namespaces to be looked up from cfg.pagetypes by
-- default.
cfg.defaultNamespaces = {
[0] = true, -- main
[6] = true, -- file
[10] = true, -- template
[14] = true, -- category
[828] = true, -- module
}
-- This table holds the namespaces to be looked up from cfg.pagetypes if
-- cfg.defaultnsExtended is set.
cfg.extendedNamespaces = {
[0] = true, -- main
[2] = true, -- user
[4] = true, -- project
[6] = true, -- file
[8] = true, -- mediawiki
[10] = true, -- template
[12] = true, -- help
[14] = true, -- category
[100] = true, -- portal
[118] = true, -- draft
[828] = true, -- module
}
-- This table holds custom aliases for each namespace.
cfg.customNamespaceAliases = {
[0] = {'main'},
}
-- The parameter name to set which default namespace values to be looked up from
-- cfg.pagetypes.
cfg.defaultns = 'defaultns'
-- The value of cfg.defaultns to set all namespaces, including talk.
cfg.defaultnsAll = 'all'
-- The value of cfg.defaultns to set the namespaces listed in
-- cfg.extendedNamespaces
cfg.defaultnsExtended = 'extended'
-- The value of cfg.defaultns to set no default namespaces.
cfg.defaultnsNone = 'none'
-- The parameter name to use for talk pages.
cfg.talk = 'talk'
-- The default value for talk pages.
cfg.talkDefault = 'talk page'
-- The parameter name to use for disambiguation pages page.
cfg.dab = 'dab'
-- The parameter name to use for non-existent pages.
cfg.ne = 'nonexistent'
cfg.neDefault = 'page'
cfg.softRedirect = 'soft_redirect'
cfg.softRedirectDefault = 'redirect'
cfg.sia = 'sia'
cfg.siaDefault = 'article'
cfg.rfd = 'redirect'
cfg.rfdDefault = 'redirect'
-- This table holds the different possible aliases for disambiguation-class
-- pages. These should be lower-case.
cfg.dabAliases = {
['disambiguation'] = true,
['disambig'] = true,
['disamb'] = true,
['dab'] = true,
}
-- The default value for disambiguation pages.
cfg.dabDefault = 'page'
-- The parameter name to use for N/A-class page.
cfg.na = 'na'
-- This table holds the different possible aliases for N/A-class pages. These
-- should be lower-case.
cfg.naAliases = {
['na'] = true,
['n/a'] = true,
}
-- The default value for N/A-class pages.
cfg.naDefault = 'page'
-- The parameter name to use for redirects.
cfg.redirect = 'redirect'
-- The default value to use for redirects.
cfg.redirectDefault = 'redirect'
-- The parameter name for undefined namespaces.
cfg.other = 'other'
-- The value used if the module detects an undefined namespace.
cfg.otherDefault = 'page'
-- The usual suffix denoting a plural.
cfg.plural = 's'
-- This table holds plurals not formed by a simple suffix.
cfg.irregularPlurals = {
["category"] = "categories"
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line
33b76bd60283986954f6a6203f163f6b304b95ee
Module:Error
828
334
436
435
2025-08-21T16:23:43Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
-- This module implements {{error}}.
local p = {}
local function _error(args)
local tag = mw.ustring.lower(tostring(args.tag))
-- Work out what html tag we should use.
if not (tag == 'p' or tag == 'span' or tag == 'div') then
tag = 'strong'
end
-- Generate the html.
return tostring(mw.html.create(tag)
:addClass('error')
:wikitext(tostring(args.message or args[1] or error('no message specified', 2)))
)
end
function p.error(frame)
local args
if type(frame.args) == 'table' then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
args = frame.args
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
end
-- if the message parameter is present but blank, change it to nil so that Lua will
-- consider it false.
if args.message == "" then
args.message = nil
end
return _error(args)
end
return p
f77bd720c216b5626efe795d3b49462d50971f7d
Template:Error
10
335
438
437
2025-08-21T16:23:43Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
wikitext
text/x-wiki
{{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}<noinclude>
{{documentation}}
</noinclude>
5da54c14258c1b1755a03bccb88dc5d9d0cefb56
Module:Format link
828
336
440
439
2025-08-21T16:23:43Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Format link
--
-- Makes a wikilink from the given link and display values. Links are escaped
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#". Used in
-- the {{format link}} template.
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local mError -- lazily initialise [[Module:Error]]
local yesno -- lazily initialise [[Module:Yesno]]
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
local function maybeItalicize(s, shouldItalicize)
-- Italicize s if s is a string and the shouldItalicize parameter is true.
if s and shouldItalicize then
return '<i>' .. s .. '</i>'
else
return s
end
end
local function parseLink(link)
-- Parse a link and return a table with the link's components.
-- These components are:
-- - link: the link, stripped of any initial colon (always present)
-- - page: the page name (always present)
-- - section: the page name (may be nil)
-- - display: the display text, if manually entered after a pipe (may be nil)
link = removeInitialColon(link)
-- Find whether a faux display value has been added with the {{!}} magic
-- word.
local prePipe, display = link:match('^(.-)|(.*)$')
link = prePipe or link
-- Find the page, if it exists.
-- For links like [[#Bar]], the page will be nil.
local preHash, postHash = link:match('^(.-)#(.*)$')
local page
if not preHash then
-- We have a link like [[Foo]].
page = link
elseif preHash ~= '' then
-- We have a link like [[Foo#Bar]].
page = preHash
end
-- Find the section, if it exists.
local section
if postHash and postHash ~= '' then
section = postHash
end
return {
link = link,
page = page,
section = section,
display = display,
}
end
local function formatDisplay(parsed, options)
-- Formats a display string based on a parsed link table (matching the
-- output of parseLink) and an options table (matching the input options for
-- _formatLink).
local page = maybeItalicize(parsed.page, options.italicizePage)
local section = maybeItalicize(parsed.section, options.italicizeSection)
if (not section) then
return page
elseif (not page) then
return mw.ustring.format('§ %s', section)
else
return mw.ustring.format('%s § %s', page, section)
end
end
local function missingArgError(target)
mError = require('Module:Error')
return mError.error{message =
'Error: no link or target specified! ([[' .. target .. '#Errors|help]])'
}
end
--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------
function p.formatLink(frame)
-- The formatLink export function, for use in templates.
yesno = require('Module:Yesno')
local args = getArgs(frame)
local link = args[1] or args.link
local target = args[3] or args.target
if not (link or target) then
return missingArgError('Template:Format link')
end
return p._formatLink{
link = link,
display = args[2] or args.display,
target = target,
italicizePage = yesno(args.italicizepage),
italicizeSection = yesno(args.italicizesection),
categorizeMissing = args.categorizemissing
}
end
function p._formatLink(options)
-- The formatLink export function, for use in modules.
checkType('_formatLink', 1, options, 'table')
local function check(key, expectedType) --for brevity
checkTypeForNamedArg(
'_formatLink', key, options[key], expectedType or 'string', true
)
end
check('link')
check('display')
check('target')
check('italicizePage', 'boolean')
check('italicizeSection', 'boolean')
check('categorizeMissing')
-- Normalize link and target and check that at least one is present
if options.link == '' then options.link = nil end
if options.target == '' then options.target = nil end
if not (options.link or options.target) then
return missingArgError('Module:Format link')
end
local parsed = parseLink(options.link)
local display = options.display or parsed.display
local catMissing = options.categorizeMissing
local category = ''
-- Find the display text
if not display then display = formatDisplay(parsed, options) end
-- Handle the target option if present
if options.target then
local parsedTarget = parseLink(options.target)
parsed.link = parsedTarget.link
parsed.page = parsedTarget.page
end
-- Test if page exists if a diagnostic category is specified
if catMissing and (mw.ustring.len(catMissing) > 0) then
local title = nil
if parsed.page then title = mw.title.new(parsed.page) end
if title and (not title.isExternal) then
local success, exists = pcall(function() return title.exists end)
if success and not exists then
category = mw.ustring.format('[[Category:%s]]', catMissing)
end
end
end
-- Format the result as a link
if parsed.link == display then
return mw.ustring.format('[[:%s]]%s', parsed.link, category)
else
return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category)
end
end
--------------------------------------------------------------------------------
-- Derived convenience functions
--------------------------------------------------------------------------------
function p.formatPages(options, pages)
-- Formats an array of pages using formatLink and the given options table,
-- and returns it as an array. Nil values are not allowed.
local ret = {}
for i, page in ipairs(pages) do
ret[i] = p._formatLink{
link = page,
categorizeMissing = options.categorizeMissing,
italicizePage = options.italicizePage,
italicizeSection = options.italicizeSection
}
end
return ret
end
return p
1253bdd2683ee4badc33856bfd5499b09a7dca1f
Module:Hatnote list
828
337
442
441
2025-08-21T16:23:43Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote list --
-- --
-- This module produces and formats lists for use in hatnotes. In particular, --
-- it implements the for-see list, i.e. lists of "For X, see Y" statements, --
-- as used in {{about}}, {{redirect}}, and their variants. Also introduced --
-- are andList & orList helpers for formatting lists with those conjunctions. --
--------------------------------------------------------------------------------
local mArguments --initialize lazily
local mFormatLink = require('Module:Format link')
local mHatnote = require('Module:Hatnote')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
--------------------------------------------------------------------------------
-- List stringification helper functions
--
-- These functions are used for stringifying lists, usually page lists inside
-- the "Y" portion of "For X, see Y" for-see items.
--------------------------------------------------------------------------------
--default options table used across the list stringification functions
local stringifyListDefaultOptions = {
conjunction = "and",
separator = ",",
altSeparator = ";",
space = " ",
formatted = false
}
--Searches display text only
local function searchDisp(haystack, needle)
return string.find(
string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle
)
end
-- Stringifies a list generically; probably shouldn't be used directly
local function stringifyList(list, options)
-- Type-checks, defaults, and a shortcut
checkType("stringifyList", 1, list, "table")
if #list == 0 then return nil end
checkType("stringifyList", 2, options, "table", true)
options = options or {}
for k, v in pairs(stringifyListDefaultOptions) do
if options[k] == nil then options[k] = v end
end
local s = options.space
-- Format the list if requested
if options.formatted then
list = mFormatLink.formatPages(
{categorizeMissing = mHatnote.missingTargetCat}, list
)
end
-- Set the separator; if any item contains it, use the alternate separator
local separator = options.separator
for k, v in pairs(list) do
if searchDisp(v, separator) then
separator = options.altSeparator
break
end
end
-- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§"
local conjunction = s .. options.conjunction .. s
if #list == 2 and searchDisp(list[1], "§") or #list > 2 then
conjunction = separator .. conjunction
end
-- Return the formatted string
return mw.text.listToText(list, separator .. s, conjunction)
end
--DRY function
function p.conjList (conj, list, fmt)
return stringifyList(list, {conjunction = conj, formatted = fmt})
end
-- Stringifies lists with "and" or "or"
function p.andList (...) return p.conjList("and", ...) end
function p.orList (...) return p.conjList("or", ...) end
--------------------------------------------------------------------------------
-- For see
--
-- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the
-- {{about}} and {{redirect}} templates and their variants.
--------------------------------------------------------------------------------
--default options table used across the forSee family of functions
local forSeeDefaultOptions = {
andKeyword = 'and',
title = mw.title.getCurrentTitle().text,
otherText = 'other uses',
forSeeForm = 'For %s, see %s.',
}
--Collapses duplicate punctuation at end of string, ignoring italics and links
local function punctuationCollapse (text)
return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text
end
-- Structures arguments into a table for stringification, & options
function p.forSeeArgsToTable (args, from, options)
-- Type-checks and defaults
checkType("forSeeArgsToTable", 1, args, 'table')
checkType("forSeeArgsToTable", 2, from, 'number', true)
from = from or 1
checkType("forSeeArgsToTable", 3, options, 'table', true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- maxArg's gotten manually because getArgs() and table.maxn aren't friends
local maxArg = 0
for k, v in pairs(args) do
if type(k) == 'number' and k > maxArg then maxArg = k end
end
-- Structure the data out from the parameter list:
-- * forTable is the wrapper table, with forRow rows
-- * Rows are tables of a "use" string & a "pages" table of pagename strings
-- * Blanks are left empty for defaulting elsewhere, but can terminate list
local forTable = {}
local i = from
local terminated = false
-- If there is extra text, and no arguments are given, give nil value
-- to not produce default of "For other uses, see foo (disambiguation)"
if options.extratext and i > maxArg then return nil end
-- Loop to generate rows
repeat
-- New empty row
local forRow = {}
-- On blank use, assume list's ended & break at end of this loop
forRow.use = args[i]
if not args[i] then terminated = true end
-- New empty list of pages
forRow.pages = {}
-- Insert first pages item if present
table.insert(forRow.pages, args[i + 1])
-- If the param after next is "and", do inner loop to collect params
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
while args[i + 2] == options.andKeyword do
if args[i + 3] then
table.insert(forRow.pages, args[i + 3])
end
-- Increment to next "and"
i = i + 2
end
-- Increment to next use
i = i + 2
-- Append the row
table.insert(forTable, forRow)
until terminated or i > maxArg
return forTable
end
-- Stringifies a table as formatted by forSeeArgsToTable
function p.forSeeTableToString (forSeeTable, options)
-- Type-checks and defaults
checkType("forSeeTableToString", 1, forSeeTable, "table", true)
checkType("forSeeTableToString", 2, options, "table", true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Stringify each for-see item into a list
local strList = {}
if forSeeTable then
for k, v in pairs(forSeeTable) do
local useStr = v.use or options.otherText
local pagesStr =
p.andList(v.pages, true) or
mFormatLink._formatLink{
categorizeMissing = mHatnote.missingTargetCat,
link = mHatnote.disambiguate(options.title)
}
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
forSeeStr = punctuationCollapse(forSeeStr)
table.insert(strList, forSeeStr)
end
end
if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end
-- Return the concatenated list
return table.concat(strList, ' ')
end
-- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps
-- but not blank/whitespace values. Ignores named args and args < "from".
function p._forSee (args, from, options)
local forSeeTable = p.forSeeArgsToTable(args, from, options)
return p.forSeeTableToString(forSeeTable, options)
end
-- As _forSee, but uses the frame.
function p.forSee (frame, from, options)
mArguments = require('Module:Arguments')
return p._forSee(mArguments.getArgs(frame), from, options)
end
return p
1c8e6212115f76ecc3db8d05137011cd18207988
Module:Hatnote
828
338
444
443
2025-08-21T16:25:56Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p
e4b658e3483374de2bebf772f3d19aaa713ca3f5
Module:About
828
339
446
445
2025-08-21T16:25:56Z
Sharparam
284703
1 revision imported: Imported from Wikipedia
Scribunto
text/plain
local mArguments --initialize lazily
local mHatnote = require('Module:Hatnote')
local mHatList = require('Module:Hatnote list')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
function p.about (frame)
-- A passthrough that gets args from the frame and all
mArguments = require('Module:Arguments')
args = mArguments.getArgs(frame)
return p._about(args)
end
function p._about (args, options)
-- Produces "about" hatnote.
-- Type checks and defaults
checkType('_about', 1, args, 'table', true)
args = args or {}
checkType('_about', 2, options, 'table', true)
options = options or {}
local defaultOptions = {
aboutForm = 'This %s is about %s. ',
PageType = require('Module:Pagetype').main(),
otherText = nil, --included for complete list
sectionString = 'section'
}
for k, v in pairs(defaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Set initial "about" string
local pageType = (args.section and options.sectionString) or options.PageType
local about = ''
if args[1] then
about = string.format(options.aboutForm, pageType, args[1])
end
--Allow passing through certain options
local fsOptions = {
otherText = options.otherText,
extratext = args.text
}
local hnOptions = {
selfref = args.selfref
}
-- Set for-see list
local forSee = mHatList._forSee(args, 2, fsOptions)
-- Concatenate and return
return mHatnote._hatnote(about .. forSee, hnOptions)
end
return p
1abb25315b25b63b97d98ecae17733cbea8fcc6a
Module:Pagetype/softredirect
828
340
450
2025-08-21T16:31:25Z
Sharparam
284703
Created page with "-- This page contains a table of all soft redirect templates and their -- redirects. Templates names are capitalized, and the Template: prefix is -- removed. Templates are grouped with the main template first, followed by -- its redirects. return { -- ["R from category navigation"] = true, -- ["Redirect from category navigation"] = true, -- ["Category redirect"] = true, -- ["Cat move"] = true, -- ["Cat red"] = true, -- ["Cat redir"] = true, -- ["Cat redirect"] =..."
Scribunto
text/plain
-- This page contains a table of all soft redirect templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
-- ["R from category navigation"] = true,
-- ["Redirect from category navigation"] = true,
-- ["Category redirect"] = true,
-- ["Cat move"] = true,
-- ["Cat red"] = true,
-- ["Cat redir"] = true,
-- ["Cat redirect"] = true,
-- ["Category move"] = true,
-- ["Category Redirect"] = true,
-- ["Categoryredirect"] = true,
-- ["Catr"] = true,
-- ["Catred"] = true,
-- ["Catredir"] = true,
-- ["Catredirect"] = true,
-- ["R from template-generated category"] = true,
-- ["Redirect from template-generated category"] = true,
-- ["Soft redirect"] = true,
-- ["Interwiki redirect"] = true,
-- ["Plain soft redirect"] = true,
-- ["Soft"] = true,
-- ["Soft link"] = true,
-- ["Soft redir"] = true,
-- ["Soft Redirect"] = true,
-- ["Softr"] = true,
-- ["Softredir"] = true,
-- ["SoftRedirect"] = true,
-- ["Softredirect"] = true,
-- ["Userrename"] = true,
-- ["Wikimedia Commons redirect"] = true,
-- ["COMM"] = true,
-- ["Comm"] = true,
-- ["Commons Redirect"] = true,
-- ["Commons redirect"] = true,
-- ["CommonsRedirect"] = true,
-- ["Commonsredirect"] = true,
-- ["Wikimedia commons redirect"] = true,
}
113c40f4040b1bf259fc2008e16d434acffa11fd
453
450
2025-08-21T16:35:00Z
Sharparam
284703
Sharparam renamed page [[Module:PageType/softredirect]] to [[Module:Pagetype/softredirect]] without leaving a redirect: Misspelled title
Scribunto
text/plain
-- This page contains a table of all soft redirect templates and their
-- redirects. Templates names are capitalized, and the Template: prefix is
-- removed. Templates are grouped with the main template first, followed by
-- its redirects.
return {
-- ["R from category navigation"] = true,
-- ["Redirect from category navigation"] = true,
-- ["Category redirect"] = true,
-- ["Cat move"] = true,
-- ["Cat red"] = true,
-- ["Cat redir"] = true,
-- ["Cat redirect"] = true,
-- ["Category move"] = true,
-- ["Category Redirect"] = true,
-- ["Categoryredirect"] = true,
-- ["Catr"] = true,
-- ["Catred"] = true,
-- ["Catredir"] = true,
-- ["Catredirect"] = true,
-- ["R from template-generated category"] = true,
-- ["Redirect from template-generated category"] = true,
-- ["Soft redirect"] = true,
-- ["Interwiki redirect"] = true,
-- ["Plain soft redirect"] = true,
-- ["Soft"] = true,
-- ["Soft link"] = true,
-- ["Soft redir"] = true,
-- ["Soft Redirect"] = true,
-- ["Softr"] = true,
-- ["Softredir"] = true,
-- ["SoftRedirect"] = true,
-- ["Softredirect"] = true,
-- ["Userrename"] = true,
-- ["Wikimedia Commons redirect"] = true,
-- ["COMM"] = true,
-- ["Comm"] = true,
-- ["Commons Redirect"] = true,
-- ["Commons redirect"] = true,
-- ["CommonsRedirect"] = true,
-- ["Commonsredirect"] = true,
-- ["Wikimedia commons redirect"] = true,
}
113c40f4040b1bf259fc2008e16d434acffa11fd
Module:Pagetype/disambiguation
828
341
452
2025-08-21T16:34:01Z
Sharparam
284703
Created page with "return require [[Module:Disambiguation/templates]]"
Scribunto
text/plain
return require [[Module:Disambiguation/templates]]
9b7267108d8d085f28ae9bed61725ad9e43240c7
Coordinates
0
342
454
2025-08-21T16:47:58Z
Sharparam
284703
Created page with "{{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}} '''{{PAGENAME}}''' are used to indicate the player's location in the world. == Overview == The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height). == Bugs == * The coordinates as displayed inside the game on the inventory screen are often incorrect. The game t..."
wikitext
text/x-wiki
{{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}}
'''{{PAGENAME}}''' are used to indicate the player's location in the world.
== Overview ==
The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height).
== Bugs ==
* The coordinates as displayed inside the game on the inventory screen are often incorrect. The game truncates each coordinate value to only show the first four digits. As an example, if the player is at X coordinate {{val|13529}} (five digits), the game will show it as {{val|1352}} (four digits). To get an accurate position, usage of software that can enable the Unreal Engine debug HUD is required. If using the Unreal Engine Unlocker software, enable the debug HUD by using the <code>showdebug</code> command.
== External links ==
* [https://dev.epicgames.com/documentation/en-us/unreal-engine/coordinate-system-and-spaces-in-unreal-engine Coordinate System and Spaces] in the Unreal Engine documentation
[[Category:Game mechanics]]
4b2a35e53034534a2fd7a260f1c18bf681e114ed
455
454
2025-08-21T17:06:44Z
Sharparam
284703
Fix numbers temporarily(?)
wikitext
text/x-wiki
{{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}}
'''{{PAGENAME}}''' are used to indicate the player's location in the world.
== Overview ==
The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height).
== Bugs ==
* The coordinates as displayed inside the game on the inventory screen are often incorrect. The game truncates each coordinate value to only show the first four digits. As an example, if the player is at X coordinate <!--{{val|13529}}-->13 529 (five digits), the game will show it as <!--{{val|1352}}-->1 352 (four digits). To get an accurate position, usage of software that can enable the Unreal Engine debug HUD is required. If using the Unreal Engine Unlocker software, enable the debug HUD by using the <code>showdebug</code> command.
== External links ==
* [https://dev.epicgames.com/documentation/en-us/unreal-engine/coordinate-system-and-spaces-in-unreal-engine Coordinate System and Spaces] in the Unreal Engine documentation
[[Category:Game mechanics]]
aae05c5dc19ae85bd040d250b6a65c2a649d6e81
Template:Infobox/NPC
10
343
456
2025-08-21T17:21:46Z
Sharparam
284703
Created page with "<includeonly>{{#invoke:Infobox|main | kind = npc | sep=, | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | title = {{{title|{{PAGENAME}}}}} }}{{#if:{{NAMESPACE}}||[[Category:NPCs]]}}</includeonly><noinclude> {{Documentation}} </noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind = npc
| sep=,
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| title = {{{title|{{PAGENAME}}}}}
}}{{#if:{{NAMESPACE}}||[[Category:NPCs]]}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
02c1a8c11cfad8392626d8b5b51c89305185a1e9
Template:Infobox/NPC/doc
10
344
457
2025-08-21T17:24:18Z
Sharparam
284703
Created page with "== Example == {{Infobox/NPC | title = The Handler | image = The Handler.png }} <syntaxhighlight lang="wikitext"> {{Infobox/NPC | title = The Handler | image = The Handler.png }} </syntaxhighlight> <includeonly>{{Sandbox other|| [[Category:Infobox templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== Example ==
{{Infobox/NPC
| title = The Handler
| image = The Handler.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/NPC
| title = The Handler
| image = The Handler.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||
[[Category:Infobox templates]]
}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
d6d4e015f0c8254a14cabf15ee3f9625d87804ac
The Handler
0
345
458
2025-08-21T17:26:20Z
Sharparam
284703
Created page with "{{Infobox/NPC | image = The Handler Blok 6147.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}} that will let the player upgrade their [[equipment]], embed crystals into it, and manufacture certain [[items]]. == Overview == Other than serving as a way to upgrade and manufacture items, she will also give the player some guidance on their next objective. She will usually appear next to the [[Homunculus]] closest to the entrance of an area. The Handler's synchronizati..."
wikitext
text/x-wiki
{{Infobox/NPC
| image = The Handler Blok 6147.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}} that will let the player upgrade their [[equipment]], embed crystals into it, and manufacture certain [[items]].
== Overview ==
Other than serving as a way to upgrade and manufacture items, she will also give the player some guidance on their next objective.
She will usually appear next to the [[Homunculus]] closest to the entrance of an area.
The Handler's synchronization level can be increased by finding [[Handler Echo|handler echoes]] and bringing them to her. Increasing her level allows for upgrading [[equipment]] to higher levels.
== Appearance ==
She appears to be some sort of robot or cyborg, with light skin, black parts, and silver hair.
== Locations ==
{| class="wikitable"
! scope="col" | Area
! scope="col" | Description
! scope="col" | Coordinates
|-
| [[Monastery]] || Near the first [[Homunculus]] (only in [[New Game Plus]]) || {{coords|23473.78|-85243.22|-15260.61}}
|-
| [[Blok 6147]] || In the center (right next to the [[Homunculus]]) || {{coords|-25.27|442.48|1160.96}}
|-
| [[Deluge]] || Sitting on a ledge near the first [[Homunculus]] || {{coords|-3307|-7449|5650}}
|-
| [[Asylum]] || Standing in front of a pillar near the [[Homunculus]] || {{coords|-4507|6967|9032}}
|-
| [[Upper Blocks]] || Standing in front of some rubble opposite of the [[Homunculus]] || {{coords|4585|1626|2193}}
|-
| [[Machinarium]] || Standing next to a wall just past the first [[Homunculus]] || {{coords|-2125.53|27029.25|-12156.72}}
|-
| [[Desert]] || Standing next to a wall just past the [[Homunculus]] || {{coords|-9576.35|65589.26|-136382.62}}
|-
| [[Anomaly]] || Standing next to a pair of pillars just past the [[Homunculus]] || {{coords|46782.80|162169.12|-141987.55}}
|-
| [[Vermillion Fields]] || Standing next to the [[Homunculus]], mirroring her location in [[Blok 6147]] || {{coords|582|-4995|1178}}
|}
== Quotes ==
=== When approached ===
When approached without any special event dialogue waiting to be triggered, she will pick one of the below greeting phrases at random.
{{Quote|Hello!|audio=The_Handler_Hello.ogg}}
{{Quote|Hello there!|audio=The_Handler_Hello_There.ogg}}
{{Quote|Well hello there!|audio=The_Handler_Well_Hello_There.ogg}}
{{Quote|Back so soon!|audio=The_Handler_Back_So_Soon.ogg}}
{{Quote|Look who came to visit!|audio=The_Handler_Look_Who_Came_To_Visit.ogg}}
=== First encounter ===
{{Quote
|You're finally here. We can now commence the [[recalibration]].
I've updated the locations of the malfunctioning modules in the terminal. Any time you link to a terminal, you should be able to see the modules.
I must advise utmost caution, as I have surveyed the area and it is infested with aggressive mutations.
The radiation leaking out of [[The Anomaly|the anomaly]] is causing a strong disturbance in the casual field. We should leave this place as soon as possible.
The readings are unlike anything I've seen. The data is completely unstable as I am still unable to upload it for decyphering.
Farewell.
| audio = The_Handler_First_Encounter.ogg
}}
=== After first [[recalibration]] ===
{{Quote
|There is one module left to recalibrate. Unfortunately the data leaking from [[The Anomaly|the anomaly]] is still too corrupted to read.
The surveillance net has taken note of ripples with particularly long wavelengths unusually coming into existence. I believe it's a sign of intruders – particularly dangerous ones that are not of our timeline.
I am not sure I understand what exactly is going on here. I suppose we are yet to learn the true definition of something anomalous.
Farewell.
}}
=== After second [[recalibration]] ===
{{Quote
|The [[recalibration]] was successful, the transgression field is down.
[[The Anomaly|The anomaly]] is now exposed and ready to be stabilized.
''*silence*''
I'm afraid I will be breaching protocol by telling you, that since the recalibration – I have been unable to transmit or receive any transmissions from any other floor.
If I had to make a guess, I would say something from inside the anomaly is tampering with much more than just the causal field. I am afraid I am not equipped to run a robust field analysis, but I speculate we're dealing with an event far outside our scope.
Nevertheless, I did run some more rudimentary data decrypting processes.
The leaks from inside the anomaly are not arbitrary, they reveal the patterns of language. I have tried to compute at least the general scope and nature of its form – but the permutations are overwhelming all of my systems.
Simply running the processes has had some kind of spillover effect into the computing instruments themselves. This language is of unfathomable complexity.
Take great caution, these are circumstances far outside the realms of understanding.
Farewell.
}}
=== First encounter in [[Vermillion Fields]] ===
{{Quote
|Good to see a familiar face.
I must admit, I am no more aware of what is really taking place than I was before this turn of events. I believe there is a powerful external force moving the needle here, and we are completely oblivious to its nature.
I am afraid I won't be of much more use to you in this state, and I'm not quite sure how I've even made it this far. However, I will help with what I can, while I'm here.
I did however learn something. While being transported I noticed a certain Vermillion branching structure buffering this entire world and its roots run deeply. My access was promptly restricted, leaving me in this condition.
Whatever effect the Vermillion structure has, we must be very careful. I believe it has access to base reality, in which case we are dealing with a potential cataclysmic event.
I don't know if it is fear, or excitement – whatever we are experiencing here makes me feel in a way I find hard to describe.
Stay safe.
}}
Her lines in [[Vermillion Fields]] are delivered in a distorted voice, she will also no longer greet the player when approached. Despite her claims about not being of much use any more, she can still perform all of her normal functions.
== Gallery ==
<gallery>
File:The_Handler_Blok_6147.png|[[The Handler]] in [[Blok 6147]].|alt=Screenshot showing The Handler standing around in Blok 6147.
File:The_Handler_Deluge.png|[[The Handler]] in [[Deluge]].|alt=Screenshot showing The Handler sitting on a ledge in Deluge.
File:The_Handler_Asylum.png|[[The Handler]] in [[Asylum]].|alt=Screenshot showing The Handler standing around in Asylum.
File:The_Handler_Upper_Blocks.png|[[The Handler]] in [[Upper Blocks]].|alt=Screenshot showing The Handler standing around in Upper Blocks.
File:The_Handler_Machinarium.png|[[The Handler]] in [[Machinarium]].|alt=Screenshot showing The Handler standing around in Machinarium.
</gallery>
== Trivia ==
* The game files call her "Blacksmith".
{{Navbox/NPCs}}
02c4e3851b0e4e388eeab0d2e668595e202d0df7
Template:BFF
10
346
459
2025-08-21T17:27:27Z
Sharparam
284703
Created page with "''[[Bleak Faith: Forsaken]]''"
wikitext
text/x-wiki
''[[Bleak Faith: Forsaken]]''
a07fd38648935c2ecd381aa47db3694dae3fb873
Handler
0
347
460
2025-08-21T17:27:58Z
Sharparam
284703
Redirected page to [[The Handler]]
wikitext
text/x-wiki
#REDIRECT [[The Handler]]
88b800514a0b691d707ee19ba584e637d3655f46
Category:NPCs
14
348
461
2025-08-21T17:28:32Z
Sharparam
284703
Created page with "Non-player characters (NPCs) in {{BFF}}."
wikitext
text/x-wiki
Non-player characters (NPCs) in {{BFF}}.
0dc1d8049d1a57e3aac84eafca49335d4d35f2d8
Category:Pages with inaccurate coordinates
14
349
462
2025-08-21T17:29:20Z
Sharparam
284703
Created page with "Contains pages using the {{tl|Coordinates}} template or {{ml|Coordinates}} module but passing in one or more coordinates that can be verified to not be completely accurate (i.e. coordinates with fewer than 2 decimals)."
wikitext
text/x-wiki
Contains pages using the {{tl|Coordinates}} template or {{ml|Coordinates}} module but passing in one or more coordinates that can be verified to not be completely accurate (i.e. coordinates with fewer than 2 decimals).
123078e1af276f585a511310432b32907710954a
Category:Pages with coordinates
14
350
463
2025-08-21T17:30:55Z
Sharparam
284703
Created page with "Contains pages that use the {{tl|Coordinates}} template or {{ml|Coordinates}} module."
wikitext
text/x-wiki
Contains pages that use the {{tl|Coordinates}} template or {{ml|Coordinates}} module.
5d1e1be9b3942073a809cd311bdcb1f00bb23507
Locations
0
351
465
464
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox/Locations}}
980e15253d6e4f1418e9efa737c209de74f57252
Uranopolis
0
352
467
466
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''Uranopolis''' is a location in {{BFF}}.
== Sub-locations ==
Uranopolis consists of two sub-locations: Tower Complex and {{TODO}}.
=== Tower Complex ===
{{Main|Uranopolis/Tower Complex}}
[[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]]
The '''Tower Complex''' is the first sub-location encountered by the player.
{{clear}}
=== Lone Tower ===
[[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]]
The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here.
{{Navbox/Locations}}
[[Category:Locations]]
fc3e22f798adfdd04bd6befa151ccc23aa80ecd5
Blok 6147
0
353
469
468
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history.
}}
== Trivia ==
* If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list.
{{Navbox/Locations}}
[[Category:Locations]]
bda6e533357582f201b31b2a208855d0bdc73471
Monastery
0
354
471
470
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Lower ==
[[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]]
{{Quote
| A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings
}}
{{clear}}
== Upper ==
[[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]]
{{Quote
| Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos.
}}
{{Navbox/Locations}}
[[Category:Locations]]
c45661f5fc6c65355deb9f8c90263eb72574a274
Rain District
0
355
473
472
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Sewers ==
[[File:Rain District (Sewers).png|thumb|The rain district sewers as depicted in the game's relocation menu.|alt=Artwork showing the sewers in the rain district.]]
{{Quote
| A maze of flooded tunnels with murky water that echoes the constant patter of rain from above, walls slick with moss and grime, and a stench of decay that ingles with the distant roar of rushing water and the occasional scurrying of unseen creatures.
}}
{{clear}}
== Center ==
[[File:Rain District (Center).png|thumb|The rain district center as depicted in the game's relocation menu.|alt=Artwork showing the center room in the rain district.]]
{{Quote
| A residential area lying in perpetual rain. Its dilapidated buildings stand silent and forlorn, windows shattered, rooftops caved in, walls rotting with mold. The relentless downpour
}}
{{Navbox/Locations}}
[[Category:Locations]]
411486cc02e286f1982f8922cb1e84ebe86d13e4
Deluge
0
356
475
474
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting.
}}
{{Navbox/Locations}}
[[Category:Locations]]
693a79d49e7efc3474fef04a49a6ecfcf873ac1f
Asylum
0
357
477
476
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls.
}}
{{Navbox/Locations}}
[[Category:Locations]]
37e0b512f0b81e8f301b3b2858e9d4da7562c26f
Upper Blocks
0
358
479
478
2025-08-21T17:34:28Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation.
}}
{{Navbox/Locations}}
[[Category:Locations]]
8eb05dbbf1b2eca301ec7824369953ecf59627e8
Ghost Town
0
359
481
480
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Floor 13 ==
[[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]]
{{Quote
| Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past.
}}
{{clear}}
== Floor 1 ==
[[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]]
{{Quote
| A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog.
}}
{{Navbox/Locations}}
[[Category:Locations]]
de022882ea75493bf878521b5de2b72ab78ee421
Machinarium
0
360
483
482
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay.
}}
{{Navbox/Locations}}
[[Category:Locations]]
bdce97e055f63d9b564bb8af98884bb9353ec5db
Desert
0
361
485
484
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally broken by the distant echo of the city's hum.
}}
{{Navbox/Locations}}
[[Category:Locations]]
7a4e1dcb94c588a7cbdfa9c4abb1a9303a8d2d79
Desert Mirage
0
362
487
486
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A desert from another time.
}}
{{Navbox/Locations}}
[[Category:Locations]]
b77e5799a2dcb88ca21171824a322e70e1ceed2f
Anomaly (location)
0
363
489
488
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]]
The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still.
}}
{{Navbox/Locations}}
[[Category:Locations]]
a8fc6f2bc209173c6c2c5d3d178232dfb1ed8321
Vermillion Fields
0
364
491
490
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Overview ==
Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]].
== Plaza ==
[[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]]
{{Quote
|Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field.
}}
{{clear}}
== Temple ==
[[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]]
{{Quote
|Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes.
}}
{{Navbox/Locations}}
[[Category:Locations]]
71f1f17927909020242b8cf472a7e2f89199d643
Unknown (location)
0
365
493
492
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}}
'''Unknown''' is a [[Locations|location]] in {{BFF}}.
== Overview ==
As the Unknown cannot be relocated to, it has no artwork image and no in-game description.
{{Navbox/Locations}}
[[Category:Locations]]
351676f2dfc783d43a014b11a690031ea946e2b8
Unknown
0
366
495
494
2025-08-21T17:34:29Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''Unknown''' may refer to:
== Common meanings ==
* [[Unknown (location)]], the location with the platforming puzzles leading to an optional boss.
* [[Unknown (boss)]], the boss enemy that can be optionally fought in the location sharing its name.
{{Disambiguation}}
a972049d778c73207104b07ad235871c7a53466d
NPC
0
367
497
496
2025-08-21T17:35:52Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[NPCs]]
0c78678b45694b9a9f67883eca2a30eaa6ea5607
NPCs
0
368
499
498
2025-08-21T17:35:52Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''Non-player characters (NPC)''' are characters in {{BFF}} that can aid the player, provide services, or be spoken to in order to learn more about the world.
== Notable NPCs ==
* [[The Handler]] – Upgrades [[equipment]] and allows for [[crafting]] certain [[items]].
{{Navbox/NPCs}}
79553771fc8e6ca775b99979d35e2de32ae39cbb
Untitled Log
0
369
501
500
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[lore]] [[Documents|document]] that can be found in {{BFF}}.
== Overview ==
There are multiple untitled logs in the game, each with their own text.
{{Quote
|I remember waking in a pile of lifeless bodies. Not only lifeless though. Expressionless. Frozen visages.
}}
{{Quote
| Like waking from a dream about dreaming, everything is a haze. A dark ominous haze. I've seen death, pain, and torture. I hear a voice. Once in a while I see the voice beckon, like a ripple in water – before I can make form of the image. I am gone too.
}}
{{Quote
| I have no mouth, and I know nobody would hear me scream.{{note|Likely a reference to [[wikipedia:I Have No Mouth, and I Must Scream|I Have No Mouth, and I Must Scream]].}}
}}
{{Quote
| No matter where my mind wanders, there is an oppressive red mist crushing the reaches of my imagination. Try as I might, there seems to be no escape. No escape. Only a journey deeper. Farther.. but what awaits at the innermost depths. I suppose the [[Omnistructure]] makes room beyond sense.. beyond time.
}}
== Notes ==
{{notelist}}
{{Navbox/Documents}}
[[Category:Lore]]
[[Category:Documents]]
472bf3de6dbca52f57c3f288b12ad3650a51f3b6
Monastery Impression
0
370
503
502
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found at [[Monastery|the Monastery]] in {{BFF}}.
== Overview ==
{{Quote
| Venturing into the anomalous zone at the edge of this crumbling colony, I was enveloped by a world devoid of sense, dominated by the cold, relentless sprawl of concrete and rebar. Rusted metal carcasses of buildings stood as grim monuments to a forgotten era, their skeletal frames interwoven with the vestiges of ancient technology and tangled cables that snaked across the ground like decaying veins. The omnipresent drone of [[Omnistructure|the structure]] reverberated through the air, a constant reminder of its oppressive presence – here, louder than anywhere before. As I picked my way through the debris, I could sense the weight of the past pressing in, the technological remnants whispering secrets of a world that once thrived but now lay silent and corroded.
}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
5d6199c92d0ebf1baedb5890d3776274eadefaef
Lore
0
371
505
504
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' can be found as text on [[items]], various [[data logs]] and [[documents]], and [[NPC]] dialogue in {{BFF}}.
== Data logs ==
{{Main|Data logs}}
== Documents ==
{{Main|Documents}}
{{Navbox/Lore}}
[[Category:Lore]]
3efab73936854b174032435bb0c6f8b77736139d
Data logs
0
372
507
506
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}.
== Overview ==
Data logs are uncovered by interacting at certain specific points in the game world. To locate these points, use of the [[Scanner]] is recommended.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
0b268f9f4958f98eba1f00ec6c06edbba3c10826
Documents
0
373
509
508
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}.
== Overview ==
Documents are typically found as drops from [[enemies]].
{{Navbox/Documents}}
[[Category:Lore]]
[[Category:Documents]]
3305c6ccf580021e8513f612ab7919e6863f1f47
Scanner
0
374
511
510
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| image = Scanner.png
| title = {{PAGENAME}}
| Description = Captures and interprets data across hidden and abstract dimensions, revealing information that transcends conventional spatial and temporal limits, providing a comprehensive view of both visible and imperceptible phenomena.
}}
The '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Overview ==
Activating the item scans the area around the player, revealing important interactables like [[data logs]] and ladders.
{{Navbox/Items}}
[[Category:Essential items]]
[[Category:Lore]]
72e26e842e217333080947ca9fd96dff00b2be1e
Dust Sea
0
375
513
512
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
The '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
| At the base of the sprawling mining facility, a deep mist blankets the ground, leading out to a vast, desolate desert. This desert's sand is a choking mix of dust and residue from the countless constructions and creations towering above. The air is perilous to breathe, laden with fine particles that can invade the lungs. Scattered across this wasteland are the carcasses of long-forgotten machinery and the ruins of old structures. The architecture of these relics hints at a bygone era, a dark age marked by more primitive technology. This eerie landscape tells a silent tale of a past civilization, now buried beneath the relentless sands of time.
}}
== Location ==
{{coords|-4062|-2272|5797}}
Can be found at the top of a broken down tower in [[Deluge|the Deluge]] area, just past the [[Folk Cape]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left. Continue forward until reaching the big tower, climb it to the top and you will find the data log at the edge of the tower (use [[Scanner|the Scanner]] to see it more easily).
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
90fdcaf4874fbb945c79bf4bf3df130f8ba25db5
Psychosis
0
376
515
514
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}.
== Overview ==
{{Quote
|I've repeated the Completeness Protocol over 40 times now to no avail. No training can prepare a mind for this. All sense and reason are gone. The mental fortitude required to hold a coherent thought for longer than a heartbeat is soul-crushing. It feels like I am existing from one moment to the next. Picking up the remnants of déjà vu after déjà vu…
}}
== Location ==
{{coords|-5130|-1039|5616}}
Found in [[Deluge|the Deluge]] area, near one of the [[Upgrade Splinter|upgrade splinters]] in the first big rectangular structure with pillars, near the first red lightpole. Use [[Scanner|the Scanner]] to more easily find the data log.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
b4998452a6a35bf04aeb60ea5d8c95c3edf9e497
Night Horror
0
377
517
516
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}.
== Overview ==
{{Quote
|In the tower of [[Asylum|the asylum]], a chilling and unearthly wail reverbates through the walls—a sound that can only be described as the cry of a banshee. The eerie, mournful shrieks cut through the silence, hinting at a presence both agonizing and spectral. Among the abominations and horrors that define this place, one patient remains, but it's difficult to truly say they have survived. This lone individual, if they can still be called such, exists in a state that blurs the line between life and death, their being a twisted echo of humanity amidst the torment. The banshee's cries seem to emanate from this tormented soul, a haunting reminder of the asylum's dark legacy and the incomprehensible suffering endured within its dark halls.
}}
== Location ==
{{coords|-3811|1199|9172}}
Found in [[Asylum|the Asylum]]. Located below a staircase after leaving the first building. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
fc7ee13e9ef0e02cd4a7722f0e91cb2e83028519
The Banshee
0
378
519
518
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}.
== Overview ==
{{Quote
| The banshee's movements, dancing through [[Asylum|the asylum's]] decaying tower, are unsettingly precise, as if they were once part of a carefully honed combat style. Each anguished gesture and frenzied motion mirrors advanced fighting techniques, reminiscent of those taught at the highest levels of military training. The eerie choreography suggests that the creature's wails are not merely cries of torment, but the remnants of a brutal experiment aimed at forging a living weapon. The movements, though now distorted and ghostly, hint at a once-formed discipline, twisted into a nightmarish mockery of the intended martial prowess. This spectral entity seems to embody the cruel ambition of those who sought to create a perfect instrument of war through unthinkable means.
}}
== Location ==
{{coords|-3943|1596|1532}}
Found in the center of a circular room, surrounded by chairs, in the big tower in [[Asylum|the asylum]]. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
0309dfabb2c1cb6950f037a68ebce98a2b67b20f
Hellicar's Maxims
0
379
521
520
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}.
== Acquisition ==
Drops from [[enemies]] in the game.
* Asylum enemy with cape and sword+shield.
{{Navbox/Documents}}
[[Category:Lore]]
[[Category:Documents]]
9e54fe19f15f8d8dce8dd560ec5bc7a0f7a98dab
Shadows in the Courtyard
0
380
523
522
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
| There's a radial pattern in [[Blok 6147|this Blok]]. A heavily pedestrian zone. The people living here must have had a rather communal spirit. I can't tell if it's just my mind, but I can hear the echoes of children shouting. The ring of a school bell. The creek of a rusty gate opening and closing in a morning ritual. I imagine some of the views here are rather stunning.
}}
== Location ==
{{coords|-1016|-3857|2319}}
Found in [[Blok 6147]], on a round balcony overlooking the central hub.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
3ea9546e3cf140db20981b41b9f9f6e2f674c210
Inhabitants
0
381
525
524
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{stub}}
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}.
== Overview ==
{{Quote
|The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force.
}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
1fac3c562d846adb7b3b2e5ab3eb4d386c14b532
Serpentine Visions
0
382
527
526
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Among the towering spires of the city, there are whispers of a colossal sky serpent that drifts silently through the steel and concrete canyons. Though the serpent is said to be harmless, its sheer size and graceful, serpentine movements evoke both awe and trepidation. With scales that shimmer in hues matching the city's metallic sheen, the serpent weaves effortlessly through the narrow gaps between the tower, its long, undulating body casting an imposing shadow over the pristine surfaces below. its presence, though non-threatening, is a constant reminder of the vastness and wildness that still lingers even in this meticulously engineered urban landscape. The serpent's slow, deliberate light adds a touch of majesty and enigma to the stark cityscape, making its silent passage through the towering structures a mesmerizing spectacle that commands both reverence and respect.
}}
== Location ==
{{coords|9922|-6769|1440}}
Found in [[Uranopolis]] on a ledge on one of the platforms reached by navigating the bridges. Use [[Scanner|the scanner]] to find it more easily.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
e002a14503e5a3d60e77f6a2a8484fc1381a05d3
Shifting Sands
0
383
529
528
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|There are unsettling rumors about a colossal worm with wings made of bones, said to inhabit a hidden realm. This serpentine creature is described as having a face that resembles a person frozen in a dream, an eerie visage that defies understanding. The worm is said to speak and whisper to anyone who dares enter its domain—or even to those who merely think about it. Its nature alludes to something of maker origin. Something capable of changing the structure.
}}
== Location ==
{{coords|-9400|7378|-1350}}
Found in [[Desert|the Desert]], near the big enemy with red eyes after crossing the bridge past the [[Homunculus]]. It is in front of a set of doors.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
b48a873694f25c03f22938908578b61c6b9c4912
Call of the Void
0
384
531
530
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|The giant staircase looms before me, its sheer expanse a vertiginous marvel that seems to stretch endlessly downward into the void. Each step is a monstrous slab of cold, unfeeling metal, worn smooth by countless unknown feet. As I descend, the sense of vertigo intensifies, and the emptiness below grows ever more profound. The abyss at the base of the staircase seems to call out with an irresistible allure, a dark, seductive whisper that tugs at the edges of my mind. The staircase feels alive with this haunting invitation, a siren song of emptiness that beckons irresistibly into the darkness below.
}}
== Location ==
{{coords|1132|-8482|1965}}
Found in [[Ghost Town#Floor 13|Ghost Town (Floor 13)]]. Starting from the [[Homunculus]], head down the stairs. Head up the stairs behind the crying enemy at the bottom and the data log will be at the end of the walkway. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
6926f68eafdb547e25880491f97dcb505ad73b95
Umbral City
0
385
533
532
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|I stumbled through the mist-shrouded sector of the city, disoriented and weary, an unsettling chill gripped me. The residential area ahead was cloaked in an eerie, ghastly haze. Every step felt heavier, as if the very air was laden with the weight of forgotten despair. I descended further into the sector, my path leading me to a graveyard that lay at the bottom, shrouded in the same pervasive mist. The gravestones, ancient and crumbling, stood like mournful sentinels in the ghostly fog. I could feel a strange, unsettling energy emanating from the ground, a spectral force that seemed to pulse through the halls around me. The sorrow and loss from the graveyard seeped into the very walls of this place, wrapping me in a shroud of grief. The haunting resonance of the graveyard's energy made every breath feel heavy, and the oppressive atmosphere left me with an unshakable sense of inescapable sorrow, as if the very essence of this forsaken place was reaching out to ensnare me.
}}
== Location ==
{{coords|1109|-9166|-1494}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], go through the doorway and take the right path, going down the stairs and following the corridors until you arrive at the subway. Go to the right and get to the end to find the data log in the corner. Use [[Scanner|the scanner]] to more easily find it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
f48b4c78d4059ac73cd01b56ac5efdc5e95bd143
Intercepted Transmission
0
386
535
534
2025-08-21T17:38:33Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|You won't get to see the fruits of your sacrifice, and only you will ever know the pain of your solitude. I'm sorry. I'll never forget you.
}}
== Location ==
{{coords|1908|-1765|-806}}
In [[Blok 6147]]. After exiting the [[subway]], take that path that leads up and then walk down the stairs to find the data log in a corner. Use [[Scanner|the scanner]] to find it more easily.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
f7a214fac38ad015fc367e76f78b3c313073255d
Desert Dream
0
387
537
536
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|According to the readings, this gateway offers a glimpse into a reality untouched by the distortions and chaos of [[The Anomaly|the anomaly]], a place where time and space unfolded in a different manner, free from the relentless upheaval that defines this place. The sand serpent's presence must be related.
}}
== Location ==
{{coords|1471|6344|-1395}}
Found in the [[Desert]]. It's located in front of the teleportation orb that leads to [[Desert Mirage]].
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
fb7777879af3c3d248160f4349e8cabe96b0e304
Heartbeat
0
388
539
538
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat feels like as word repeated until it loses meaning. Nothing endures here.
}}
== Location ==
{{coords|3326|-6471|-6573}}
Found in the [[Monastery#Lower|Monastery (Lower)]]. Starting at the [[Homunculus]], go forward until the end of the roof where the first enemy is, then take the left path that goes down several stairs. Continue into the hallway at the bottom and take a left, then go up the elevator. Go straight and you'll come to a platform with a staircase going up to the right. The data log is right before the staircase. Use [[Scanner|the scanner]] to more easily find it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data log]]
e6a4f885a6f4e9bd91ce07da3168957b45e7a308
Silent Streets
0
389
541
540
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Interaction between the city's inhabitants is minimal and strangely formal. They pass one another with vacant, almost resigned nods, their conversations reduced to whispers that blend seamlessly with the ambient hum of the city. The air is filled with a sense of inevitability, as if their routines are an attempt to impose a semblance of order on an environment that has long forsaken any true sense of purpose or coherence. In this dreamlike, consuming city, their lives are a reflection of the city's own tragic state—a relentless cycle of existence without progress, forever trapped in the shadow of their own lost potential.
}}
== Location ==
{{coords|1244|1057|1956}}
Found in [[Blok 6147]]. In an alley with a fire and nearby cargo box. It's in the area with multiple walkways at different heights with stairs between.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
d244a7077b0a0b4ba8290bdd23f999bdbf664d08
Statues
0
390
543
542
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Often found in the narrow corridors and shadowy alcoves of the city, their bodies rigidly aligned as if caught in a perpetual moment of exhaustion. Some are positioned near the vast concrete walls, their outlines faintly illuminated by the dim, ambient light, creating haunting silhouettes against the cold surface. Their eyes vacant, reflecting the dim glow of the city in a fixed, lifeless gaze.
}}
== Location ==
{{coords|1424|1365|3124}}
Located in [[Blok 6147]] at the end of one of the walkways with stairs between them.
[[File:Statues_location.jpg|thumb|left|Location of the data log.|alt=Screenshot showing the location of the data log.]]
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
afc40155102345cb921361ea566916b295ded7c5
Unknown Limits
0
391
545
544
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|From within, the boundary of the anomaly seems both infinite and elusive, with no clear beginning or end. It sprawls outwards in a chaotic, unpredictable manner, its influence warping space and time to create a disorienting and treacherous landscape. The sphere's growth is not linear but irregular, expanding and contracting as it incorporates elements from its surroundings, twisting them into bizarre, unrecognizable forms.
}}
== Location ==
{{coords|4984|1575|-1420}}
Found in the [[Anomaly]]. When entering the area, it is the first thing you will come across as the cave opens up to the outdoors area. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
9c79704fa399a5c94c900c27d6cb8c39b760f58a
The Grave Predicament
0
392
547
546
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|The Administration, a dominant force within this tangled system, exhibits a deeper grasp of [[Omnistructure|the Omnistructure's]] workings compared to other entities. However, its own nature is so enigmatic that it seems to be more an emergent symptom of [[Omnistructure|the Omnistructure]] than a genuine part of it. The Administration's methods and motivations are as elusive as [[Omnistructure|the Omnistructure]] itself, blending seamlessly into the very fabric of the mysterious domain it governs within it. Its presence, while influential, only adds to the overall complexity of [[Omnistructure|the Omnistructure]], reinforcing the idea that understanding this colossal construct may forever remain an elusive, if not an impossible, pursuit. Nevertheless we must try. Our very survival hinges on our ability to adapt, and without understanding at the very least our immediate surroundings in this labyrinth, we have no room to elude the ever-pursuing peril that surrounds us.
}}
== Location ==
{{coords|4404|1793|-1412}}
Located on an edge overlooking the labyrinth in the [[Anomaly]] area, just after [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius']] boss arena. Use [[Scanner|the scanner]] to more easily locate it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
4a149e96e2d9c362546ae535afb986f4d6e1cb03
Kaleidoscope of Dreams
0
393
549
548
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|[[Anomaly|The anomaly]] represents a profound and dangerous space-time phenomenon, its expanding radius a constant threat to the stability and integrity of the entire structure. Its presence is a reminder of the fragility of order in the face of an unrelenting, chaotic force that plagues [[Omnistructure|the Omnistructure]], erasing all that it touches.
}}
== Location ==
{{coords|5310|2116|-1450}}
Found in the [[Anomaly]] area, located right in front of the anomaly itself at the final part of the labyrinth.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
e9b3658c5073f52f9811e41c238dc70edd1b8e24
Vermillion
0
394
551
550
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|An omnipresent presence bathed everything in a deep vermillion{{note|"Vermillion" here refers to the color, although it might be more commonly spelled as "vermilion" (with only one L).}} hue. This color created an overwhelming sense of order. The vermillion presence exuded a serene yet unsettling stillness, embodying an ideal form of tranquility. It seemed to impose a perfect structure on the disarray around it, its calm nature hiding an underlying menace. The more you focused on the vermillion form, the more it became clear that this serenity was a guise, concealing a power that could shatter the delicate balance at play.
}}
== Location ==
{{coords|483|-4883|1752}}
Found in the [[Vermillion Fields]], on top of a balcony with a [[Vermillion Knight]] guarding it. Standing at the [[Homunculus]], face the direction of [[The Handler]] and the balcony can be seen behind her.
== See also ==
* [[Vermillion Fields]], for the endgame location
* [[Vermillion Knight]], for the enemy
== Notes ==
{{notelist}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
989e673b86ad80578a904518b93dcddaf305e173
A Broken Reality
0
395
553
552
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|The landscape is filled with soothing, warm tones that evoke a sense of perfect calm and harmony. Yet, despite the stunning serenity, there is an unshakable feeling of not being alone, a subtle but persistent awareness that something else is present.
}}
== Location ==
{{coords|2368|-5079|1225}}
Found in [[Vermillion Fields]]. Start at the [[Homunculus]] and walk to where the blue lightsaber knight is. Head outside from there and get to the edge. Take a left and follow the edge until you come to a balcony on the right with the data log. Use [[Scanner|the scanner]] to help you find it more easily.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
cb804aedc9c441989a2f08a03652278a42ce02a8
Understanding
0
396
555
554
2025-08-21T17:38:34Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
| Hierarchies within various organizations reflect a fragmented understanding of the [[Omnistructure]]. These organizations, though structured, are plagued by slow progress and sporadic breakthroughs. Their efforts to decode and rebuild within this immense and confounding realm are hindered by the overwhelming scale and shifting nature of their environment
}}
== Acquisition ==
Unlocked upon speaking to [[Inquisitor Commander Alexius]] for the first time.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
58629768126fce5c895113d20c5c3433807829d2
Category:Lore
14
397
556
2025-08-21T17:39:14Z
Sharparam
284703
Created page with "Articles that deal with the [[lore]] of {{BFF}}."
wikitext
text/x-wiki
Articles that deal with the [[lore]] of {{BFF}}.
94c2e8b39ccfcef2092a51b9d9871303a81d3550
Category:Data logs
14
398
557
2025-08-21T17:39:54Z
Sharparam
284703
Created page with "[[Data logs]] in {{BFF}}."
wikitext
text/x-wiki
[[Data logs]] in {{BFF}}.
1164d38028f62e77abae5ba8cc9ff863d3ff7188
560
557
2025-08-21T17:42:04Z
Sharparam
284703
Add parent category
wikitext
text/x-wiki
[[Data logs]] in {{BFF}}.
[[Category:Lore]]
5e904cfff9956cd0b33207527c8346edd1f405f0
Category:Documents
14
399
558
2025-08-21T17:40:30Z
Sharparam
284703
Created page with "[[Documents]] in {{BFF}}."
wikitext
text/x-wiki
[[Documents]] in {{BFF}}.
cc0499616b9fa18a474694b811d013e801458f57
559
558
2025-08-21T17:40:55Z
Sharparam
284703
Add parent category
wikitext
text/x-wiki
[[Documents]] in {{BFF}}.
[[Category:Lore]]
a47d50212d62913cf87ebea2624342bb3dd85afd
Abandoned Soldier
0
400
562
561
2025-08-21T17:43:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/NPC
| image = Abandoned Soldier.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
Found in the [[Monastery#Lower|lower Monastery]], at the top of the stairs sitting next to one of the statue heads ({{coords|22476.39|-66438.91|-8856.44}}).
After defeating [[Konrad the Traitor]], he moves to {{TODO|Add second location}}.
At some point, he disappears entirely from the game.
{{Navbox/NPCs}}
e596f1f08e1e0d7bb6ddf38f363f5924a5b8dd01
Archinquisitor Belisarius
0
401
564
563
2025-08-21T17:43:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}}
{{stub}}
{{Infobox/NPC
| image = Archinquisitor Belisarius.png
}}
{{Navbox/NPCs}}
7acff4eb5df9236854d4caf127e0613b0980b80d
Inquisitor Commander Alexius
0
402
566
565
2025-08-21T17:43:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/NPC
| image = Inquisitor Commander Alexius.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|-41635.32|9075.12|11831.71}}
Located in the [[Asylum]], in a tower that can be reached by following a hidden path.
== Quotes ==
=== On first meeting ===
{{Quote
|Hmmm – a visitor.
A visitor to a plague at that – a rare occurence{{sic|expected=occurrence}}. Ah! The Administration? Yes – that much is now obvious.
Always a pervasive need for the world to make sense – but with each passing moment, I find the [[omnistructure]] is always one step beyond it… beyond comprehension.
I wonder what tales you'd share if only you could speak. Traversing every crevice and ruin on foot, my, my… the secrets you hold… and what happens to the ones you leave behind? Do you ever think of them?
It sounds like a treacherous life… You must not know much kindness. And how could you – I imagine you've experienced pain and death uncountable times. It is after all reflected in your demeanour.
Maybe this can make a small change. <!-- Gives greater crystals -->
You know, I myself am not a stranger to challenges. This struggle between absolute power and perfect order is no longer easy to balance. I find myself giving it my all, without, seeing much in return…
[[The Serdars]] now complicate things… Their sacrifices were too great for a wavering Empire. Yet rebelling against everything makes life lose its purpose…
[[The Administration|The Administration's]] vision of order is sterile however… perfect, yes, but like marble – its beauty frozen permanently in the rhythm of death. In his few moments of peace, [[Yaroslav]] would probably explain it better than I – then again – his word was always as sharp as his saber.
We both have work to do. Until we meet again.
}}
Unlocks the data log [[Understanding]] and gives you two [[Greater Anomalous Crystal|Greater Anomalous Crystals]].
=== After first encounter ===
{{Quote|We both have work to do. Until we meet again}}
{{Navbox/NPCs}}
39b57600330ffb5ca7e6c437458be303142ceb91
Yaroslav
0
403
568
567
2025-08-21T17:43:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/NPC
| image = Yaroslav.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|3721|1150|-1397}}
Located in the [[Desert]]. Standing with his crew in front of the gate to [[The Anomaly]].
== Quotes ==
=== First encounter ===
{{Quote
|Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing.
Time is not of the essence here… Only choice. Soon, you'll feel it yourself.
Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face…
Beyond those gates, you will have to carry the greatest burden of all – your own!
The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness!
I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her.
I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life.
We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception…
When you return, Collector, things will not be as they were. You will not be as you were.
}}
=== After first encounter ===
{{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}}
=== Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] ===
{{Quote
|Things have been set in motion that can never be explained.
An eternal rain is coming our way – remember to trust your blade. You will need it more than ever.
}}
{{Navbox/NPCs}}
6bb0d94919bf2b14a91b7fd37736740fa5038de0
Royal Division Captain Yulia
0
404
570
569
2025-08-21T17:43:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}}
{{Infobox/NPC
| image = Royal Division Captain Yulia.png
}}
{{stub}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
{{Navbox/NPCs}}
47c5320bb535502d6ea086d13c44e3827509697f
Abelard the Brave
0
405
572
571
2025-08-21T17:43:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/NPC
| image = Abelard the Brave.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|3566.32|32790.88|-14128.63}}
Stands on the edge of a platform at the top of the [[Machinarium]].
== Quotes ==
=== First encounter ===
{{Quote
|Gets lonely out here. Thank the [[God-Emperor]] for the voices that haunt me…
Who knows what [[Yaroslav]] is up to. To turn on his own… so brutally. Tsss!
[[Serdar]] filth!
No order to this place. There's no cycle, no ebb and flow to the city. It all feels like… Eh. What do you care anyway.
War is Hell. Not a sewer, so I don't exactly know what you{{note|The voice actor emphasis the "you" in this sentence, but the subtitles do not.}} are doing here.
We all have our role to play. You play yours. We'll see about mine!
Farewell.
}}
=== Upon speaking to him again ===
{{Quote|Farewell.}}
== Notes ==
{{notelist}}
{{Navbox/NPCs}}
bff64714017d7cf963314a972d069174724842aa
Bleak Faith: Forsaken
0
406
573
2025-08-21T17:44:23Z
Sharparam
284703
Created page with "'''''{{PAGENAME}}''''' is an action role-playing game (ARPG) game by [[Archangel Studios]]. == Soundtrack == {{Main|Bleak Faith: Forsaken Original Soundtrack}} == External links == * [http://www.bleakfaith.com/ Official website] ('''Note:''' [[wikipedia:HTTPS|HTTPS]] is not available.) * [https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/ Steam] * [https://www.gog.com/en/game/bleak_faith_forsaken GOG] * [https://www.facebook.com/bleakfaith/ Facebook] * [..."
wikitext
text/x-wiki
'''''{{PAGENAME}}''''' is an action role-playing game (ARPG) game by [[Archangel Studios]].
== Soundtrack ==
{{Main|Bleak Faith: Forsaken Original Soundtrack}}
== External links ==
* [http://www.bleakfaith.com/ Official website] ('''Note:''' [[wikipedia:HTTPS|HTTPS]] is not available.)
* [https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/ Steam]
* [https://www.gog.com/en/game/bleak_faith_forsaken GOG]
* [https://www.facebook.com/bleakfaith/ Facebook]
* [https://x.com/bleak_faith X (Twitter)]
* [https://www.youtube.com/channel/UCmXqWlyuVHvoru4WBdz88Eg/about?view_as=subscriber YouTube]
* [https://www.instagram.com/bleakfaithofficial/ Instagram]
* [https://steamdb.info/app/1173220/ SteamDB]
* [[wikidata:Q117074729|Wikidata]]
4d0375085e030286814ed6e0805f35cfbfb349cb
Module:Duration
828
412
584
2025-08-21T17:55:50Z
Sharparam
284703
Load styles in module
Scribunto
text/plain
---Duration module
---@module DurationModule
---@alias p
local getArgs = require('Module:Arguments').getArgs
local ARG_OPTS = {
wrappers = {
"Template:Duration"
}
}
---@class Duration
---@field h
---@field m
---@field s
---@type Duration
local ZERO = { h = 0, m = 0, s = 0 }
---@type int[][]
local LOOKUP = {
[1] = { 0, 0, 1 },
[2] = { 0, 1, 2 },
[3] = { 1, 2, 3 }
}
local p = {}
---@param args any
---@return Duration
local function parseDuration(args)
local h = tonumber(args.h or args[1])
local m = tonumber(args.m or args[2])
local s = tonumber(args.s or args[3])
if h or m or s then
return {
h = h or 0,
m = m or 0,
s = s or 0
} --[[@as Duration]]
end
local input = args[1]
if not input or input == "" then return ZERO end
local parts = {}
for part in string.gmatch(input, "%d+") do
parts[#parts + 1] = tonumber(part) or 0
end
local size = #parts
return {
h = parts[LOOKUP[size][1]] or 0,
m = parts[LOOKUP[size][2]] or 0,
s = parts[LOOKUP[size][3]] or 0
} --[[@as Duration]]
end
---@param duration Duration
---@return string
local function toisostring(duration)
return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s)
end
---@param duration Duration
---@return string
local function todisplaystring(duration)
if duration.h > 0 then
return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s)
end
return string.format("%02d:%02d", duration.m, duration.s)
end
---@param frame any
---@return any
function p.main(frame)
local args = getArgs(frame, ARG_OPTS)
return p._main(args, function(s) return frame:preprocess(s) end)
end
function p._main(args, preprocess)
preprocess = preprocess or function(s) return s end
local duration = parseDuration(args)
local iso = toisostring(duration)
local display
local is_custom_display = false
if args.display then
display = preprocess(args.display)
is_custom_display = true
else
display = todisplaystring(duration)
end
local elem = mw.html.create('time')
:attr('datetime', iso)
:addClass('duration')
:wikitext(display)
if is_custom_display then
elem:attr('title', todisplaystring(duration))
:addClass('dotted')
end
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles', args = { src = 'Module:Duration/styles.css' }
} .. tostring(elem)
end
return p
01e406e1f427ec21571803ddbb608db84f5fb51a
585
584
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
---Duration module
---@module DurationModule
---@alias p
local getArgs = require('Module:Arguments').getArgs
local ARG_OPTS = {
wrappers = {
"Template:Duration"
}
}
---@class Duration
---@field h
---@field m
---@field s
---@type Duration
local ZERO = { h = 0, m = 0, s = 0 }
---@type int[][]
local LOOKUP = {
[1] = { 0, 0, 1 },
[2] = { 0, 1, 2 },
[3] = { 1, 2, 3 }
}
local p = {}
---@param args any
---@return Duration
local function parseDuration(args)
local h = tonumber(args.h or args[1])
local m = tonumber(args.m or args[2])
local s = tonumber(args.s or args[3])
if h or m or s then
return {
h = h or 0,
m = m or 0,
s = s or 0
} --[[@as Duration]]
end
local input = args[1]
if not input or input == "" then return ZERO end
local parts = {}
for part in string.gmatch(input, "%d+") do
parts[#parts + 1] = tonumber(part) or 0
end
local size = #parts
return {
h = parts[LOOKUP[size][1]] or 0,
m = parts[LOOKUP[size][2]] or 0,
s = parts[LOOKUP[size][3]] or 0
} --[[@as Duration]]
end
---@param duration Duration
---@return string
local function toisostring(duration)
return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s)
end
---@param duration Duration
---@return string
local function todisplaystring(duration)
if duration.h > 0 then
return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s)
end
return string.format("%02d:%02d", duration.m, duration.s)
end
---@param frame any
---@return any
function p.main(frame)
local args = getArgs(frame, ARG_OPTS)
return p._main(args, function(s) return frame:preprocess(s) end)
end
function p._main(args, preprocess)
preprocess = preprocess or function(s) return s end
local duration = parseDuration(args)
local iso = toisostring(duration)
local display
local is_custom_display = false
if args.display then
display = preprocess(args.display)
is_custom_display = true
else
display = todisplaystring(duration)
end
local elem = mw.html.create('time')
:attr('datetime', iso)
:addClass('duration')
:wikitext(display)
if is_custom_display then
elem:attr('title', todisplaystring(duration))
:addClass('dotted')
end
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles', args = { src = 'Module:Duration/styles.css' }
} .. tostring(elem)
end
return p
01e406e1f427ec21571803ddbb608db84f5fb51a
Module:Duration/styles.css
828
411
582
2025-08-21T17:56:26Z
Sharparam
284703
Sharparam moved page [[Template:Duration/styles.css]] to [[Module:Duration/styles.css]] without leaving a redirect: Moving styles to module level
sanitized-css
text/css
time.duration.dotted {
border-bottom: 1px dotted;
}
3d31243ddfc10500c1050d7e08d4e4ceb60dba74
583
582
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
time.duration.dotted {
border-bottom: 1px dotted;
}
3d31243ddfc10500c1050d7e08d4e4ceb60dba74
Template:Duration
10
410
580
2025-08-21T17:57:12Z
Sharparam
284703
Fix missing start tag
wikitext
text/x-wiki
<includeonly>{{#invoke:Duration|main}}</includeonly><noinclude>{{Documentation}}</noinclude>
46a71dab33136afb3cfda922978ce2a0f128228e
581
580
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Duration|main}}</includeonly><noinclude>{{Documentation}}</noinclude>
46a71dab33136afb3cfda922978ce2a0f128228e
Template:Track listing
10
407
575
574
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{#invoke:Track listing|main}}<noinclude>
{{documentation}}
</noinclude>
bef48fe7b046d2e4f4a2ed058a47e1ec3b30ed00
Module:Track listing
828
408
577
576
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
local yesno = require('Module:Yesno')
local checkType = require('libraryUtil').checkType
local cfg = mw.loadData('Module:Track listing/configuration')
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
-- Add a mixin to a class.
local function addMixin(class, mixin)
for k, v in pairs(mixin) do
if k ~= 'init' then
class[k] = v
end
end
end
--------------------------------------------------------------------------------
-- Validation mixin
--------------------------------------------------------------------------------
local Validation = {}
function Validation.init(self)
self.warnings = {}
self.categories = {}
end
function Validation:addWarning(msg, category)
table.insert(self.warnings, msg)
table.insert(self.categories, category)
end
function Validation:addCategory(category)
table.insert(self.categories, category)
end
function Validation:getWarnings()
return self.warnings
end
function Validation:getCategories()
return self.categories
end
-- Validate a track length. If a track length is invalid, a warning is added.
-- A type error is raised if the length is not of type string or nil.
function Validation:validateLength(length)
checkType('validateLength', 1, length, 'string', true)
if length == nil then
-- Do nothing if no length specified
return nil
end
local hours, minutes, seconds
-- Try to match times like "1:23:45".
hours, minutes, seconds = length:match('^(%d+):(%d%d):(%d%d)$')
if hours and hours:sub(1, 1) == '0' then
-- Disallow times like "0:12:34"
self:addWarning(
string.format(cfg.leading_0_in_hours, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
if not seconds then
-- The previous attempt didn't match. Try to match times like "1:23".
minutes, seconds = length:match('^(%d?%d):(%d%d)$')
if minutes and minutes:find('^0%d$') then
-- Special case to disallow lengths like "01:23". This check has to
-- be here so that lengths like "1:01:23" are still allowed.
self:addWarning(
string.format(cfg.leading_0_in_minutes, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
end
-- Add a warning and return if we did not find a match.
if not seconds then
self:addWarning(
string.format(cfg.not_a_time, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
-- Check that the minutes are less than 60 if we have an hours field.
if hours and tonumber(minutes) >= 60 then
self:addWarning(
string.format(cfg.more_than_60_minutes, mw.text.nowiki(length)),
cfg.input_error_category
)
return nil
end
-- Check that the seconds are less than 60
if tonumber(seconds) >= 60 then
self:addWarning(
string.format(cfg.more_than_60_seconds, mw.text.nowiki(length)),
cfg.input_error_category
)
end
return nil
end
--------------------------------------------------------------------------------
-- Track class
--------------------------------------------------------------------------------
local Track = {}
Track.__index = Track
addMixin(Track, Validation)
Track.fields = cfg.track_field_names
Track.cellMethods = {
number = 'makeNumberCell',
title = 'makeTitleCell',
writer = 'makeWriterCell',
lyrics = 'makeLyricsCell',
music = 'makeMusicCell',
extra = 'makeExtraCell',
length = 'makeLengthCell',
}
function Track.new(data)
local self = setmetatable({}, Track)
Validation.init(self)
for field in pairs(Track.fields) do
self[field] = data[field]
end
self.number = assert(tonumber(self.number))
self:validateLength(self.length)
return self
end
function Track:getLyricsCredit()
return self.lyrics
end
function Track:getMusicCredit()
return self.music
end
function Track:getWriterCredit()
return self.writer
end
function Track:getExtraField()
return self.extra
end
-- Note: called with single dot syntax
function Track.makeSimpleCell(wikitext)
return mw.html.create('td')
:wikitext(wikitext or cfg.blank_cell)
end
function Track:makeNumberCell()
return mw.html.create('th')
:attr('id', string.format(cfg.track_id, self.number))
:attr('scope', 'row')
:wikitext(string.format(cfg.number_terminated, self.number))
end
function Track:makeTitleCell()
local titleCell = mw.html.create('td')
titleCell:wikitext(
self.title and string.format(cfg.track_title, self.title) or cfg.untitled
)
if self.note then
titleCell:wikitext(string.format(cfg.note, self.note))
end
return titleCell
end
function Track:makeWriterCell()
return Track.makeSimpleCell(self.writer)
end
function Track:makeLyricsCell()
return Track.makeSimpleCell(self.lyrics)
end
function Track:makeMusicCell()
return Track.makeSimpleCell(self.music)
end
function Track:makeExtraCell()
return Track.makeSimpleCell(self.extra)
end
function Track:makeLengthCell()
return mw.html.create('td')
:addClass('tracklist-length')
:wikitext(self.length or cfg.blank_cell)
end
function Track:exportRow(columns)
local columns = columns or {}
local row = mw.html.create('tr')
for i, column in ipairs(columns) do
local method = Track.cellMethods[column]
if method then
row:node(self[method](self))
end
end
return row
end
--------------------------------------------------------------------------------
-- TrackListing class
--------------------------------------------------------------------------------
local TrackListing = {}
TrackListing.__index = TrackListing
addMixin(TrackListing, Validation)
TrackListing.fields = cfg.track_listing_field_names
TrackListing.deprecatedFields = cfg.deprecated_track_listing_field_names
function TrackListing.new(data)
local self = setmetatable({}, TrackListing)
Validation.init(self)
-- Check for deprecated arguments
for deprecatedField in pairs(TrackListing.deprecatedFields) do
if data[deprecatedField] then
self:addCategory(cfg.deprecated_parameter_category)
break
end
end
-- Validate total length
if data.total_length then
self:validateLength(data.total_length)
end
-- Add properties
for field in pairs(TrackListing.fields) do
self[field] = data[field]
end
-- Evaluate boolean properties
self.showCategories = yesno(self.category) ~= false
self.category = nil
-- Make track objects
self.tracks = {}
for i, trackData in ipairs(data.tracks or {}) do
table.insert(self.tracks, Track.new(trackData))
end
-- Find which of the optional columns we have.
-- We could just check every column for every track object, but that would
-- be no fun^H^H^H^H^H^H inefficient, so we use four different strategies
-- to try and check only as many columns and track objects as necessary.
do
local optionalColumns = {}
local columnMethods = {
lyrics = 'getLyricsCredit',
music = 'getMusicCredit',
writer = 'getWriterCredit',
extra = 'getExtraField',
}
local doneWriterCheck = false
for i, trackObj in ipairs(self.tracks) do
for column, method in pairs(columnMethods) do
if trackObj[method](trackObj) then
optionalColumns[column] = true
columnMethods[column] = nil
end
end
if not doneWriterCheck and optionalColumns.writer then
doneWriterCheck = true
optionalColumns.lyrics = nil
optionalColumns.music = nil
columnMethods.lyrics = nil
columnMethods.music = nil
end
if not next(columnMethods) then
break
end
end
self.optionalColumns = optionalColumns
end
return self
end
--------------------------------------------------------------------------------
-- Function for automatic punctuation for parameters:
-- all_writing, all_lyrics, all_music
-- Punctuation defaults to '.' unless ':' or '.' already exist
-- Automatic punctuation limited to parameter values not containing parser tags
-- i.e. <ref>Text</ref>, <nowiki></nowiki>, etc.
--------------------------------------------------------------------------------
function fullstop(a)
if a ~= mw.text.killMarkers(mw.getCurrentFrame():preprocess(a)) or
a:sub(-1,-1) == ":" or
a:sub(-1,-1) == "." then
return a
else
return a .. '.'
end
end
function TrackListing:makeIntro()
if self.all_writing then
return string.format(cfg.tracks_written, fullstop(self.all_writing))
elseif self.all_lyrics and self.all_music then
return mw.message.newRawMessage(
cfg.lyrics_written_music_composed,
self.all_lyrics,
fullstop(self.all_music)
):plain()
elseif self.all_lyrics then
return string.format(cfg.lyrics_written, fullstop(self.all_lyrics))
elseif self.all_music then
return string.format(cfg.music_composed, fullstop(self.all_music))
else
return nil
end
end
function TrackListing:renderTrackingCategories()
if not self.showCategories or mw.title.getCurrentTitle().namespace ~= 0 then
return ''
end
local ret = ''
local function addCategory(cat)
ret = ret .. string.format('[[Category:%s]]', cat)
end
for i, category in ipairs(self:getCategories()) do
addCategory(category)
end
for i, track in ipairs(self.tracks) do
for j, category in ipairs(track:getCategories()) do
addCategory(category)
end
end
return ret
end
function TrackListing:renderWarnings()
if not cfg.show_warnings then
return ''
end
local ret = {}
local function addWarning(msg)
table.insert(ret, string.format(cfg.track_listing_error, msg))
end
for i, warning in ipairs(self:getWarnings()) do
addWarning(warning)
end
for i, track in ipairs(self.tracks) do
for j, warning in ipairs(track:getWarnings()) do
addWarning(warning)
end
end
return table.concat(ret, '<br>')
end
function TrackListing:__tostring()
-- Root of the output
local root = mw.html.create('div')
:addClass('track-listing')
local intro = self:makeIntro()
if intro then
root:tag('p')
:wikitext(intro)
:done()
end
-- Start of track listing table
local tableRoot = mw.html.create('table')
tableRoot
:addClass('tracklist')
-- Overall table width
if self.width then
tableRoot
:css('width', self.width)
end
-- Header row
if self.headline then
tableRoot:tag('caption')
:wikitext(self.headline or cfg.track_listing)
end
-- Headers
local headerRow = tableRoot:tag('tr')
---- Track number
headerRow
:tag('th')
:addClass('tracklist-number-header')
:attr('scope', 'col')
:tag('abbr')
:attr('title', cfg.number)
:wikitext(cfg.number_abbr)
-- Find columns to output
local columns = {'number', 'title'}
if self.optionalColumns.writer then
columns[#columns + 1] = 'writer'
else
if self.optionalColumns.lyrics then
columns[#columns + 1] = 'lyrics'
end
if self.optionalColumns.music then
columns[#columns + 1] = 'music'
end
end
if self.optionalColumns.extra then
columns[#columns + 1] = 'extra'
end
columns[#columns + 1] = 'length'
-- Find column width
local nColumns = #columns
local nOptionalColumns = nColumns - 3
local titleColumnWidth = 100
if nColumns >= 5 then
titleColumnWidth = 40
elseif nColumns >= 4 then
titleColumnWidth = 60
end
local optionalColumnWidth = ((100 - titleColumnWidth) / nOptionalColumns) .. '%'
titleColumnWidth = titleColumnWidth .. '%'
---- Title column
headerRow:tag('th')
:attr('scope', 'col')
:css('width', self.title_width or titleColumnWidth)
:wikitext(cfg.title)
---- Optional headers: writer, lyrics, music, and extra
local function addOptionalHeader(field, headerText, width)
if self.optionalColumns[field] then
headerRow:tag('th')
:attr('scope', 'col')
:css('width', width or optionalColumnWidth)
:wikitext(headerText)
end
end
addOptionalHeader('writer', cfg.writer, self.writing_width)
addOptionalHeader('lyrics', cfg.lyrics, self.lyrics_width)
addOptionalHeader('music', cfg.music, self.music_width)
addOptionalHeader(
'extra',
self.extra_column or cfg.extra,
self.extra_width
)
---- Track length
headerRow:tag('th')
:addClass('tracklist-length-header')
:attr('scope', 'col')
:wikitext(cfg.length)
-- Tracks
for i, track in ipairs(self.tracks) do
tableRoot:node(track:exportRow(columns))
end
-- Total length
if self.total_length then
tableRoot
:tag('tr')
:addClass('tracklist-total-length')
:tag('th')
:attr('colspan', nColumns - 1)
:attr('scope', 'row')
:tag('span')
:wikitext(cfg.total_length)
:done()
:done()
:tag('td')
:wikitext(self.total_length)
end
root:node(tableRoot)
-- Warnings and tracking categories
root:wikitext(self:renderWarnings())
root:wikitext(self:renderTrackingCategories())
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Track listing/styles.css' }
} .. tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._main(args)
-- Process numerical args so that we can iterate through them.
local data, tracks = {}, {}
for k, v in pairs(args) do
if type(k) == 'string' then
local prefix, num = k:match('^(%D.-)(%d+)$')
if prefix and Track.fields[prefix] and (num == '0' or num:sub(1, 1) ~= '0') then
-- Allow numbers like 0, 1, 2 ..., but not 00, 01, 02...,
-- 000, 001, 002... etc.
num = tonumber(num)
tracks[num] = tracks[num] or {}
tracks[num][prefix] = v
else
data[k] = v
end
end
end
data.tracks = (function (t)
-- Compress sparse array
local ret = {}
for num, trackData in pairs(t) do
trackData.number = num
table.insert(ret, trackData)
end
table.sort(ret, function (t1, t2)
return t1.number < t2.number
end)
return ret
end)(tracks)
return tostring(TrackListing.new(data))
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Track listing'
})
return p._main(args)
end
return p
ba53211a0ca356f872c9a88324fd2a6a9e8ff30a
Module:Track listing/configuration
828
409
579
578
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
return {
show_warnings = false,
input_error_category = 'Track listings with input errors',
collapsed_parameter_category = 'Track listings that use the collapsed parameter ',
deprecated_parameter_category = 'Track listings with deprecated parameters',
track_field_names = {
number = true,
title = true,
note = true,
length = true,
lyrics = true,
music = true,
writer = true,
extra = true,
},
track_listing_field_names = {
width = true,
headline = true,
all_writing = true,
all_lyrics = true,
all_music = true,
extra_column = true,
total_length = true,
title_width = true,
writing_width = true,
lyrics_width = true,
music_width = true,
extra_width = true,
category = true,
},
deprecated_track_listing_field_names = {
writing_credits = true,
lyrics_credits = true,
music_credits = true,
},
leading_0_in_hours = "Invalid time '%s' (times in format 'h:mm:ss' cannot start with zero)",
leading_0_in_minutes = "Invalid time '%s' (times in format 'mm:ss' cannot start with zero)",
not_a_time = "Invalid time '%s' (times must be in a format of 'm:ss', 'mm:ss' or 'h:mm:ss')",
more_than_60_minutes = "Invalid track length '%s' (if hours are specified, the number of minutes must be less than 60)",
more_than_60_seconds = "Invalid track length '%s' (number of seconds must be less than 60)",
tracks_written = 'All tracks are written by %s',
lyrics_written_music_composed = 'All lyrics are written by $1; all music is composed by $2',
lyrics_written = 'All lyrics are written by %s',
music_composed = 'All music is composed by %s',
track_listing_error = '<strong class="error">Track listing error: %s</strong>',
deprecated_collapsed = 'Deprecated collapsed parameter in use.',
title = 'Title',
number = 'Number',
number_abbr = 'No.',
track_listing = 'Track listing',
writer = 'Writer(s)',
lyrics = 'Lyrics',
music = 'Music',
extra = '{{{extra_column}}}',
length = 'Length',
blank_cell = ' ',
track_title = '"%s"',
untitled = 'Untitled',
note = ' (%s)',
track_id = 'track%d',
number_terminated = '%d.',
total_length = 'Total length:'
}
5fcb26176f1458c5fdb9b1ba7af4cafc73cbd05a
Bleak Faith: Forsaken Original Soundtrack
0
413
587
586
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
The '''{{PAGENAME}}''' is a collection of songs that play throughout {{BFF}}. It is composed by [[Martel]] and [[Rade Vukčević]].
The soundtrack contains 44 tracks across all three discs with a combined total runtime of {{Duration|3:30:00|display=three and a half hours}}.
== Songs ==
<!--
// Generated using the following script on the Apple Music page:
(function() {
const discs = document.querySelectorAll('.section--disc');
console.debug(discs);
for (const disc of discs) {
const header = disc.querySelector('.disc-header h2.title').textContent;
const songs = disc.querySelectorAll('.songs-list .songs-list-row');
let total_length = 0;
const songData = Array.from(songs).map(s => {
const no = s.querySelector('.songs-list-row__song-index .songs-list-row__column-data').textContent;
const title = s.querySelector('.songs-list-row__song-name').textContent;
const length = s.querySelector('.songs-list-row__length').textContent;
const [mins, secs] = length.split(':').map(l => Number(l));
total_length += mins * 60 + secs;
return `| title${no} = ${title}\n| length${no} = ${length}`;
});
const tracks = songData.join("\n\n");
const tot_hors = Math.floor(total_length / 60 / 60);
const tot_mins = Math.floor((total_length - tot_hors * 60 * 60) / 60);
const tot_secs = total_length % 60;
const entry = `{{Track listing\n| headline = ${header}\n| total_length = ${tot_hors}:${tot_mins}:${tot_secs}\n\n${tracks}\n}}`;
console.info(entry);
}
})();
-->
{{Track listing
| headline = Disc 1
| total_length = 1:49:26
| title1 = Premonitions
| length1 = 3:19
| title2 = The Monastery
| length2 = 8:22
| title3 = Oathsworn
| length3 = 4:25
| title4 = The Imperial Siege
| length4 = 3:25
| title5 = Concrete Sea
| length5 = 4:32
| title6 = Sky Towers
| length6 = 9:23
| title7 = Downpour
| length7 = 9:12
| title8 = The Serdars
| length8 = 8:59
| title9 = The Inquisition
| length9 = 5:31
| title10 = The Valley
| length10 = 3:34
| title11 = The Trisagion
| length11 = 2:12
| title12 = Cloaca Maxima
| length12 = 3:15
| title13 = The Call of the Void
| length13 = 7:45
| title14 = The Machinarium
| length14 = 11:36
| title15 = A Bitter Evening
| length15 = 3:58
| title16 = Dreamlight
| length16 = 7:32
| title17 = The Instinct
| length17 = 2:27
| title18 = Recycled
| length18 = 3:00
| title19 = Domus Aurea
| length19 = 6:59
}}
{{Track listing
| headline = Disc 2
| total_length = 48:46
| title1 = Aurelian
| length1 = 5:31
| title2 = Vangelian
| length2 = 4:13
| title3 = Machinebirth
| length3 = 4:52
| title4 = Melanion
| length4 = 6:15
| title5 = Oberon
| length5 = 5:10
| title6 = Serapian
| length6 = 5:35
| title7 = Limitless
| length7 = 4:54
| title8 = The Fade
| length8 = 2:42
| title9 = Wandering
| length9 = 4:50
| title10 = Machinedream
| length10 = 4:44
}}
{{Track listing
| headline = Disc 3
| total_length = 52:11
| title1 = The Mountain Wreath
| length1 = 2:21
| title2 = Destiny
| length2 = 8:45
| title3 = Saberstorm
| length3 = 2:59
| title4 = Yaroslav's Rebellion
| length4 = 5:09
| title5 = The Nightmare (Menu Theme)
| length5 = 2:27
| title6 = Konrad the Traitor
| length6 = 2:49
| title7 = Yuliya
| length7 = 2:53
| title8 = Nemesis
| length8 = 3:04
| title9 = Belisarius
| length9 = 3:18
| title10 = Aberrant Knight
| length10 = 3:02
| title11 = Nurgei
| length11 = 3:15
| title12 = Wormlord
| length12 = 3:53
| title13 = Wyvern's Lament
| length13 = 3:52
| title14 = Doppelganger
| length14 = 2:22
| title15 = Baryak
| length15 = 2:02
}}
== External links ==
* [https://open.spotify.com/album/1cORrZ4GAVDbMvbEbvEL4q Spotify]
* [https://music.apple.com/ua/album/bleak-faith-original-soundtrack/1678680781 Apple Music]
* [https://martelvladimiroff.bandcamp.com/album/bleak-faith-forsaken Bandcamp]
d8060222851027ad9a4b2724ead306d2de16f292
Module:Track listing/styles.css
828
414
589
588
2025-08-21T17:59:12Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
/* {{pp|small=y}} */
.tracklist {
border-spacing: 0;
}
/* set on all rows we can set the total length row to transparent */
.tracklist tr {
background-color: var(--background-color-base, #fff);
}
.tracklist tr:nth-child(2n-1) {
background-color: var(--background-color-neutral-subtle, #f8f9fa);
}
.tracklist caption {
text-align: left;
font-weight: bold;
}
.tracklist td,
.tracklist th[scope="row"] {
vertical-align: top;
}
.tracklist th[scope="col"] {
text-align: left;
background-color: var(--background-color-neutral, #eaecf0);
}
.tracklist th.tracklist-length-header,
.tracklist th.tracklist-number-header,
.tracklist th[scope="row"],
.tracklist-length,
.tracklist-total-length td {
padding-right: 10px;
text-align: right;
}
.tracklist th[scope="row"] {
font-weight: normal;
}
.tracklist-number-header {
width: 2em;
padding-left: 10px;
}
.tracklist-length-header {
width: 4em;
}
.tracklist tr.tracklist-total-length {
background-color: transparent;
}
.tracklist .tracklist-total-length th {
padding: 0;
font-weight: bold;
}
.tracklist-total-length th > span {
float: right;
padding: 0 10px;
background-color: var(--background-color-neutral, #eaecf0);
}
.tracklist-total-length td {
background-color: var(--background-color-neutral, #eaecf0);
font-weight: bold;
padding: 0 10px 0 0;
}
bc12ba45209a6a001e4bfaed9bda7f8aff5d3334
Module:Hatnote/styles.css
828
415
590
2025-08-21T18:00:01Z
Sharparam
284703
Created page with "/* {{pp|small=y}} */ .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; } @media print { body.ns-0 .hatnote { display: none !impo..."
sanitized-css
text/css
/* {{pp|small=y}} */
.hatnote {
font-style: italic;
}
/* Limit structure CSS to divs because of [[Module:Hatnote inline]] */
div.hatnote {
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
}
.hatnote i {
font-style: normal;
}
/* The templatestyles element inserts a link element before hatnotes.
* TODO: Remove link if/when WMF resolves T200206 */
.hatnote + link + .hatnote {
margin-top: -0.5em;
}
@media print {
body.ns-0 .hatnote {
display: none !important;
}
}
aa61a27060ce48815745f5b81624c7fd95b51b82
Bleak Faith: Forsaken Wiki/about
0
6
591
11
2025-08-21T18:02:04Z
Sharparam
284703
Link to BFF article
wikitext
text/x-wiki
{{Main page box/start
| title = About [[Bleak Faith: Forsaken]]
}}
This is an example main page. You can redesign it however you want, or you can keep the layout the same but change the contents (e.g. this part should talk about your game). Take a look at some other wiki.gg wikis for inspiration!
<div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
525e985f7465f983b7dbfb9dc8b65b3a47787c0b
Bleak Faith: Forsaken Wiki/pages
0
5
592
9
2025-08-21T18:04:17Z
Sharparam
284703
Improve example links
wikitext
text/x-wiki
{{Main page box/start
| title = Useful wiki pages
| class = centered-content
}}
<div class="mp-links columns-2">
* {{MP link|Items!}}
* {{MP link|Random page|link=Special:Random}}
* {{MP link|Example character|link=The Handler}}
* {{MP link|Example weapon|link=Katanas|image=Katanas.png|size=92px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
ee9c73ccd6857df2fd240662164ee1044bcd17b3
593
592
2025-08-21T18:05:07Z
Sharparam
284703
Fix link to items
wikitext
text/x-wiki
{{Main page box/start
| title = Useful wiki pages
| class = centered-content
}}
<div class="mp-links columns-2">
* {{MP link|Items!|link=Items}}
* {{MP link|Random page|link=Special:Random}}
* {{MP link|Example character|link=The Handler}}
* {{MP link|Example weapon|link=Katanas|image=Katanas.png|size=92px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
8ef2b26c945f269ede16829e646573a854bdd28f
Items
0
416
595
594
2025-08-21T18:09:59Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' come in various forms, from [[equipment]] that can be worn by the player, to [[consumables]] that can be used for various effects.
{{Navbox/Items}}
f9e1d38d5ce67ef854c74e6280c1d93d64ed929f
630
595
2025-08-21T18:10:44Z
Sharparam
284703
Add category
wikitext
text/x-wiki
'''{{PAGENAME}}''' come in various forms, from [[equipment]] that can be worn by the player, to [[consumables]] that can be used for various effects.
{{Navbox/Items}}
[[Category:Items]]
5f640b156bc0e2b0a2f746a56e536f618b5120fe
Template:Infobox/Item
10
417
597
596
2025-08-21T18:09:59Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind=item
| sep=,
| image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections=DescriptionSection
| DescriptionSection=Description
| DescriptionSection_label=Description
| Description_nolabel=yes
}}{{#if:{{NAMESPACE}}||[[Category:Items]]}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]</noinclude>
5d4929aef36fffdaea5150152baf68fb562131a0
Category:Essential items
14
418
599
598
2025-08-21T18:10:00Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Category:Upgrade items
14
419
601
600
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Greater Anomalous Crystal
0
420
603
602
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is an [[Items|item]] found in {{BFF}}. It can be embedded into [[weapons]] or [[armor]] to improve their properties.
== Variants ==
There are several different variants of the crystal that all share the same name in-game, differing only by their visual appearance and the effects they give when embedded into [[equipment]].
They have received ad-hoc names on the wiki temporarily to be able to differentiate them. The names are assigned based on the item's appearance.
=== "Purple jagged" ===
* '''Effect in [[armor]]:''' +25 max [[flux]] points.
* '''Effect in [[weapons]]:''' +8% [[technomancy]] penetration.
=== "Orange shield" ===
* '''Effect in [[armor]]:''' +30% base weapon damage.
* '''Effect in [[weapons]]:''' +9% attack power.
=== "Ruby" ===
* '''Effect in [[armor]]:''' +75 max health points.
* '''Effect in [[weapons]]:''' +15% critical damage.
== Locations ==
{| class="wikitable sortable"
! scope="col" | Area
! scope="col" class="unsortable" | Description
! scope="col" class="unsortable" | Coordinates
! scope="col" | Variant
|-
| [[Blok 6147]] || For now, refer to a walkthrough video on Discord.[https://discord.com/channels/541778372997677056/1087019327712133140/1087020918221590608] || {{coords|-1155|-1340|2635}} || Orange shield
|-
| [[Deluge]] || Starting from the first [[homunculus]] in the area, climb the stairs (past [[The Handler]]) and enter the small tower inhabited by a [[Diver]] [[Enemies|enemy]]. Look over the edge and you'll see a rusty walkway circling the tower. Drop down onto the walkway and follow it to the right (the direction the enemy was facing) and keep following it to find a ladder going up. Climb the ladder and continue straight to notice a gap in the floor, jump the gap and continue forward to find the crystal. (Going down the gap leads to a post-process effect unlock ("Dramatic").) || {{coords|-3178|-1346|5700}} || Purple jagged
|-
| [[Uranopolis]] || Next to a tree near the giant enemy that drops [[Ring of Casting Speed]]. || {{coords|-2185|-4082|1473}} || Orange shield
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head up the big stairs and take the left path. At the end is a big cliff. Walk near the cliff and use the jump button repeatedly to climb to the top of the cliff. The item is on the edge of the cliff. || {{coords|1246|-8872|1517}} || Ruby
|}
{{Navbox/Items}}
[[Category:Items]]
[[Category:Anomalous crystals]]
f3dbb5471d067f2759e3b9ef743f9c6ebc7f3619
Handler Echo
0
421
605
604
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| image = Handler Echo.png
| title = {{PAGENAME}}
| Description = An obscure residue used to supplement [[The Handler|the Handler's]] capabilities. [[The Handler]] can use this to upgrade [[equipment]] more effectively.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] used to level up [[The Handler]], in order to increase the max level equipment can be upgraded to.
== Usage ==
If the item is in your inventory, [[The Handler]] will automatically level up when you next interact with her. A message will also pop up in the bottom right corner of the screen informing you of the new synchronization level.
== Acquisition ==
* Drops from [[Konrad the Traitor]].
* Can drop from samurai enemies in [[Uranopolis]] (limited to one drop).
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Rain District]] || Up some stairs. || {{coords|-36697.35|-17753.66|12174.48}}
|-
| [[Asylum]] || In the spiral staircase with the shortcut door to the courtyard there is a floating ghost. Move through the ghost and the echo will be right behind it. || {{coords|-4225|6824|9253}}
|-
| [[Desert]] || In the big building after the sand worm, where Yaroslav's crew is. The echo is sitting on a toppled pillar. || {{coords|3720|1159|-1397}}
|}
{{Navbox/Items}}
[[Category:Essential items]]
8e39742af7d396a0340cfbf20893f0518504a05a
Plagued Blood
0
422
607
606
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Plagued Blood.png
| Description = Harvested from a burial site, this unsettling vial contains a sample of plagued blood belonging to a Revenant.
}}
== Location ==
{{coords|-3898|1671|1585}}
Located at the top of the big tower in [[Asylum|the asylum]], after climbing a staircase into a room with a bunch of empty bookshelves, look to your right to see the item on a table.
== Usage ==
Having this item in your inventory allows for spawning some optional bosses.
* [[Plagued Warden]]
* [[Plagued Revenant]]
{{Navbox/Items}}
[[Category:Essential items]]
1f8d91aaf3bd07906a2a403a6db0b8ae9ee60325
Homunculus Mirage
0
423
609
608
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| tabs=Normal,Husk
| Normal_title = Homunculus Mirage
| Husk_title = Humunculus Mirage Husk
| images = [[File:Homunculus Mirage.png|300px]],[[File:Homunculus Mirage Husk.png|300px]]
| Normal_Description = The Homunculus triggers its ability only when your vital signs have ceased – reassembling your body on a molecular level elsewhere while keeping your consciousness intact, allowing for seamless and instantaneous relocation.
| Husk_Description = The husk of the Homunculus stores your current state and consciousness. Return at the Homunculus to combine the two again, allowing you to place the Homunculus elsewhere.
}}
{{Navbox/Items}}
[[Category:Essential items]]
8fb75994fa6cda97b1ebe8cfd760652188977f94
Perk Essence
0
424
611
610
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| tabs = Stable,Unstable
| images = [[File:Perk Essence.png|300px]],[[File:Unstable Perk Essence.png|300px]]
| Stable_title = Perk Essence
| Unstable_title = Unstable Perk Essence
| Stable_Description = An artifact used in the process of embedding perks.
| Unstable_Description = Get to a checkpoint to turn it into a perk, on death goes back to it's [sic] original location.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] used to acquire [[perks]] or perk upgrades.
== Acquisition ==
The unstable variant drops from some [[bosses]] (excluding mini-bosses), bringing it to a [[homunculus]] without dying stabilises it. It has to be brought to a normal homunculus, not one spawned by the [[Homunculus Mirage]].
Dying on the way to a homunculus while the item is still in its unstable form will respawn it in the boss's arena, forcing the player to go back and pick it up again.
{{Navbox/Items}}
[[Category:Essential items]]
e1971e413ec50fbb2dc150383cacbe574eece1c5
Upgrade Module
0
425
613
612
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Upgrade Module.png
| Description = A rare artifact used in the process of upgrading gear.
}}
'''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5.
{{Navbox/Items}}
[[Category:Essential items]]
[[Category:Upgrade items]]
f405ef0912d49ef39a269fb10d08d14c1e5322bb
Anomalous Fragment
0
426
615
614
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Anomalous Fragment.png
| Description = [[The Handler|Handler]] may convert it to a more useful form.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Acquisition ==
Drops from [[bosses]] in [[NG+]].
== Usage ==
Used to manufacture [[Greater Anomalous Crystal|Greater Anomalous Crystals]] at [[The Handler]].
[[Category:Essential items]]
7980e000ddcb82018f50487ce22ffa9df9abbde2
Anomalous crystals
0
427
617
616
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties.
== Overview ==
There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''.
Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, causing it to be lost forever.
{{Navbox/Items}}
[[Category:Anomalous crystals]]
5cef9dfbb687f0e77132dcb7450a11e973b25b95
Consumables
0
428
619
618
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[Items|item]] that the player can use to heal themselves, restore resources, or gain various buffs.
{{Navbox/Consumables}}
d9a89e867297dd4ee6e2667cdb541b327cdc74e4
Old Key
0
429
621
620
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Old Key.png
| Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]].
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Location ==
{{coords|19328.57|-41596.65|3.83}}
Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up.
== Usage ==
Unlocks the gate at the top of the [[Monastery]], found near the entrance to [[Konrad the Traitor|Konrad the Traitor's]] boss arena (keep going past the entrance instead of entering it).
{{Navbox/Items}}
a6c6a09cf952e26c4386195a47267f9112b2ac5e
Ability Splinter
0
430
623
622
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. It is used to equip and change [[abilities]].
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Deluge]] || Found near the [[Paladin Mace]]. Facing where the mace is, head left and slightly behind and look behind the large pillar to find the item. || {{coords|-4581|-7721|5575}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and keep right until you get to the room with a staircase going down. Before heading down the staircase, walk around it on its right and check the corner to find the item. || {{coords|1120|-7590|161}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the second right to get to the edge of the cliff with a bunch of graves. The item can be found near one of the graves. || {{coords|1321|-8034|190}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the left path to a cliff. Climb the cliff by repeatedly tapping the jump button. Once at the top, take the path leading down and follow it past a group of buildings (where the [[Soul Reaper]] can be found). Past the buildings are a set of graves with the item on top of one of them.
|}
{{Navbox/Items}}
[[Category:Essential items]]
7b6f4fe171581f79b13cd24ed99204aef452dab4
Materials
0
431
625
624
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items.
{{Navbox/Materials}}
16c02de5636f61c53bd16cf7e1d04625cb9646e2
Upgrade Splinter
0
432
627
626
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3.
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}}
|}
{{Navbox/Items}}
[[Category:Upgrade items]]
b5014301a8a656873f94d981f8cd2ac3b7f1bbb7
Gingko Leaves
0
433
629
628
2025-08-21T18:10:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]].
== Acquisition ==
Drops from several enemies in the game, as well as found on the ground in certain locations.
== Locations ==
{| class="wikitable"
! Amount !! Area !! Description !! Coordinates
|-
| 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}}
|}
{{Navbox/Materials}}
[[Category:Materials]]
0fbff16a09a73af85c8ed1146f701144d7062005
Category:Items
14
434
631
2025-08-21T18:11:06Z
Sharparam
284703
Created page with "[[Items]] in {{BFF}}."
wikitext
text/x-wiki
[[Items]] in {{BFF}}.
16568f5641e17cc4807c868d51448584c4eee705
Homunculus Mirage Husk
0
435
632
2025-08-21T18:12:26Z
Sharparam
284703
Redirected page to [[Homunculus Mirage]]
wikitext
text/x-wiki
#REDIRECT [[Homunculus Mirage]]
4c51bab80fcbd9a41985179f691020f9d2813124
Unstable Perk Essence
0
436
633
2025-08-21T18:12:56Z
Sharparam
284703
Redirected page to [[Perk Essence]]
wikitext
text/x-wiki
#REDIRECT [[Perk Essence]]
e79a9129b7510dd8f427798b8611e23429960e63
Template:Navbox/Equipment
10
437
635
634
2025-08-21T18:16:06Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Equipment
| title = [[Equipment]]
| group1 = [[Weapons]]
| list1 = {{Navbox/Weapons|child}}
| group2 = [[Armor]]
| list2 = {{Navbox/Armor|child}}
| group3 = [[Amulets]]
| list3 = {{Navbox/Amulets|child}}
| group4 = [[Rings]]
| list4 = {{Navbox/Rings|child}}
| group5 = [[Capes]]
| list5 = {{Navbox/Capes|child}}
}}
4e9b09f139c8eefe809a3e0918f7584ff16eb363
644
635
2025-08-21T18:17:24Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Equipment
| title = [[Equipment]]
| group1 = [[Weapons]]
| list1 = {{Navbox/Weapons|child}}
| group2 = [[Armor]]
| list2 = {{Navbox/Armor|child}}
| group3 = [[Amulets]]
| list3 = {{Navbox/Amulets|child}}
| group4 = [[Rings]]
| list4 = {{Navbox/Rings|child}}
| group5 = [[Capes]]
| list5 = {{Navbox/Capes|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
73577a6e1a11270ffa35063d0266aa7a7766cf89
Template:Navbox/Weapons
10
438
637
636
2025-08-21T18:16:06Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<!-- Weapons must be listed in alphabetical order! -->
{{Navbox
| {{{1|}}}
| template = Navbox/Weapons
| title = [[Weapons]]
| group1 = [[One-handed weapons|One-handed]]
| list1 =
* [[Arming Sword]]
* [[Industrial Axe]]
* [[Industrial Mace]]
* [[Iron Pipe]]
* [[Longsword]]
* [[Machinist's Hammer]]
* [[Morning Star]]
* [[Paladin Mace]]
* [[Ratagan Sabre]]
* [[Scimitar]]
* [[Soul Breaker]]
* [[Tire Iron]]
* [[Torch]]
* [[Woodchopper]]
| group2 = [[Two-handed weapons|Two-handed]]
| list2 =
* [[Anastasia]]
* [[Claymore]]
* [[Faussart]]
* [[Halberd]]
* [[Mechanical Tenderizer]]
* [[Nodachi]]
* [[Royal Claymore]]
* [[Rusty Claymore]]
* [[Solaris]]
* [[Soul Reaper]]
* [[Valtiel]]
| group2.1 = [[Dual Wields]]
| list2.1 =
* [[Blades of Atropos]]
* [[Daggers]]
* [[Kamas]]
* [[Katanas]]
* [[Khopeshs]]
* [[Lacerators]]
| group2.2 = [[Twinblades]]
| list2.2 =
* [[Twinblade]]
| group2.3 = [[Greatweapons]]
| list2.3 =
* [[Armor Buster]]
* [[Divine Greataxe]]
* [[Eviscerator]]
* [[Greathammer]]
| group3 = [[Ranged weapons|Ranged]]
| group3.1 = [[Longbows]]
| list3.1 =
* [[Arcane Bow]]
* [[Longbow]]
* [[Taskmaster]]
* [[Winged bow]]
| group3.2 = [[Staves]]
| list3.2 =
* [[Asklepios]]
* [[Blessed Crosier]]
* [[Evolved Staff]]
* [[Mechanomad Staff]]
* [[Vermillion Staff]]
}}<noinclude>{{Documentation}}</noinclude>
441db50a6ddfe17d473822864f9d20f3a2af385f
645
637
2025-08-21T18:18:01Z
Sharparam
284703
Add category, remove documentation template
wikitext
text/x-wiki
<!-- Weapons must be listed in alphabetical order! -->
{{Navbox
| {{{1|}}}
| template = Navbox/Weapons
| title = [[Weapons]]
| group1 = [[One-handed weapons|One-handed]]
| list1 =
* [[Arming Sword]]
* [[Industrial Axe]]
* [[Industrial Mace]]
* [[Iron Pipe]]
* [[Longsword]]
* [[Machinist's Hammer]]
* [[Morning Star]]
* [[Paladin Mace]]
* [[Ratagan Sabre]]
* [[Scimitar]]
* [[Soul Breaker]]
* [[Tire Iron]]
* [[Torch]]
* [[Woodchopper]]
| group2 = [[Two-handed weapons|Two-handed]]
| list2 =
* [[Anastasia]]
* [[Claymore]]
* [[Faussart]]
* [[Halberd]]
* [[Mechanical Tenderizer]]
* [[Nodachi]]
* [[Royal Claymore]]
* [[Rusty Claymore]]
* [[Solaris]]
* [[Soul Reaper]]
* [[Valtiel]]
| group2.1 = [[Dual Wields]]
| list2.1 =
* [[Blades of Atropos]]
* [[Daggers]]
* [[Kamas]]
* [[Katanas]]
* [[Khopeshs]]
* [[Lacerators]]
| group2.2 = [[Twinblades]]
| list2.2 =
* [[Twinblade]]
| group2.3 = [[Greatweapons]]
| list2.3 =
* [[Armor Buster]]
* [[Divine Greataxe]]
* [[Eviscerator]]
* [[Greathammer]]
| group3 = [[Ranged weapons|Ranged]]
| group3.1 = [[Longbows]]
| list3.1 =
* [[Arcane Bow]]
* [[Longbow]]
* [[Taskmaster]]
* [[Winged bow]]
| group3.2 = [[Staves]]
| list3.2 =
* [[Asklepios]]
* [[Blessed Crosier]]
* [[Evolved Staff]]
* [[Mechanomad Staff]]
* [[Vermillion Staff]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
8e94326ebfefa20b4393ca4d4fc2a6076e02c41d
Template:Navbox/Armor
10
439
639
638
2025-08-21T18:16:06Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Crude Helmet]]
* [[Deserts Respirator Helmet]]
* [[Eris]]
* [[Librarian Hood]]
* [[Plagued Revenant Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Techpriest Helmet]]
| group2 = [[Pauldrons]]
| group3 = [[Chestguards]]
| list3 =
* [[Citadel Warrior Chest]]
* [[Corrupted Cuirass]]
* [[Librarian Overcoat]]
* [[Sentinel Chest]]
| group4 = [[Legguards]]
| list4 =
* [[Librarian Trousers]]
* [[Sentinel Legguard]]
| group5 = [[Gauntlets]]
| list5 =
* [[Sentinel Gauntlets]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>{{Documentation}}</noinclude>
d47fdce5305e2ded83cd423d5b2674c32d0dde4d
646
639
2025-08-21T18:18:25Z
Sharparam
284703
Add category, remove documentation template
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Crude Helmet]]
* [[Deserts Respirator Helmet]]
* [[Eris]]
* [[Librarian Hood]]
* [[Plagued Revenant Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Techpriest Helmet]]
| group2 = [[Pauldrons]]
| group3 = [[Chestguards]]
| list3 =
* [[Citadel Warrior Chest]]
* [[Corrupted Cuirass]]
* [[Librarian Overcoat]]
* [[Sentinel Chest]]
| group4 = [[Legguards]]
| list4 =
* [[Librarian Trousers]]
* [[Sentinel Legguard]]
| group5 = [[Gauntlets]]
| list5 =
* [[Sentinel Gauntlets]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
d68b49e449593d76c716ece8ba21c99d8eac2ea7
Template:Navbox/Shields
10
440
641
640
2025-08-21T18:16:06Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Shields
| title = [[Shields]]
| list1 =
* [[Flat Shield]]
* [[Kite Shield]]
* [[Military Shield]]
* [[Saracen Shield]]
* [[Spiked Shield]]
* [[Tall Military Shield]]
* [[Tech Shield]]
* [[Wooden Shield]]
}}
86b51292309060d7ff355bad7dc03a02f84ab69b
647
641
2025-08-21T18:18:48Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Shields
| title = [[Shields]]
| list1 =
* [[Flat Shield]]
* [[Kite Shield]]
* [[Military Shield]]
* [[Saracen Shield]]
* [[Spiked Shield]]
* [[Tall Military Shield]]
* [[Tech Shield]]
* [[Wooden Shield]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
104b8f0f103ef13f482417a9ededcf3a6c308f5a
Template:Navbox/Amulets
10
441
643
642
2025-08-21T18:16:07Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Amulets
| title = [[Amulets]]
| list1 =
* [[Amulet of Arcane Protection]]
* [[Amulet of Evasion]]
* [[Tactician's Amulet]]
}}
52e610bdb0cd1e26a433d4a731efea2e044132e1
648
643
2025-08-21T18:19:12Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Amulets
| title = [[Amulets]]
| list1 =
* [[Amulet of Arcane Protection]]
* [[Amulet of Evasion]]
* [[Tactician's Amulet]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
d43f33c31d7d77cfbae1cf4feb8facc7897d7b18
Rings
0
442
650
649
2025-08-21T18:20:39Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] that can be worn by the player to gain certain effects.
{{Navbox/Rings}}
[[Category:Rings]]
7adf2438732889de3ab3158748516564e3c337cb
Capes
0
443
652
651
2025-08-21T18:20:39Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] the player can wear to gain various bonus stats or effects.
{{Navbox/Capes}}
e68b383acdf3f302a6ce54944a3b34f545506c55
Amulets
0
444
654
653
2025-08-21T18:20:39Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox/Amulets}}
c49a050c320d9cc83e8ac20203557bb1adb26913
Shields
0
445
656
655
2025-08-21T18:20:39Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] that can be used to protect the player against incoming [[damage]].
{{Navbox/Shields}}
[[Category:Shields]]
1e7147da72fc96843c2350072a5e579292f4c0ac
Template:Navbox/Materials
10
446
657
2025-08-21T18:21:24Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Materials | title = [[Materials]] | list1= * [[Essence]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Gravicle Dust]] * [[Machinite]] * [[Neurilium]] * [[Rustvine]] * [[Sludge]] * [[Spectral Ash]] }}<noinclude>[[Category:Navigation templates]]</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Materials
| title = [[Materials]]
| list1=
* [[Essence]]
* [[Fractal Fungus]]
* [[Gingko Leaves]]
* [[Gravicle Dust]]
* [[Machinite]]
* [[Neurilium]]
* [[Rustvine]]
* [[Sludge]]
* [[Spectral Ash]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
cd837e985ae9888fcc2a331afb915045b81932ff
Template:Armor/CargoDeclare
10
447
659
658
2025-08-21T18:35:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{#cargo_declare:_table=Armor
|name=String
|setname=String
|type=String
|weight=String
|sharpMk0=Integer
|bluntMk0=Integer
|technomancyMk0=Integer
|sharpMk1=Integer
|bluntMk1=Integer
|technomancyMk1=Integer
|sharpMk2=Integer
|bluntMk2=Integer
|technomancyMk2=Integer
|sharpMk3=Integer
|bluntMk3=Integer
|technomancyMk3=Integer
|sharpMk4=Integer
|bluntMk4=Integer
|technomancyMk4=Integer
|sharpMk5=Integer
|bluntMk5=Integer
|technomancyMk5=Integer
}}
338fa661fc066d90571ae8a2a2f747cb2c0d8f4f
Template:Weapons/CargoDeclare
10
448
661
660
2025-08-21T18:35:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{#cargo_declare:_table=Weapons
|name=String
|type=String
|speed=String
|damageType=String
|damageMk0Min=Integer
|damageMk0Max=Integer
|damageMk1Min=Integer
|damageMk1Max=Integer
|damageMk2Min=Integer
|damageMk2Max=Integer
|damageMk3Min=Integer
|damageMk3Max=Integer
|damageMk4Min=Integer
|damageMk4Max=Integer
|damageMk5Min=Integer
|damageMk5Max=Integer
}}
058226c206cdffeac8dd6c20fbd40d7a4b81f948
Template:Weapons/CargoStore
10
449
663
662
2025-08-21T18:35:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#cargo_store:_table=Weapons
|name={{{name|}}}
|type={{{type|}}}
|speed={{{speed|}}}
|damageType={{{damageType|}}}
|damageMk0Min={{{damageMk0Min|}}}
|damageMk0Max={{{damageMk0Max|}}}
|damageMk1Min={{{damageMk1Min|}}}
|damageMk1Max={{{damageMk1Max|}}}
|damageMk2Min={{{damageMk2Min|}}}
|damageMk2Max={{{damageMk2Max|}}}
|damageMk3Min={{{damageMk3Min|}}}
|damageMk3Max={{{damageMk3Max|}}}
|damageMk4Min={{{damageMk4Min|}}}
|damageMk4Max={{{damageMk4Max|}}}
|damageMk5Min={{{damageMk5Min|}}}
|damageMk5Max={{{damageMk5Max|}}}
}}</includeonly><noinclude>{{#cargo_attach:table=Weapons}}</noinclude>
f0f50597b71007312dd924dfdbdaec0c577db10f
Template:Armor/CargoStore
10
450
665
664
2025-08-21T18:35:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#cargo_store:_table=Armor
|name={{{name|}}}
|setname={{{setname|}}}
|type={{{type|}}}
|weight={{{weight|}}}
|sharpMk0={{{sharpMk0|}}}
|bluntMk0={{{bluntMk0|}}}
|technomancyMk0={{{technomancyMk0|}}}
|sharpMk1={{{sharpMk1|}}}
|bluntMk1={{{bluntMk1|}}}
|technomancyMk1={{{technomancyMk1|}}}
|sharpMk2={{{sharpMk2|}}}
|bluntMk2={{{bluntMk2|}}}
|technomancyMk2={{{technomancyMk2|}}}
|sharpMk3={{{sharpMk3|}}}
|bluntMk3={{{bluntMk3|}}}
|technomancyMk3={{{technomancyMk3|}}}
|sharpMk4={{{sharpMk4|}}}
|bluntMk4={{{bluntMk4|}}}
|technomancyMk4={{{technomancyMk4|}}}
|sharpMk5={{{sharpMk5|}}}
|bluntMk5={{{bluntMk5|}}}
|technomancyMk5={{{technomancyMk5|}}}
}}</includeonly><noinclude>{{#cargo_attach:table=Armor}}</noinclude>
333780ac478dc35967062b394838e177b662daa9
Template:Infobox/Weapon
10
451
667
666
2025-08-21T18:35:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| bow
| ranged = [[Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| bow
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| bow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
6ed81445f4e99c129429ea030ff07667c32cc439
Template:Infobox/Weapon/doc
10
452
669
668
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for weapons",
"params": {
"title": {
"label": "Weapon name",
"description": "The name of the weapon",
"required": false,
"default": "{{PAGENAME}}",
"example": "Cool Sword",
"type": "string"
},
"image": {
"label": "Weapon image",
"description": "Name of the file used as the image for the weapon, should be at least 300 pixels wide.",
"required": true,
"example": "Cool weapon.png",
"type": "wiki-file-name"
},
"Type": {
"label": "Weapon type",
"description": "The type of the weapon.",
"required": true,
"example": "Dual Wields",
"type": "wiki-page-name"
},
"Speed": {
"label": "Weapon speed",
"description": "The speed category of the weapon.",
"required": true,
"example": "Fast",
"type": "string"
},
"Damage type": {
"label": "Weapon damage type",
"description": "The type of damage dealt by the weapon.",
"required": true,
"example": "Sharp",
"type": "wiki-page-name"
},
"Passives": {
"label": "Passive properties",
"description": "Any passive properties the weapon has, comma separated",
"required": false,
"example": "Health Regen, Flux Regen",
"type": "string"
},
"Abilities": {
"label": "Active abilities",
"description": "Active abilities that can be used when the weapon is equipped, comma separated",
"required": false,
"example": "Blade Dance",
"type": "string"
},
"Mk_min": {
"label": "Minimum mark level",
"description": "The initial mark level of the weapon",
"required": false,
"default": "0",
"example": "3",
"type": "number"
},
"Mk0_Damage_min": {
"label": "Min. damage at Mk. 0",
"description": "Minimum damage the weapon deals at Mk. 0",
"required": true,
"example": "5",
"type": "number"
},
"Mk0_Damage_max": {
"label": "Max. damage at Mk. 0",
"description": "Maximum damage the weapon deals at Mk. 0",
"required": true,
"example": "8",
"type": "number"
},
"Mk1_Damage_min": {
"label": "Min. damage at Mk. 1",
"description": "Minimum damage the weapon deals at Mk. 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Damage_max": {
"label": "Max. damage at Mk. 1",
"description": "Maximum damage the weapon deals at Mk. 1",
"required": true,
"example": "8",
"type": "number"
},
"Mk2_Damage_min": {
"label": "Min. damage at Mk. 2",
"description": "Minimum damage the weapon deals at Mk. 2",
"required": true,
"example": "10",
"type": "number"
},
"Mk2_Damage_max": {
"label": "Max. damage at Mk. 2",
"description": "Maximum damage the weapon deals at Mk. 2",
"required": true,
"example": "15",
"type": "number"
},
"Mk3_Damage_min": {
"label": "Min. damage at Mk. 3",
"description": "Minimum damage the weapon deals at Mk. 3",
"required": true,
"example": "20",
"type": "number"
},
"Mk3_Damage_max": {
"label": "Max. damage at Mk. 3",
"description": "Maximum damage the weapon deals at Mk. 3",
"required": true,
"example": "25",
"type": "number"
},
"Mk4_Damage_min": {
"label": "Min. damage at Mk. 4",
"description": "Minimum damage the weapon deals at Mk. 4",
"required": true,
"example": "30",
"type": "number"
},
"Mk4_Damage_max": {
"label": "Max. damage at Mk. 4",
"description": "Maximum damage the weapon deals at Mk. 4",
"required": true,
"example": "40",
"type": "number"
},
"Mk5_Damage_min": {
"label": "Min. damage at Mk. 5",
"description": "Minimum damage the weapon deals at Mk. 5",
"required": true,
"example": "50",
"type": "number"
},
"Mk5_Damage_max": {
"label": "Max. damage at Mk. 5",
"description": "Maximum damage the weapon deals at Mk. 5",
"required": true,
"example": "60",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Weapon
| title = Cool Sword
| image = Sword_01.svg
| Type = Dual Wields
| Speed = Fast
| Damage type = Sharp
| Passives = Infinite regen,Stuff,Cool
| Abilities = Blade Dance
| Mk_min = 1
| Mk1_Damage_min = 1
| Mk1_Damage_max = 2
| Mk2_Damage_min = 4
| Mk2_Damage_max = 6
| Mk3_Damage_min = 10
| Mk3_Damage_max = 12
| Mk4_Damage_min = 20
| Mk4_Damage_max = 25
| Mk5_Damage_min = 50
| Mk5_Damage_max = 60
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Weapon
| title = Cool Sword
| image = Sword_01.svg
| Type = Dual Wields
| Speed = Fast
| Damage type = Sharp
| Passives = Infinite regen
| Abilities = Blade Dance
| Mk_min = 1
| Mk1_Damage_min = 1
| Mk1_Damage_max = 2
| Mk2_Damage_min = 4
| Mk2_Damage_max = 6
| Mk3_Damage_min = 10
| Mk3_Damage_max = 12
| Mk4_Damage_min = 20
| Mk4_Damage_max = 25
| Mk5_Damage_min = 50
| Mk5_Damage_max = 60
}}
</syntaxhighlight>
03d55ce17e93a95147326d083a21a60c735a4602
Template:Infobox/Armor
10
453
671
670
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Weight,Set,Passives
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| helmet = [[Helmet]]
| pauldrons = [[Pauldrons]]
| chestguard = [[Chestguard]]
| legguard = [[Legguard]]
| gauntlet = [[Gauntlet]]
| #default = {{{Type}}}
}}}}
|Set={{#if:{{{Set|}}}|[[{{{Set}}}]]}}
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \!
| token = @@@@
| pattern = [[@@@@]]
| intro = \{\{hlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{{Mk0_Sharp|???}}}
|Mk0_Blunt={{{Mk0_Blunt|???}}}
|Mk0_Technomancy={{{Mk0_Technomancy|???}}}
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| helmet = [[Category:Helmets]]
| pauldrons = [[Category:Pauldrons]]
| chestguard = [[Category:Chestguards]]
| legguard = [[Category:Legguards]]
| gauntlet = [[Category:Gauntlets]]
| #default = [[Category:Armor]]
}}{{Armor/CargoStore
|name={{{title|}}}
|setname={{{Set|}}}
|type={{{Type|}}}
|weight={{{Weight|}}}
|sharpMk0={{{Mk0_Sharp|}}}
|bluntMk0={{{Mk0_Blunt|}}}
|technomancyMk0={{{Mk0_Technomancy|}}}
|sharpMk1={{{Mk1_Sharp|}}}
|bluntMk1={{{Mk1_Blunt|}}}
|technomancyMk1={{{Mk1_Technomancy|}}}
|sharpMk2={{{Mk2_Sharp|}}}
|bluntMk2={{{Mk2_Blunt|}}}
|technomancyMk2={{{Mk2_Technomancy|}}}
|sharpMk3={{{Mk3_Sharp|}}}
|bluntMk3={{{Mk3_Blunt|}}}
|technomancyMk3={{{Mk3_Technomancy|}}}
|sharpMk4={{{Mk4_Sharp|}}}
|bluntMk4={{{Mk4_Blunt|}}}
|technomancyMk4={{{Mk4_Technomancy|}}}
|sharpMk5={{{Mk5_Sharp|}}}
|bluntMk5={{{Mk5_Blunt|}}}
|technomancyMk5={{{Mk5_Technomancy|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
b1b6719714f0e3277010b8ca8d5ecb76f9538378
Template:Infobox/Armor/doc
10
454
673
672
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for armor",
"params": {
"image": {
"label": "Armor image",
"description": "Name of the file used as the image for the armor, should be at least 300 pixels wide.",
"required": true,
"example": "Cool armor.png",
"type": "wiki-file-name"
},
"Type": {
"label": "Armor type",
"description": "The type of armor.",
"required": true,
"example": "Helmet",
"type": "wiki-page-name"
},
"Weight": {
"label": "Armor weight",
"description": "The weight class of the armor.",
"required": true,
"example": "Light",
"type": "string"
},
"Set": {
"label": "Armor set",
"description": "Name of an armor set, if the piece is part of one.",
"required": false,
"example": "Cool set",
"type": "wiki-page-name"
},
"Passives": {
"label": "Passive effects",
"description": "Comma-separated list of passive effects",
"required": false,
"example": "Regen HP, Regen FX",
"type": "string"
},
"Mk1_Sharp": {
"label": "Mk 1 sharp rating",
"description": "Sharp defense rating at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Blunt": {
"label": "Mk 1 blunt rating",
"description": "Blunt defense rating at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Technomancy": {
"label": "Mk 1 technomancy rating",
"description": "Technomancy defense rating at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Sharp": {
"label": "Mk 2 sharp rating",
"description": "Sharp defense rating at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Blunt": {
"label": "Mk 2 blunt rating",
"description": "Blunt defense rating at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Technomancy": {
"label": "Mk 2 technomancy rating",
"description": "Technomancy defense rating at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Sharp": {
"label": "Mk 3 sharp rating",
"description": "Sharp defense rating at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Blunt": {
"label": "Mk 3 blunt rating",
"description": "Blunt defense rating at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Technomancy": {
"label": "Mk 3 technomancy rating",
"description": "Technomancy defense rating at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Sharp": {
"label": "Mk 4 sharp rating",
"description": "Sharp defense rating at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Blunt": {
"label": "Mk 4 blunt rating",
"description": "Blunt defense rating at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Technomancy": {
"label": "Mk 4 technomancy rating",
"description": "Technomancy defense rating at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Sharp": {
"label": "Mk 5 sharp rating",
"description": "Sharp defense rating at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Blunt": {
"label": "Mk 5 blunt rating",
"description": "Blunt defense rating at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Technomancy": {
"label": "Mk 5 technomancy rating",
"description": "Technomancy defense rating at Mk 5",
"required": true,
"example": "5",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Armor
| image = Helmet 2-1 SVG.svg
| title = Awesome helmet
| Type = Helmet
| Weight = Heavy
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Armor
| image = Helmet 2-1 SVG.svg
| title = Awesome helmet
| Type = Helmet
| Weight = Heavy
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
</syntaxhighlight>
03d97e9c6ffe6abdc853a4e886a5526e3ca4922d
Template:Infobox/Armor set
10
455
675
674
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor-set
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Pieces, Stats
|Basic Info=Weight
|Pieces=Helmet,Pauldrons,Chestguard,Legguard,Gauntlets
|Helmet={{#if:{{{Helmet|}}}|[[{{{Helmet}}}]]}}
|Pauldrons={{#if:{{{Pauldrons|}}}|[[{{{Pauldrons}}}]]}}
|Chestguard={{#if:{{{Chestguard|}}}|[[{{{Chestguard}}}]]}}
|Legguard={{#if:{{{Legguard|}}}|[[{{{Legguard}}}]]}}
|Gauntlets={{#if:{{{Gauntlets|}}}|[[{{{Gauntlets}}}]]}}
|tabs=
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||[[Category:Armor sets]]}}</includeonly><noinclude>
{{Documentation}}[[Category:Infobox templates]]</noinclude>
d0b44e9f72dec247f40dfa79c3541b37ed9c3937
Template:Infobox/Armor set/doc
10
456
677
676
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for an armor set",
"params": {
"image": {
"label": "Armor set image",
"description": "Name of the file used as the image for the armor set, should be at least 300 pixels wide.",
"required": true,
"example": "Cool armor set.png",
"type": "wiki-file-name"
},
"Weight": {
"label": "Armor set weight",
"description": "The weight class of the armor set.",
"required": true,
"example": "Light",
"type": "string"
},
"Helmet": {
"label": "Helmet piece",
"description": "The armor used for the helmet slot.",
"required": true,
"example": "Cool Helmet",
"type": "wiki-page-name"
},
"Pauldrons": {
"label": "Pauldrons piece",
"description": "The armor used for the pauldrons slot.",
"required": true,
"example": "Cool Pauldrons",
"type": "wiki-page-name"
},
"Chestguard": {
"label": "Chestguard piece",
"description": "The armor used for the chestguard slot.",
"required": true,
"example": "Cool Chestguard",
"type": "wiki-page-name"
},
"Legguard": {
"label": "Legguard piece",
"description": "The armor used for the legguard slot.",
"required": true,
"example": "Cool Legguard",
"type": "wiki-page-name"
},
"Gauntlets": {
"label": "Gauntlets piece",
"description": "The armor used for the gauntlets slot.",
"required": true,
"example": "Cool Gauntlets",
"type": "wiki-page-name"
},
"Mk1_Sharp": {
"label": "Mk 1 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Blunt": {
"label": "Mk 1 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Technomancy": {
"label": "Mk 1 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Sharp": {
"label": "Mk 2 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Blunt": {
"label": "Mk 2 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Technomancy": {
"label": "Mk 2 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Sharp": {
"label": "Mk 3 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Blunt": {
"label": "Mk 3 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Technomancy": {
"label": "Mk 3 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Sharp": {
"label": "Mk 4 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Blunt": {
"label": "Mk 4 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Technomancy": {
"label": "Mk 4 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Sharp": {
"label": "Mk 5 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Blunt": {
"label": "Mk 5 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Technomancy": {
"label": "Mk 5 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Armor set
| image = Awesome set.png
| title = Awesome set
| Weight = Heavy
| Helmet = Awesome Helmet
| Pauldrons = Awesome Pauldrons
| Chestguard = Awesome Chestguard
| Legguard = Awesome Legguard
| Gauntlets = Awesome Gauntlets
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Armor set
| image = Awesome set.png
| title = Awesome set
| Weight = Heavy
| Helmet = Awesome Helmet
| Pauldrons = Awesome Pauldrons
| Chestguard = Awesome Chestguard
| Legguard = Awesome Legguard
| Gauntlets = Awesome Gauntlets
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
</syntaxhighlight>
0b9b19ca76ed3cf82ad6c4644f7d39ea57f56907
Template:Infobox/Shield
10
457
679
678
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=shield
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Weight,Passives,Abilities
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{#if:{{{Mk0_Sharp|}}}|{{{Mk0_Sharp}}}%|???}}
|Mk0_Blunt={{#if:{{{Mk0_Blunt|}}}|{{{Mk0_Blunt}}}%|???}}
|Mk0_Technomancy={{#if:{{{Mk0_Technomancy|}}}|{{{Mk0_Technomancy}}}%|???}}
|Mk1_Sharp={{#if:{{{Mk1_Sharp|}}}|{{{Mk1_Sharp}}}%|???}}
|Mk1_Blunt={{#if:{{{Mk1_Blunt|}}}|{{{Mk1_Blunt}}}%|???}}
|Mk1_Technomancy={{#if:{{{Mk1_Technomancy|}}}|{{{Mk1_Technomancy}}}%|???}}
|Mk2_Sharp={{#if:{{{Mk2_Sharp|}}}|{{{Mk2_Sharp}}}%|???}}
|Mk2_Blunt={{#if:{{{Mk2_Blunt|}}}|{{{Mk2_Blunt}}}%|???}}
|Mk2_Technomancy={{#if:{{{Mk2_Technomancy|}}}|{{{Mk2_Technomancy}}}%|???}}
|Mk3_Sharp={{#if:{{{Mk3_Sharp|}}}|{{{Mk3_Sharp}}}%|???}}
|Mk3_Blunt={{#if:{{{Mk3_Blunt|}}}|{{{Mk3_Blunt}}}%|???}}
|Mk3_Technomancy={{#if:{{{Mk3_Technomancy|}}}|{{{Mk3_Technomancy}}}%|???}}
|Mk4_Sharp={{#if:{{{Mk4_Sharp|}}}|{{{Mk4_Sharp}}}%|???}}
|Mk4_Blunt={{#if:{{{Mk4_Blunt|}}}|{{{Mk4_Blunt}}}%|???}}
|Mk4_Technomancy={{#if:{{{Mk4_Technomancy|}}}|{{{Mk4_Technomancy}}}%|???}}
|Mk5_Sharp={{#if:{{{Mk5_Sharp|}}}|{{{Mk5_Sharp}}}%|???}}
|Mk5_Blunt={{#if:{{{Mk5_Blunt|}}}|{{{Mk5_Blunt}}}%|???}}
|Mk5_Technomancy={{#if:{{{Mk5_Technomancy|}}}|{{{Mk5_Technomancy}}}%|???}}
}}{{#if:{{NAMESPACE}}||[[Category:Shields]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
879802ba38814822053b519e3543784bf8a6ee64
Template:Infobox/Shield/doc
10
458
681
680
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Examples ==
{{Infobox/Shield
| image = Test shield.png
| title = Test Shield
| Weight = Light
| Abilities = Shield Bash
| Mk0_Sharp = 10
| Mk0_Blunt = 10
| Mk0_Technomancy = 10
| Mk1_Sharp = 20
| Mk1_Blunt = 20
| Mk1_Technomancy = 20
| Mk2_Sharp = 30
| Mk2_Blunt = 30
| Mk2_Technomancy = 30
| Mk3_Sharp = 40
| Mk3_Blunt = 40
| Mk3_Technomancy = 40
| Mk4_Sharp = 50
| Mk4_Blunt = 50
| Mk4_Technomancy = 50
| Mk5_Sharp = 60
| Mk5_Blunt = 60
| Mk5_Technomancy = 60
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Shield
| image = Test shield.png
| title = Test Shield
| Weight = Light
| Abilities = Shield Bash
| Mk0_Sharp = 10
| Mk0_Blunt = 10
| Mk0_Technomancy = 10
| Mk1_Sharp = 20
| Mk1_Blunt = 20
| Mk1_Technomancy = 20
| Mk2_Sharp = 30
| Mk2_Blunt = 30
| Mk2_Technomancy = 30
| Mk3_Sharp = 40
| Mk3_Blunt = 40
| Mk3_Technomancy = 40
| Mk4_Sharp = 50
| Mk4_Blunt = 50
| Mk4_Technomancy = 50
| Mk5_Sharp = 60
| Mk5_Blunt = 60
| Mk5_Technomancy = 60
}}
</syntaxhighlight>
f660f4831abeb203edfc85fcc8225afbe28becd3
Template:Infobox/Ability
10
459
683
682
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=ability
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info,Description
|Basic Info=Cost,Cooldown
|Cost_label=Flux cost
|Cooldown={{#if:{{{Cooldown|}}}|{{{Cooldown}}} seconds}}
|Description_nolabel=yes
|Description_isdata=yes
}}{{#if:{{NAMESPACE}}||[[Category:Abilities]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
c1ad1894018a724cf6235cea17b860aa85344fed
Template:Infobox/Ability/doc
10
460
685
684
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Example ==
{{Infobox/Ability
|image=SuperTux star-1.png
|title=Shoot Star
|Description=Shoots a star.
|Cost=50
|Cooldown=12
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Ability
|image=SuperTux star-1.png
|title=Shoot Star
|Description=Shoots a star.
|Cost=50
|Cooldown=12
}}
</syntaxhighlight>
c5af8361e58c9662fafe1e9ae1dfbc09ff0dedf9
Template:Infobox/Boss
10
461
687
686
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind = boss
| sep=,
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| title = {{{title|{{PAGENAME}}}}}
| sections = Basic Info, Stats
| Stats = HP, SharpResist, BluntResist, TechnomancyResist
| SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance
| BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance
| TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance
| SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}}
| BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}}
| TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}}
}}{{#if:{{NAMESPACE}}||[[Category:Bosses]]}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]
</noinclude>
64710a105198d7712f12bdaeab6e515bd71f2fe8
Template:Infobox/Cape
10
462
689
688
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=cape
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Effects
|Effects=Effect1,Effect2,Effect3
|Effect1_nolabel=yes
|Effect2_nolabel=yes
|Effect3_nolabel=yes
}}{{#if:{{NAMESPACE}}||[[Category:Capes]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
1957e3d416bf10a10bad93e51f649ad4f1768848
Template:Infobox/Cape/doc
10
463
691
690
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Examples ==
{{Infobox/Cape
| image = Cool cape.png
| title = Cool cape
| Effect1 = +50 coolness
| Effect2 = -1s cooldowns
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Cape
| image = Cool cape.png
| title = Cool cape
| Effect1 = +50 coolness
| Effect2 = -1s cooldowns
}}
</syntaxhighlight>
90d89e60cc634d47fd7681de76278937e16255fc
Template:Infobox/Item/doc
10
464
693
692
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Examples ==
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| Description = This item will do something fancy when you use it!
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| Description = This item will do something fancy when you use it!
}}
</syntaxhighlight>
9a956a5275f4ed54d4ffea9d646a5229cadc93a6
Weapons
0
465
695
694
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] in {{BFF}} used to engage in melee combat with [[enemies]].
== Upgrading ==
Weapons can be upgraded all the way to Mk 5 by speaking to [[The Handler]] and giving her the requisite materials.
Upgrading a weapon increases its damage as well as allowing you to embed more crystals into it to improve its properties further. Some weapons will also unlock passive bonuses or abilities when they are upgraded.
== List of weapons ==
{{#cargo_query:table=Weapons
|fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5)
|format=table
}}
{{Navbox/Weapons}}
627eeadeab2f527ee330ed3f5b806dcef85b45e8
Armor
0
466
697
696
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is protective [[equipment]] that can be worn to increase defensive stats.
== List of armor ==
{{#cargo_query:table=Armor
|fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, weight=Weight
|format=table
}}
{{Navbox/Armor}}
9bd135cf1860c6152460f40d36e8fe2636fd7ef3
Equipment
0
467
699
698
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] that the player can wear.
{{Navbox/Equipment}}
c2de744eb63e9dbba3e8fff73404a00624386c66
Category:Weapons
14
468
701
700
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''Weapons''' are equipment the player can use to damage monsters and defend themselves.
98e971be059993e01129097dd2602abe573ed443
Category:Dual Wields
14
469
703
702
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[Category:Weapons]]
febdf29cf9dcbef034e184720fe19a5ac5f353d8
Divine Greataxe
0
470
705
704
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Divine Greataxe.png
| Type = Greatweapon
| Damage type = Sharp
| Speed = Sluggish
| Passives = Greater Divine Judgment
| Abilities = Regal Radiance
| Mk4_Damage_min = 597
| Mk4_Damage_max = 656
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
== Location ==
{{coords|43210.37|165132.67|-141105.39}}
Found in the [[Anomaly]]. From the [[Homunculus]], walk past [[The Handler]] and you will see the item up ahead on the ledge of a building.
{{Navbox/Weapons}}
0ae771a14e6b5fd5c63e8a73b5aebd90154e8bff
Category:Chestguards
14
471
707
706
2025-08-21T18:35:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[Category:Armor]]
8dbf198b5dcaa87a18100850cc78880444b773ad
Dual Wield
0
472
709
708
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Stub}}
'''{{PAGENAME}}''' is a [[Weapons|weapon]] type in {{BFF}}.
== List of Dual Wields ==
{{#cargo_query:table=Weapons
|fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5)
|where=type='Dual Wield'
|format=table
}}
[[Category:Dual Wields]]
6c2224d2e50f2da2b16a52ca04227ca57d27bbc8
Dual wield
0
473
711
710
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Dual Wield]]
f2856295451ab1cd2a686e19d6b0fbaa265f1d98
Dual Wields
0
474
713
712
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Dual Wield]]
f2856295451ab1cd2a686e19d6b0fbaa265f1d98
Katanas
0
475
715
714
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Katanas.png
| Type = Dual Wield
| Speed = Fast
| Damage type = Sharp
| Abilities = Blade Dash, Whirlwind Strike
| Mk3_Damage_min = 117
| Mk3_Damage_max = 130
| Mk4_Damage_min = 165
| Mk4_Damage_max = 183
| Mk5_Damage_min = 235
| Mk5_Damage_max = 261
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
Available as a drop from [[enemies]] in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]].
{{Navbox/Weapons}}
4ab46d81614502ef87bbdcd436c9621993e809bd
Kamas
0
476
717
716
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Kamas.png
| Type = Dual Wield
| Speed = Swift
| Damage type = Sharp
| Passives = Powerful Decay
| Abilities = Bladestorm
| Mk3_Damage_min = 112
| Mk3_Damage_max = 130
| Mk4_Damage_min = 269
| Mk4_Damage_max = 313
| Mk5_Damage_min = 308
| Mk5_Damage_max = 358
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
{{Navbox/Weapons}}
80fd6cf0dc6a59c85d7b761b05ed0b0cb9908c27
Lacerators
0
477
719
718
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Lacerators.png
| Type = Dual Wield
| Speed = Fast
| Damage type = Sharp
| Passives = Lacerate, Lifesteal
| Mk2_Damage_min = 97
| Mk2_Damage_max = 108
| Mk5_Damage_min = 235
| Mk5_Damage_max = 261
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
{{Navbox/Weapons}}
b1946670af3fe4f2bd09c0dfc86872b327a200a9
Daggers
0
478
721
720
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Daggers.png
| Type = Dual Wield
| Speed = Swift
| Damage type = Sharp
| Abilities = Dual Brutality, Shadowstep
| Mk_min = 2
| Mk2_Damage_min = 106
| Mk2_Damage_max = 123
| Mk3_Damage_min = 135
| Mk3_Damage_max = 157
}}
'''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}.
== Location ==
Located together with the [[sentinel]] [[Armor sets|armor set]] on a corpse in [[Asylum|the asylum]]. See [[Sentinel#Location]] for its location.
{{Navbox/Weapons}}
564b414d6a096a1107d0569379379434b1e1f48e
Khopeshs
0
479
723
722
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Khopeshs.png
| Type = Dual Wield
| Damage type = Sharp
| Speed = Fast
| Abilities = Dual Brutality, Bladestorm
| Mk0_Damage_min = 92
| Mk0_Damage_max = 102
| Mk1_Damage_min = 104
| Mk1_Damage_max = 115
| Mk2_Damage_min = 115
| Mk2_Damage_max = 128
| Mk3_Damage_min = 139
| Mk3_Damage_max = 154
}}
'''{{PAGENAME}}''' are a type of [[Dual Wield]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
Dropped by [[Plagued Nemesis]].
{{Navbox/Weapons}}
c8f5f702bd2d22af0adff4ad34825ffb25021210
Blades of Atropos
0
480
725
724
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Blades of Atropos.png
| Type = Dual Wield
| Damage type = Sharp
| Speed = Fast
| Passives = Bloodthirst
| Abilities = Phase
| Mk0_Damage_min = 131
| Mk0_Damage_max = 145
| Mk1_Damage_min = 147
| Mk1_Damage_max = 164
| Mk2_Damage_min = 164
| Mk2_Damage_max = 182
| Mk3_Damage_min = 197
| Mk3_Damage_max = 218
| Mk4_Damage_min = 229
| Mk4_Damage_max = 255
| Mk5_Damage_min = 262
| Mk5_Damage_max = 291
}}
'''{{PAGENAME}}''' are a [[Dual Wields|dual wield]] weapon in {{BFF}}.
== Location ==
{{coords|2778|-6115|-1198}}
Found in [[Desert Mirage]]. Just down the stairs from the [[Homunculus]].
{{Navbox/Weapons}}
52da0a005c0bcb26cb17a6ee2da89b32c687e4ea
Citadel Warrior Chest
0
481
727
726
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| image = Citadel Warrior Chest.png
| title = {{PAGENAME}}
| Type = Chestguard
| Weight = Medium
| Set = Citadel Warrior
| Mk2_Sharp = 984
| Mk2_Blunt = 1296
| Mk2_Technomancy = 719
}}
{{Navbox/Armor}}
2d3a3133daf3387abf5d098ec92e1514330b81d4
Librarian Overcoat
0
482
729
728
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| image = Librarian Overcoat.png
| title = {{PAGENAME}}
| Type = Chestguard
| Set = Librarian
| Weight = Light
| Mk1_Sharp = 660
| Mk1_Blunt = 744
| Mk1_Technomancy = 1009
}}
== Location ==
Dropped by "Librarian" enemies in [[Deluge|the Deluge]]?
{{Navbox/Armor}}
ae4dc71e0b3fd31a0a4477632675eea80c6965d8
Corrupted Cuirass
0
483
731
730
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| image = Corrupted Cuirass.png
| title = {{PAGENAME}}
| Type = Chestguard
| Weight = Heavy
| Mk2_Sharp = 1728
| Mk2_Blunt = 1488
| Mk2_Technomancy = 174
}}
{{Navbox/Armor}}
183dddf62f3fe9d1345ac172c6970d381d73782b
Citadel Warrior
0
484
733
732
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor set
| image = Citadel Warrior.png
| title = {{PAGENAME}}
| Weight = Medium
| Helmet = Citadel Warrior Helmet
| Pauldrons = Citadel Warrior Shoulders
| Chestguard = Citadel Warrior Chest
| Legguard = Citadel Warrior Legguards
| Gauntlets = Citadel Warrior Gauntlets
}}
'''{{PAGENAME}}''' is an [[armor set]] in {{BFF}}.
== Pieces ==
* [[Citadel Warrior Helmet]]
* [[Citadel Warrior Shoulders]]
* [[Citadel Warrior Chest]]
* [[Citadel Warrior Legguards]]
* [[Citadel Warrior Gauntlets]]
== See also ==
* [[Citadel Defender]] – Heavy variant with higher defense ratings.
{{Navbox/Armor}}
e1f48b76a2706b1879b8a99de8adffee44fc8785
Sentinel
0
485
735
734
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor set
| image = Sentinel.png
| title = {{PAGENAME}}
| Helmet = Sentinel Helmet
| Chestguard = Sentinel Chest
| Legguard = Sentinel Legguard
| Gauntlets = Sentinel Gauntlets
}}
'''{{PAGENAME}}''' is an [[Armor sets|armor set]] that can be found in {{BFF}}.
== Location ==
{{coords|-3634|1305|9617}}
The full set can be found on a corpse in [[Asylum|the Asylum]]. After reaching the top of the small spiral staircase, continue through the long corridor and get to the bottom of the next room. Walk through the doorway and hug the left wall to reach an area behind a wall with a corpse sitting in a corner holding the armor set and the [[Daggers]].
{{Navbox/Armor}}
c383d5b5ea00cce79216ed8915d5810d12cb993f
Vengeance
0
486
737
736
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor set
| title = {{PAGENAME}}
| image = Vengeance.png
| Helmet = Vengeance Helmet
| Chestguard = Vengeance Cuirass
| Legguard = Vengeance Legs
| Gauntlets = Vengeance Gauntlets
}}
'''{{PAGENAME}}''' is an [[Armor sets|armor set]] found in {{BFF}}.
== Location ==
{{coords|-3925|1676|9471}}
Found on a corpse in the shortcut area leading to the big tower.
{{Navbox/Armor}}
37e805d19347a1c48db878ae9dc7e86a5905fb7b
Librarian (armor set)
0
487
739
738
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor set
| image = Librarian.png
| title = Librarian
| Weight = Light
| Helmet = Librarian Hood
| Pauldrons = <!-- Librarian ??? -->
| Chestguard = Librarian Overcoat
| Legguard = Librarian Trousers
| Gauntlets = <!-- Librarian ??? -->
}}
'''Librarian''' is an [[armor set]] in {{BFF}}.
== Pieces ==
* [[Librarian Hood]]
<!-- * [[Librarian ???]] -->
* [[Librarian Overcoat]]
* [[Librarian Trousers]]
<!-- * [[Librarian ???]] -->
{{Navbox/Armor}}
ad355bf6137087d645f4fbb2ac96e384f57db8a8
Librarian Trousers
0
488
741
740
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| image = Librarian Trousers.png
| title = {{PAGENAME}}
| Type = Legguard
| Weight = Light
| Set = Librarian
| Mk1_Sharp = 456
| Mk1_Blunt = 516
| Mk1_Technomancy = 696
}}
{{Navbox/Armor}}
1d0c2fa9e238497ee92524a75f41846d76113cd8
Crude Helmet
0
489
743
742
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| image = Crude Helmet.png
| title = {{PAGENAME}}
| Type = Helmet
| Weight = Medium
| Mk2_Sharp = 516
| Mk2_Blunt = 600
| Mk2_Technomancy = 336
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}.
== Location ==
{{coords|-3538|-6027|5477}}
Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and follow the wall until you see a a corpse on a ledge holding the item.
{{Navbox/Armor}}
4327414a895ebc5fd2ac98909457618e6423b0f3
Skullface Helmet
0
490
745
744
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Skullface Helmet.png
| Type = Helmet
| Weight = Light
| Passives = [[Volatile Illusions]]
| Mk5_Sharp = 692
| Mk5_Blunt = 692
| Mk5_Technomancy = 928
}}
== Location ==
{{coords|-4063|1564|1686}}
After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet.
{{Navbox/Armor}}
06db38be9569d6ea522dedf56d2264708ad17817
Techpriest Helmet
0
491
747
746
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Techpriest Helmet.png
| Type = Helmet
| Weight = Light
| Passives = [[Minor Flux Regen]]
| Mk5_Sharp = 722
| Mk5_Blunt = 722
| Mk5_Technomancy = 928
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|1272|-8495|551}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the stairs and take a narrow path on the right leading to a small area behind a building with the helmet in a corner.
{{Navbox/Armor}}
a7a7b23c199012fb916ce23130908fb2796a023c
Deserts Respirator Helmet
0
492
749
748
2025-08-21T18:35:43Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Deserts Respirator Helmet.png
| Type = helmet
| Weight = Medium
| Mk2_Sharp = 545
| Mk2_Blunt = 633
| Mk2_Technomancy = 336
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|1367|6630|-1395}}
Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]].
{{Navbox/Armor}}
85a4c5a22cdde742f764acd2e76c15d11d03503d
Plagued Revenant Helmet
0
493
751
750
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Plagued Revenant Helmet.png
| Type = Helmet
| Weight = Medium
| Mk5_Sharp = 883
| Mk5_Blunt = 1024
| Mk5_Technomancy = 540
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Acquisition ==
Drops from [[Plagued Revenant]].
{{Navbox/Armor}}
dcf20306f52ebb49a60617476143ab6a73580f6b
Librarian Hood
0
494
753
752
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Librarian Hood.png
| Type = Helmet
| Weight = Light
| Set = Librarian
| Mk1_Sharp = 371
| Mk1_Blunt = 371
| Mk1_Technomancy = 469
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Acquisition ==
Drops from [[Librarian (enemy)|librarian]] enemies.
{{Navbox/Armor}}
524d688d52e40e59b69ca9f6a46e4f593a6fcdab
Eris
0
495
755
754
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Eris.png
| Type = Helmet
| Weight = Light
| Passives = Flux Efficiency
| Mk5_Sharp = 730
| Mk5_Blunt = 730
| Mk5_Technomancy = 939
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|2860|-4261|1423}}
Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars.
{{Navbox/Armor}}
3716b6c0ca03c71f6dc10ebb3357cb49aa6862ef
One-handed weapons
0
496
757
756
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[Weapons|weapon]] in {{BFF}} that come in two variants: [[sharp]] and [[blunt]].
== List of one-handed weapons ==
{{#cargo_query:table=Weapons
|fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5)
|where=type='one-handed'
|format=table
}}
{{Navbox/Weapons}}
[[Category:One-handed weapons]]
db05c537c888c3ecd32676dae4cbd9e3b79033c3
Paladin Mace
0
497
759
758
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| image = Paladin Mace.png
| title = {{PAGENAME}}
| Type = one-handed
| Damage type = Blunt
| Speed = Fast
| Abilities = Divine Blessing
| Mk0_Damage_min = 76
| Mk0_Damage_max = 83
| Mk1_Damage_min = 85
| Mk1_Damage_max = 93
| Mk2_Damage_min = 95
| Mk2_Damage_max = 104
}}
'''{{PAGENAME}}''' is a [[One-handed weapons|one-handed]] [[Weapons|weapon]] that can be found in {{BFF}}.
== Location ==
{{coords|-4879|-7530|5578}}
In [[Deluge|the Deluge]]. Located in a square hole in the wall inside the first rectangular structure with pillars after crossing a bridge. The [[Items|item]] can be seen straight ahead when crossing the bridge.
{{Navbox/Weapons}}
9ae9ef12f0012f7ee76e8b19eb462a731a31721f
Scimitar
0
498
761
760
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Scimitar.png
| Type = One-handed
| Damage type = Sharp
| Speed = Swift
| Abilities = Whiplash
| Mk2_Damage_min = 150
| Mk2_Damage_max = 163
}}
'''{{PAGENAME}}''' is a [[One-handed weapons|one-handed weapon]] in {{BFF}}.
== Location ==
{{coords|1713|7517|-1413}}
Located inside a building in the [[Desert]], after getting down on the bottom.
{{Navbox/Weapons}}
7da5444707df0750219ed6dda415a75ee3b04a8e
Nodachi
0
499
763
762
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Nodachi.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Whirlwind, Tornado
| Mk3_Damage_min = 315
| Mk3_Damage_max = 344
| Mk4_Damage_min = 368
| Mk4_Damage_max = 402
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Acquisition ==
Dropped by [[Nurgei the Blademaster]].
{{Navbox/Weapons}}
86417f91f727b87f778da76948fb454da2e92744
Soul Reaper
0
500
765
764
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Soul Reaper.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Reap, Soul Storm
| Mk3_Damage_min = 322
| Mk3_Damage_max = 361
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Location ==
{{coords|1413|-9293|190}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. When reaching the outdoors area, head up the stairs and go left. Climb up the cliff by repeatedly tapping the jump button. Once at the top, head forward and follow the path that leads downwards. Eventually you will reach a group of buildings. In front of one of these is the weapon.
{{Navbox/Weapons}}
950b71e0fc9d4dbdefdb52a2c58ee43849dd7600
Anastasia
0
501
767
766
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Anastasia.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Reanimate Dead, Silencing Reap
| Mk3_Damage_min = 364
| Mk3_Damage_max = 408
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Acquisition ==
Drops from [[Plagued Revenant]].
{{Navbox/Weapons}}
999c96e5d8b0e959b4174e16951f4d2f08e6598c
Crescent Axe
0
502
769
768
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Crescent Axe.png
| Type = two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Expose Armor, Crescent Slash
| Mk2_Damage_min = 251
| Mk2_Damage_max = 271
}}
== Location ==
{{coords|-3932|1535|1532}}
Located in the room with [[The Banshee]] [[Data logs|data log]].
6ae8e711635fe9f28bf31f5f61c2b8a34e8e0452
Royal Claymore
0
503
771
770
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Royal Claymore.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Claymore Swing, Sword Strike
| Mk3_Damage_min = 315
| Mk3_Damage_max = 344
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Location ==
{{coords|-9938|7939|-1340}}
Found in [[Desert|the Desert]]. Starting where the [[Shifting Sands]] data log can be found, climb up the stairs on either side and walk through the arch. The item can be seen across a gap. Do a jump while sprinting to cross the gap and reach the item.
{{Navbox/Weapons}}
d8f571fe32e600c12e02d6d3d5e06dac9e5df229
Valtiel
0
504
773
772
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Valtiel.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Syphon Life, Carnage
| Mk3_Damage_min = 522
| Mk3_Damage_max = 562
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Acquisition ==
Drops from [[Vermillion Knight|Vermillion Knights]].
{{Navbox/Weapons}}
cd2852971f9cc25db419ef806fb9c0960f845d16
Twinblade
0
505
775
774
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Twinblade.png
| Type = Twinblade
| Damage type = Sharp
| Speed = Swift
| Abilities = Blade Dance, Blade Flurry
| Mk3_Damage_min = 75
| Mk3_Damage_max = 78
}}
'''{{PAGENAME}}''' is a [[Twinblades|twinblade]] [[Weapons|weapon]] in {{BFF}}.
== Acquisition ==
Drops from [[enemies]] using the twinblade weapon.
{{Navbox/Weapons}}
f75786b2c8e5d234ef871b2f5c2e32b4924b1b6a
Asklepios
0
506
777
776
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Asklepios.png
| Type = Staff
| Damage type = Technomancy
| Speed = Slow
| Abilities = Mending Light, Second Breath
| Mk3_Damage_min = 117
| Mk3_Damage_max = 120
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}.
== Acquisition ==
Dropped by big floating knights with blue lightsabers in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]].
{{Navbox/Weapons}}
19d3bc07174d18e309f111ea29df123b354aac8e
Vermillion Staff
0
507
779
778
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Vermillion Staff.png
| Type = Staff
| Damage type = Technomancy
| Speed = Slow
| Abilities = Forceful Repulsion, Quake
| Mk_min = 3
| Mk3_Damage_min = 117
| Mk3_Damage_max = 120
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}.
== Location ==
{{coords|1241|-8256|275}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. At the outdoor area with a big staircase leading up, head instead to the right before the staircase, leading to an area with some tombstones. The weapon can be found leaning against a wall in the dead-end.
{{Navbox/Weapons}}
e59fb090f56eced502c56a092f5d2cf9267c2818
Blessed Crosier
0
508
781
780
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Blessed Crosier.png
| Type = Staff
| Damage type = Technomancy
| Speed = Slow
| Abilities = Escape Velocity, Energy Burst
| Mk3_Damage_min = 173
| Mk3_Damage_max = 177
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}.
== Acquisition ==
Dropped by [[Archinquisitor Belisarius (boss)]].
{{Navbox/Weapons}}
d1d557ec6a9700fda1ee5579a6f5c4cf86cd912f
Arcane Bow
0
509
783
782
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Arcane Bow.png
| Type = Ranged
| Damage type = Sharp
| Speed = Fast
| Passives = Vermillion Judgment
| Abilities = Arrow Twister
| Mk2_Damage_min = 184
| Mk2_Damage_max = 197
| Mk3_Damage_min = 251
| Mk3_Damage_max = 267
| Mk4_Damage_min = 292
| Mk4_Damage_max = 312
| Mk5_Damage_min = 334
| Mk5_Damage_max = 356
}}
'''{{PAGENAME}}''' is a [[Bows|bow]] in {{BFF}}.
== Location ==
{{coords|1261|-8400|1563}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head into the path on the right before the big stairs. Take the ladder at the end getting up onto a building, and then the next one. The item will be in the corner of the roof on a corpse.
{{Navbox/Weapons}}
9ed7d6da9990d1b86ae941adf6cc8ea5f6b173fb
Taskmaster
0
510
785
784
2025-08-21T18:35:44Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Taskmaster.png
| Type = Ranged
| Damage type = Sharp
| Speed = Fast
| Passives = Rapid Fire, Critical Strike
| Mk2_Damage_min = 240
| Mk2_Damage_max = 256
}}
'''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}.
== Location ==
{{coord|4052|1265|-1412}}
Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and you'll see the bow resting against some run down brick arches.
{{Navbox/Weapons}}
dd37cc2a86e75e6fa9d8f0c27f5bfcb3c3a09e92
Category:Pages declaring Cargo tables
14
511
786
2025-08-21T18:36:35Z
Sharparam
284703
Created blank page
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Wanderer Cape
0
512
788
787
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Cape
| title = {{PAGENAME}}
| image = Wanderer Cape.png
| Effect1 = -0.5 second delay before stamina starts to regenerate.
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn in {{BFF}}.
{{Navbox/Capes}}
1f5137f1dafe59cd4ffe5c3b254751901918d15e
Folk Cape
0
513
790
789
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Cape
| image = Folk Cape.png
| title = {{PAGENAME}}
| Effect1 = -20% Technocasting speed
| Effect2 = +10% [[Technomancy]] penetration
| Effect3 = +50 Max [[flux]] points
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn by the player to gain certain effects.
== Location ==
{{coords|-3979|-2143|5796}}
At the top of a broken down tower in [[Deluge|the Deluge]] area, in front of [[Dust Sea|the Dust Sea]] [[Data logs|data log]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left, then continue until you enter the big tower. Climb the tower to the top and you'll find the item on the ground at the top of the last set of stairs.
{{Navbox/Capes}}
ced1f8221d9ad9bf30775a81e257aa3efb4d12dd
Corrupted Cape
0
514
792
791
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Cape
| image = Corrupted Cape.png
| title = {{PAGENAME}}
| Effect1 = +800 [[Sharp]] armor rating.
| Effect2 = +800 [[Blunt]] armor rating.
| Effect3 = +800 [[Technomancy]] armor rating.
}}
== Location ==
Dropped by the bigger knight guys ("Corrupted"?) wearing halberts in [[Deluge]].
{{Navbox/Capes}}
85092d24492b81865456f0c2ec6b4b43f2e6c927
Techpriest Cape
0
515
794
793
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Cape
| image = Techpriest Cape
| title = {{PAGENAME}}
| Effect1 = +50 Max [[flux]] points.
| Effect2 = +150 [[Flux]] leech rating.
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player.
== Location ==
{{coords|-4527|8973|9614}}
Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left.
== Trivia ==
* "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]].
{{Navbox/Capes}}
a7524062d33903459d69f5c7ae482dff8f0536c9
Amulet of Arcane Protection
0
516
796
795
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Amulet of Arcane Protection.png
| Passives = [[Techno-Defiance]]
| Effect1 = +1500 [[Technomancy]] armor rating.
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
== Location ==
{{coords|4158|-2902|1459}}
Found near the top side of a shortcut ladder in [[Uranopolis]].
{{Navbox/Amulets}}
18efef3d358787360eb91c39568ddbe8822cdf47
Amulet of Evasion
0
517
798
797
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Amulet of Evasion.png
| Passives = [[Extended Evasion]]
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
== Location ==
{{coords|1251|-8419|551}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right, behind a building.
{{Navbox/Amulets}}
9e21e16f6b5f152489ca325ce8295f57ce37b702
Tactician's Amulet
0
518
800
799
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Tactician's Amulet.png
| Effects = Removes invincibility frames
| Passives = Vulnerable Dodge
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
{{Navbox/Amulets}}
8032681e4f4e42a1fa5445d736a503ae40145d42
Ring of Burning Desire
0
519
802
801
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ring
| image = Ring of Burning Desire.png
| title = {{PAGENAME}}
| Effect1 = +20% chance to inflict [[heat]] [[status effect]].
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] that can be found in {{BFF}}.
== Acquisition ==
Drops from [[Diver]] [[enemies]] in [[Deluge|the Deluge]] area.
{{Navbox/Rings}}
e25c13f86a914c3c38145e3c207d7ca4d045bcf0
Ring of Casting Speed
0
520
804
803
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Casting Speed.png
| Effect1 = -10% attack power.
| Effect2 = +20% technocasting speed.
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Acquisition ==
Drops from a giant enemy in [[Uranopolis]], around {{coords|-1151|-4475|1453}}.
{{Navbox/Rings}}
46f3eb13e5516b422e23a89fb5ec0e0a924ed783
Ring of Rammstein
0
521
806
805
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Rammstein.png
| Passives = [[Momentum Strike]]
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Location ==
{{main|Tech Shield#Location}}
This item is located on the same corpse as the [[Tech Shield]].
{{Navbox/Rings}}
1bf2ae52125b19a63277c4ea076e1cf3f2107e6e
Ring of Exceeding Talent
0
522
808
807
2025-08-21T18:40:01Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Exceeding Talent.png
| Effect1 = +3 [[Strength]]
| Effect2 = +3 [[Agility]]
| Effect3 = +3 [[Constitution]]
| Effect4 = +3 [[Intelligence]]
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Location ==
{{coords|3720|1159|-1397}}
Located in the [[Desert]] on a toppled pillar in the area with Yaroslav's crew (same location as the [[Handler Echo]]).
== See also ==
* [[Ring of Lesser Talent]] – The weakest version of this ring.
* [[Ring of Talent]] – A weaker version of this ring.
{{Navbox/Rings}}
bcbe61aaf34441d0c94fadf4e2d02dbe42c66205
Category:Rings
14
523
809
2025-08-21T18:40:49Z
Sharparam
284703
Created page with "[[Rings]] in {{BFF}}. [[Category:Equipment]]"
wikitext
text/x-wiki
[[Rings]] in {{BFF}}.
[[Category:Equipment]]
6be38d49249074ddfca4ec380e09f5762403fd47
Category:Equipment
14
524
810
2025-08-21T18:41:11Z
Sharparam
284703
Created page with "[[Equipment]] in {{BFF}}. [[Category:Items]]"
wikitext
text/x-wiki
[[Equipment]] in {{BFF}}.
[[Category:Items]]
15110e4ea1647cf4d9e255a1263386500041dfd3
Category:Pages using invalid arguments in ParserPower functions
14
525
811
2025-08-21T18:43:02Z
Sharparam
284703
Created page with "__HIDDENCAT__ __EXPECTUNUSEDCATEGORY__"
wikitext
text/x-wiki
__HIDDENCAT__
__EXPECTUNUSEDCATEGORY__
7e6b7092e497df1715b699132e1d441f8d47d5ff
Sharp
0
526
813
812
2025-08-21T18:43:57Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''Sharp''' is a type of damage in {{BFF}}.
791f7c953da43e2ac6ebe338f36d863e32d3ac49
Template:Average/doc
10
532
824
2025-08-21T18:48:54Z
Sharparam
284703
Remove unused doc templates
wikitext
text/x-wiki
This template is used to find the average (default mean) of a series of numbers.
==Parameters==
Parameters with a number as the value are the numbers to find the average of.
==Examples==
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|100000000}}
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000}}
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000|round=2}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000|round=2}}
==See also==
*{{tl|Median}}
9ec70adff5359cd4d4afdfa0d6d5d8f24974fc11
825
824
2025-08-21T18:49:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
This template is used to find the average (default mean) of a series of numbers.
==Parameters==
Parameters with a number as the value are the numbers to find the average of.
==Examples==
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|100000000}}
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000}}
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000|round=2}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000|round=2}}
==See also==
*{{tl|Median}}
9ec70adff5359cd4d4afdfa0d6d5d8f24974fc11
Template:DamageRange
10
527
815
814
2025-08-21T18:49:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{Tooltip|{{{1}}}–{{{2}}}|Average: {{Average|{{{1}}}|{{{2}}}}}}}{{#if:{{{type|}}}| {{#switch:{{lc:{{{type}}}}}
| sharp = [[Sharp]]
| blunt = [[Blunt]]
| tech
| technomancy = [[Technomancy]]
| #default = {{{type}}}
}}|}}</includeonly><noinclude>{{Documentation}}</noinclude>
bee05e8ca021e7585fc203ed68db91f82ab057e2
Template:DamageRange/doc
10
528
817
816
2025-08-21T18:49:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|10|20}}</syntaxhighlight> → {{DamageRange|10|20}}
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|1|2}}</syntaxhighlight> → {{DamageRange|1|2}}
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|69|75|type=sharp}}</syntaxhighlight> → {{DamageRange|69|75|type=sharp}}
a5a6c8376c27ec92e876a4bf84571a621dfedbac
Template:Tooltip
10
529
819
818
2025-08-21T18:49:41Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<templatestyles src="Template:Tooltip/styles.css" /><includeonly><span class="tooltip tooltip-dotted" title="{{#replace:{{{2}}}|"|"}}">{{{1}}}</span></includeonly><noinclude>
{{Documentation|Template:Abbr/doc}}
</noinclude>
02939f9a947fe3904add1355d50d42b05211f8b9
Template:Tooltip/styles.css
10
530
821
820
2025-08-21T18:49:42Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
.tooltip-dotted {
border-bottom: 1px dotted;
}
.tooltip-help {
cursor: help;
}
af2f58c266b5958cf73537f523615e9783db80ff
Template:Average
10
531
823
822
2025-08-21T18:49:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#if:{{{round|}}}|{{formatnum:{{round|{{#invoke:math|average}}|{{{round|}}}}}|R}}|{{#invoke:math|average}}}}</includeonly><noinclude>{{doc}}</noinclude>
b37093608b62a3faf722c64135fc79c4498e3d5b
Template:Abbr/doc
10
533
827
826
2025-08-21T18:49:42Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Examples ==
=== [[Template:Tooltip]] ===
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> → {{Tooltip|text|tooltip title}}
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> → {{Tooltip|text "with" quotes|tooltip "with" quotes}}
7e8e0dc4e38c09167b11915c2ddced76bbfe4ae4
Module:Math
828
534
829
828
2025-08-21T18:49:42Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
--[[
This module provides a number of basic mathematical operations.
]]
local yesno, getArgs -- lazily initialized
local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules.
local wrap = {} -- Holds wrapper functions that process arguments from #invoke. These act as intemediary between functions meant for #invoke and functions meant for Lua.
--[[
Helper functions used to avoid redundant code.
]]
local function err(msg)
-- Generates wikitext error messages.
return mw.ustring.format('<strong class="error">Formatting error: %s</strong>', msg)
end
local function unpackNumberArgs(args)
-- Returns an unpacked list of arguments specified with numerical keys.
local ret = {}
for k, v in pairs(args) do
if type(k) == 'number' then
table.insert(ret, v)
end
end
return unpack(ret)
end
local function makeArgArray(...)
-- Makes an array of arguments from a list of arguments that might include nils.
local args = {...} -- Table of arguments. It might contain nils or non-number values, so we can't use ipairs.
local nums = {} -- Stores the numbers of valid numerical arguments.
local ret = {}
for k, v in pairs(args) do
v = p._cleanNumber(v)
if v then
nums[#nums + 1] = k
args[k] = v
end
end
table.sort(nums)
for i, num in ipairs(nums) do
ret[#ret + 1] = args[num]
end
return ret
end
local function fold(func, ...)
-- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters,
-- and must return a number as an output. This number is then supplied as input to the next function call.
local vals = makeArgArray(...)
local count = #vals -- The number of valid arguments
if count == 0 then return
-- Exit if we have no valid args, otherwise removing the first arg would cause an error.
nil, 0
end
local ret = table.remove(vals, 1)
for _, val in ipairs(vals) do
ret = func(ret, val)
end
return ret, count
end
--[[
Fold arguments by selectively choosing values (func should return when to choose the current "dominant" value).
]]
local function binary_fold(func, ...)
local value = fold((function(a, b) if func(a, b) then return a else return b end end), ...)
return value
end
--[[
random
Generate a random number
Usage:
{{#invoke: Math | random }}
{{#invoke: Math | random | maximum value }}
{{#invoke: Math | random | minimum value | maximum value }}
]]
function wrap.random(args)
local first = p._cleanNumber(args[1])
local second = p._cleanNumber(args[2])
return p._random(first, second)
end
function p._random(first, second)
math.randomseed(mw.site.stats.edits + mw.site.stats.pages + os.time() + math.floor(os.clock() * 1000000000))
-- math.random will throw an error if given an explicit nil parameter, so we need to use if statements to check the params.
if first and second then
if first <= second then -- math.random doesn't allow the first number to be greater than the second.
return math.random(first, second)
end
elseif first then
return math.random(first)
else
return math.random()
end
end
--[[
order
Determine order of magnitude of a number
Usage:
{{#invoke: Math | order | value }}
]]
function wrap.order(args)
local input_string = (args[1] or args.x or '0');
local input_number = p._cleanNumber(input_string);
if input_number == nil then
return err('order of magnitude input appears non-numeric')
else
return p._order(input_number)
end
end
function p._order(x)
if x == 0 then return 0 end
return math.floor(math.log10(math.abs(x)))
end
--[[
precision
Detemines the precision of a number using the string representation
Usage:
{{ #invoke: Math | precision | value }}
]]
function wrap.precision(args)
local input_string = (args[1] or args.x or '0');
local trap_fraction = args.check_fraction;
local input_number;
if not yesno then
yesno = require('Module:Yesno')
end
if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]].
local pos = string.find(input_string, '/', 1, true);
if pos ~= nil then
if string.find(input_string, '/', pos + 1, true) == nil then
local denominator = string.sub(input_string, pos+1, -1);
local denom_value = tonumber(denominator);
if denom_value ~= nil then
return math.log10(denom_value);
end
end
end
end
input_number, input_string = p._cleanNumber(input_string);
if input_string == nil then
return err('precision input appears non-numeric')
else
return p._precision(input_string)
end
end
function p._precision(x)
if type(x) == 'number' then
x = tostring(x)
end
x = string.upper(x)
local decimal = x:find('%.')
local exponent_pos = x:find('E')
local result = 0;
if exponent_pos ~= nil then
local exponent = string.sub(x, exponent_pos + 1)
x = string.sub(x, 1, exponent_pos - 1)
result = result - tonumber(exponent)
end
if decimal ~= nil then
result = result + string.len(x) - decimal
return result
end
local pos = string.len(x);
while x:byte(pos) == string.byte('0') do
pos = pos - 1
result = result - 1
if pos <= 0 then
return 0
end
end
return result
end
--[[
max
Finds the maximum argument
Usage:
{{#invoke:Math| max | value1 | value2 | ... }}
Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.max(args)
return p._max(unpackNumberArgs(args))
end
function p._max(...)
local max_value = binary_fold((function(a, b) return a > b end), ...)
if max_value then
return max_value
end
end
--[[
median
Find the median of set of numbers
Usage:
{{#invoke:Math | median | number1 | number2 | ...}}
OR
{{#invoke:Math | median }}
]]
function wrap.median(args)
return p._median(unpackNumberArgs(args))
end
function p._median(...)
local vals = makeArgArray(...)
local count = #vals
table.sort(vals)
if count == 0 then
return 0
end
if p._mod(count, 2) == 0 then
return (vals[count/2] + vals[count/2+1])/2
else
return vals[math.ceil(count/2)]
end
end
--[[
min
Finds the minimum argument
Usage:
{{#invoke:Math| min | value1 | value2 | ... }}
OR
{{#invoke:Math| min }}
When used with no arguments, it takes its input from the parent
frame. Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.min(args)
return p._min(unpackNumberArgs(args))
end
function p._min(...)
local min_value = binary_fold((function(a, b) return a < b end), ...)
if min_value then
return min_value
end
end
--[[
sum
Finds the sum
Usage:
{{#invoke:Math| sum | value1 | value2 | ... }}
OR
{{#invoke:Math| sum }}
Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.sum(args)
return p._sum(unpackNumberArgs(args))
end
function p._sum(...)
local sums, count = fold((function(a, b) return a + b end), ...)
if not sums then
return 0
else
return sums
end
end
--[[
average
Finds the average
Usage:
{{#invoke:Math| average | value1 | value2 | ... }}
OR
{{#invoke:Math| average }}
Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.average(args)
return p._average(unpackNumberArgs(args))
end
function p._average(...)
local sum, count = fold((function(a, b) return a + b end), ...)
if not sum then
return 0
else
return sum / count
end
end
--[[
round
Rounds a number to specified precision
Usage:
{{#invoke:Math | round | value | precision }}
--]]
function wrap.round(args)
local value = p._cleanNumber(args[1] or args.value or 0)
local precision = p._cleanNumber(args[2] or args.precision or 0)
if value == nil or precision == nil then
return err('round input appears non-numeric')
else
return p._round(value, precision)
end
end
function p._round(value, precision)
local rescale = math.pow(10, precision or 0);
return math.floor(value * rescale + 0.5) / rescale;
end
--[[
log10
returns the log (base 10) of a number
Usage:
{{#invoke:Math | log10 | x }}
]]
function wrap.log10(args)
return math.log10(args[1])
end
--[[
mod
Implements the modulo operator
Usage:
{{#invoke:Math | mod | x | y }}
--]]
function wrap.mod(args)
local x = p._cleanNumber(args[1])
local y = p._cleanNumber(args[2])
if not x then
return err('first argument to mod appears non-numeric')
elseif not y then
return err('second argument to mod appears non-numeric')
else
return p._mod(x, y)
end
end
function p._mod(x, y)
local ret = x % y
if not (0 <= ret and ret < y) then
ret = 0
end
return ret
end
--[[
gcd
Calculates the greatest common divisor of multiple numbers
Usage:
{{#invoke:Math | gcd | value 1 | value 2 | value 3 | ... }}
--]]
function wrap.gcd(args)
return p._gcd(unpackNumberArgs(args))
end
function p._gcd(...)
local function findGcd(a, b)
local r = b
local oldr = a
while r ~= 0 do
local quotient = math.floor(oldr / r)
oldr, r = r, oldr - quotient * r
end
if oldr < 0 then
oldr = oldr * -1
end
return oldr
end
local result, count = fold(findGcd, ...)
return result
end
--[[
precision_format
Rounds a number to the specified precision and formats according to rules
originally used for {{template:Rnd}}. Output is a string.
Usage:
{{#invoke: Math | precision_format | number | precision }}
]]
function wrap.precision_format(args)
local value_string = args[1] or 0
local precision = args[2] or 0
return p._precision_format(value_string, precision)
end
function p._precision_format(value_string, precision)
-- For access to Mediawiki built-in formatter.
local lang = mw.getContentLanguage();
local value
value, value_string = p._cleanNumber(value_string)
precision = p._cleanNumber(precision)
-- Check for non-numeric input
if value == nil or precision == nil then
return err('invalid input when rounding')
end
local current_precision = p._precision(value)
local order = p._order(value)
-- Due to round-off effects it is neccesary to limit the returned precision under
-- some circumstances because the terminal digits will be inaccurately reported.
if order + precision >= 14 then
if order + p._precision(value_string) >= 14 then
precision = 13 - order;
end
end
-- If rounding off, truncate extra digits
if precision < current_precision then
value = p._round(value, precision)
current_precision = p._precision(value)
end
local formatted_num = lang:formatNum(math.abs(value))
local sign
-- Use proper unary minus sign rather than ASCII default
if value < 0 then
sign = '−'
else
sign = ''
end
-- Handle cases requiring scientific notation
if string.find(formatted_num, 'E', 1, true) ~= nil or math.abs(order) >= 9 then
value = value * math.pow(10, -order)
current_precision = current_precision + order
precision = precision + order
formatted_num = lang:formatNum(math.abs(value))
else
order = 0;
end
formatted_num = sign .. formatted_num
-- Pad with zeros, if needed
if current_precision < precision then
local padding
if current_precision <= 0 then
if precision > 0 then
local zero_sep = lang:formatNum(1.1)
formatted_num = formatted_num .. zero_sep:sub(2,2)
padding = precision
if padding > 20 then
padding = 20
end
formatted_num = formatted_num .. string.rep('0', padding)
end
else
padding = precision - current_precision
if padding > 20 then
padding = 20
end
formatted_num = formatted_num .. string.rep('0', padding)
end
end
-- Add exponential notation, if necessary.
if order ~= 0 then
-- Use proper unary minus sign rather than ASCII default
if order < 0 then
order = '−' .. lang:formatNum(math.abs(order))
else
order = lang:formatNum(order)
end
formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>'
end
return formatted_num
end
--[[
divide
Implements the division operator
Usage:
{{#invoke:Math | divide | x | y | round= | precision= }}
--]]
function wrap.divide(args)
local x = args[1]
local y = args[2]
local round = args.round
local precision = args.precision
if not yesno then
yesno = require('Module:Yesno')
end
return p._divide(x, y, yesno(round), precision)
end
function p._divide(x, y, round, precision)
if y == nil or y == "" then
return err("Empty divisor")
elseif not tonumber(y) then
if type(y) == 'string' and string.sub(y, 1, 1) == '<' then
return y
else
return err("Not a number: " .. y)
end
elseif x == nil or x == "" then
return err("Empty dividend")
elseif not tonumber(x) then
if type(x) == 'string' and string.sub(x, 1, 1) == '<' then
return x
else
return err("Not a number: " .. x)
end
else
local z = x / y
if round then
return p._round(z, 0)
elseif precision then
return p._round(z, precision)
else
return z
end
end
end
--[[
Helper function that interprets the input numerically. If the
input does not appear to be a number, attempts evaluating it as
a parser functions expression.
]]
function p._cleanNumber(number_string)
if type(number_string) == 'number' then
-- We were passed a number, so we don't need to do any processing.
return number_string, tostring(number_string)
elseif type(number_string) ~= 'string' or not number_string:find('%S') then
-- We were passed a non-string or a blank string, so exit.
return nil, nil;
end
-- Attempt basic conversion
local number = tonumber(number_string)
-- If failed, attempt to evaluate input as an expression
if number == nil then
local success, result = pcall(mw.ext.ParserFunctions.expr, number_string)
if success then
number = tonumber(result)
number_string = tostring(number)
else
number = nil
number_string = nil
end
else
number_string = number_string:match("^%s*(.-)%s*$") -- String is valid but may contain padding, clean it.
number_string = number_string:match("^%+(.*)$") or number_string -- Trim any leading + signs.
if number_string:find('^%-?0[xX]') then
-- Number is using 0xnnn notation to indicate base 16; use the number that Lua detected instead.
number_string = tostring(number)
end
end
return number, number_string
end
--[[
Wrapper function that does basic argument processing. This ensures that all functions from #invoke can use either the current
frame or the parent frame, and it also trims whitespace for all arguments and removes blank arguments.
]]
local mt = { __index = function(t, k)
return function(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return wrap[k](getArgs(frame)) -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed.
end
end }
return setmetatable(p, mt)
2bbe734d898299f65412963a3c1782e9fcc4d9ca
Template:Plainlist
10
535
831
830
2025-08-21T18:51:17Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}|
{{{1}}}
</div>}}<noinclude></div>
{{documentation}}
</noinclude>
1f83cec6d8a2e5ba45342d554089a71b19afae80
Template:Plainlist/styles.css
10
536
833
832
2025-08-21T18:51:17Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
padding: 0; /* Reset Minerva default */
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
15a09febff47c3fa7ff01092a7cd381b44a14427
Template:Navbox/Enemies
10
538
836
2025-08-21T18:53:26Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Enemies
| title = [[Enemies]]
| list1 =
* [[Berserking Citizen]]
* [[Citizen]]
* [[Construction Golem]]
* [[Deranged]]
* [[Dreadguard]]
* [[Fisherman]]
* [[Lancer]]
* [[Mechanomad Technomancer]]
* [[Mechanomad Warrior]]
* [[Minotaur]]
* [[Mrgud]]
* [[Osteoclast]]
* [[Plagued]]
* [[Revenant]]
* [[Vermillion Knight]]
* [[Zealot]]
| group2 = [[Bosses]]
| list2 = {{Navbox/Bosses|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
24cfff4a2c251e67dc47c1f176a54be03c2b71a5
837
836
2025-08-21T18:54:09Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Enemies
| title = [[Enemies]]
| list1 =
* [[Berserking Citizen]]
* [[Citizen]]
* [[Construction Golem]]
* [[Deranged]]
* [[Dreadguard]]
* [[Fisherman]]
* [[Lancer]]
* [[Mechanomad Technomancer]]
* [[Mechanomad Warrior]]
* [[Minotaur]]
* [[Mrgud]]
* [[Osteoclast]]
* [[Plagued]]
* [[Revenant]]
* [[Vermillion Knight]]
* [[Zealot]]
| group2 = [[Bosses]]
| list2 = {{Navbox/Bosses|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
24cfff4a2c251e67dc47c1f176a54be03c2b71a5
Enemies
0
537
835
834
2025-08-21T18:54:09Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Navbox/Enemies}}
833889e0d1b529dbf02a0a7b4ded350913eaaadd
Bosses
0
539
839
838
2025-08-21T18:54:09Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated.
{{Navbox/Bosses}}
0c3e8dc2475799e24d9fb25b0d80bf435d40e02a
Category:Bosses
14
540
841
840
2025-08-21T18:54:09Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[Category:Enemies]]
d3da306a1b523dea15853a2b661da0200bf2f201
868
841
2025-08-21T18:56:28Z
Sharparam
284703
Add description
wikitext
text/x-wiki
[[Bosses]] in {{BFF}}.
[[Category:Enemies]]
f6372fb3755dcaa25f58460244200cff259ffce0
Fisherman
0
541
843
842
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location.
== Drops ==
* [[Diver's Lungs Concoction]]
* [[Fractal Fungus]]
* [[Gingko Leaves]]
* [[Lesser Anomalous Crystal]]
* [[Lesser Restorative Fluid]]
* [[Ring of Burning Desire]]
* [[Sludge]]
* [[Upgrade Splinter]]
[[Category:Enemies]]
854a2903c300d816cf3a65b85c7bee9c7c9aeb6e
Plagued Nemesis
0
542
845
844
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| image = Plagued Nemesis.png
| SharpResist = 32
| BluntResist = 2
| TechnomancyResist = 50
}}
'''{{PAGENAME}}''' is an optional [[boss]] [[Enemies|enemy]] in {{BFF}}.
== Location ==
Found at the top of the big tower in [[Asylum|the asylum]].
== Drops ==
* [[Khopeshs]]
* [[Unstable Perk Essence]]
* [[Upgrade Module]]
* [[Anomalous Fragment]] (Only in [[NG+]])
{{Navbox/Bosses}}
3ab22950bbea5ef8c5c7eecf9db701cacb0006a0
Silicon Visage
0
543
847
846
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| image = Silicon Visage.png
| SharpResist = 15
| BluntResist = 16
| TechnomancyResist = 55
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}.
== Location ==
{{coords|9307|2902|1628}} (approximate)
Located in [[Upper Blocks]].
== Drops ==
* [[Upgrade Module]]
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
773d7fa0e470181a1ad1ada63a49044d0679caf7
Nurgei the Blademaster
0
544
849
848
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Nurgei the Blademaster.png
| SharpResist = 29
| BluntResist = 37
| TechnomancyResist = 57
}}
'''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}.
== Location ==
{{coords|1138|-9288|1571}} (approximate)
Found in [[Uranopolis#Lone Tower|Uranopolis (Lone Tower)]]. From the [[Homunculus]], walk across the long bridge lined with pillars and you will see him straight ahead in his boss arena.
== Drops ==
* [[Upgrade Module]]
* [[Nodachi]]
* [[Unstable Perk Essence]]
* [[Anomalous Fragment]] ([[NG+]])
{{Navbox/Bosses}}
1f8634a99af6d189e90d0e6283c284736ffbd4fe
Plagued Warden
0
545
851
850
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Plagued Warden.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}.
== Location ==
{{coords|2395|-2410|529}} (approximate)
Located in [[Blok 6147]]. After getting off the [[subway]], take the path leading up and then take the stairs on the left. You will see a platform nearby with a spiked shield on the far end. Interacting with the shield spawns the boss, but doing so requires having the [[Plagued Blood]] item in your inventory.
== Drops ==
* [[Spiked Shield]] (only in NG (or if you don't yet have it?))
* [[Anomalous Fragment]] (only in [[NG+]] (or if you don't have the shield?))
{{Navbox/Bosses}}
5dfd44f48ae568136e010129ccbd00bbd7c71a55
Plagued Revenant
0
546
853
852
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Plagued Revenant.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}.
== Location ==
{{coords|1432|-8866|199}} (approximate)
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After getting to the outdoors area, keep going straight until you get to the end, take a right and then left to get down to a cliff area. Go left and you'll see a mausoleum inside the cliff on the left with some graves in front of it. In front of the doors of this mausoleum is a helmet ({{coords|1409|-8884|190}}). Interacting with the helmet to attempt to take it will spawn the boss behind you.
== Drops ==
* [[Anastasia]]
* [[Plagued Revenant Helmet]]
== Trivia ==
* When dying to this boss, crying can be heard during the loading screen. This could either be intentional or a result of the nearby crying enemy respawning.
{{Navbox/Bosses}}
698530510328c2e5031366f6586a3eb9494a65e4
Wormlord
0
547
855
854
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Wormlord.png
}}
'''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Overview ==
Defeating Wormlord is required to be able to access [[The Anomaly]].
== Location ==
{{coords|2550|-4122|-1198}} (approximate)
Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
aedb9551379ee1f1febb972b361a1b8ee9e1c3fd
Archinquisitor Belisarius (boss)
0
548
857
856
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{About|the [[Bosses|boss]]|the [[NPC]]|Archinquisitor Belisarius}}
{{Infobox/Boss
| title = Archinquisitor Belisarius
| image = Archinquisitor Belisarius (boss).png
}}
'''Archinquisitor Belisarius''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Location ==
{{coords|4315|1734|-1413}} (approximate)
Found at the beginning of the [[Anomaly]] area.
== Drops ==
* [[Blessed Crosier]]
* [[Unstable Perk Essence]]
* [[Upgrade Module]]
== Quotes ==
=== Upon engaging him ===
{{Quote
|Well well… You made it through. As much as I hate to elevate your spiteful existence to the height of the truth… this is where we are now.
Ever since you've joined us, all you've done is fulfil the goals of the disgusting administration you work for.
The mundane pursuit of tasks is all you know… and this crusade against that apostate filth at the gate is just a backdrop to your performance.
Yet [[Anomaly|the anomaly]] is a blessing I will not let slip out of my hands… for it is instrumental in aiding the God-Emperor, noble is he and eternal, to finally transcend.
Nothing will stand in that path, I assure you. Not the Serdars, not [[Yaroslav]] and definitely not you – a dog that obeys by reflex instead of will.
Now… we both know you never quite die – so you'll at least find out what an eternity of pain is made of. Good thing you have no name – those make for the best martyrs.
}}
{{Navbox/Bosses}}
73a24d629934b27f74f10c58c9ab9e02ed3858bc
Unknown (boss)
0
549
859
858
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{About|the [[Bosses|boss]]|the [[Locations|location]]|Unknown (location)}}
{{Infobox/Boss
| title = Unknown
| image = Unknown (boss).png
}}
'''Unknown''' is an optional [[Bosses|boss]] in {{BFF}}.
== Overview ==
The Unknown resembles the player character in [[armor]], but uses its own [[Weapons|weapon]] instead of mirroring the player's. It does not drop its weapon on defeat.
Upon defeating the boss, the player is immediately transported to [[Vermillion Fields]].
== Location ==
Located at the end of the [[Unknown (location)|Unknown]], being the boss of the area.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
08cbc1e8f1d754f6cc8e5e04d59cc388bc187d8f
Konrad the Traitor
0
550
861
860
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Konrad the Traitor.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}.
== Overview ==
The boss is not mandatory for progression, as the [[Old Key]] can be looted off the ground behind him. However, skipping him means not having access to [[Homunculus Mirage]], as the husk drops from him (including in [[NG+]]).
== Location ==
{{coords|18794.39|-40662.96|-15.20}} (approximate)
Located at the top of the [[Monastery]], being the area's boss.
== Drops ==
* [[Homunculus Mirage Husk]]
* [[Handler Echo]]
* [[Anomalous Fragment]] ([[NG+]])
{{Navbox/Bosses}}
acd47fd792b54614f8d3d42a80fe9037a65997cc
Royal Division Captain Yulia & Vermillion Mirage
0
551
863
862
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| image = Final boss.png
}}
'''{{PAGENAME}}''' is the final [[Bosses|boss]] in {{BFF}}.
== Overview ==
When starting the fight, only the [[Vermillion Mirage]] will be present, including showing only its name in the boss healthbar.
After the mirage takes a certain amount of damage, [[Royal Division Captain Yulia]] will join the fight, updating the name in the boss healthbar to include both of them.
Dying for any reason after Yulia joins the fight causes the player to gain 0.5% [[entropy]]. This is because the act of her joining applies a debuff to the player causing entropy gain on death.
Throughout the fight, they will take turns being the active enemy, with the other one falling back to take a more passive role and using various ranged abilities on the player.
Defeating the boss will immediately trigger the [[Endings|ending]] cutscene.
After getting back to the title screen, the save file can be loaded again which will put the player at the same homunculus, allowing for the boss to be fought again. This makes it the only boss in the game that can be fought multiple times without having to start a new game.
== Location ==
Found at the end of [[Vermillion Fields]]. At the final location of the "Temple" [[Homunculus]], head up the large stairs and the boss arena will be at the top.
{{Navbox/Bosses}}
[[Category:Pages that need coordinates]]
dfff03fcfd660a270e379514af4cb192c6e3d589
Mutated Ghoul
0
552
865
864
2025-08-21T18:54:10Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Boss
| image = Mutated Ghoul.png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}.
== Location ==
{{coords|6937.36|-64861.39|-17736.47}} (approximate)
Located in a big grass field at the bottom of the [[Monastery]].
== Drops ==
* [[Anomalous Fragment]] (only in [[NG+]])
{{Navbox/Bosses}}
8e88bd012af5d51d364d79af5fc33127dd67fa4d
Template:Navbox/Bosses
10
553
866
2025-08-21T18:55:01Z
Sharparam
284703
Created page with "<!-- List bosses in alphabetical order -->{{Navbox | {{{1|}}} | template = Navbox/Bosses | title = [[Bosses]] | list1 = * [[Aberrant Knight]] * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] * [[Konrad the Traitor]] * [[Mutated Ghoul]] * [[Nurgei the Blademaster]] * [[Plagued Nemesis]] * [[Plagued Revenant]] * [[Plagued Warden]] * [[Royal Division Captain Yulia & Vermillion Mirage]] * [[Silicon Visage]] * [[Unknown (boss)|Unknown]] * [[Wormlord]] }}<noinc..."
wikitext
text/x-wiki
<!-- List bosses in alphabetical order
-->{{Navbox
| {{{1|}}}
| template = Navbox/Bosses
| title = [[Bosses]]
| list1 =
* [[Aberrant Knight]]
* [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]]
* [[Konrad the Traitor]]
* [[Mutated Ghoul]]
* [[Nurgei the Blademaster]]
* [[Plagued Nemesis]]
* [[Plagued Revenant]]
* [[Plagued Warden]]
* [[Royal Division Captain Yulia & Vermillion Mirage]]
* [[Silicon Visage]]
* [[Unknown (boss)|Unknown]]
* [[Wormlord]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
e281c4190fb60fa20447ad931105d10e630d08b7
Bosses
0
539
867
839
2025-08-21T18:55:55Z
Sharparam
284703
Add category
wikitext
text/x-wiki
'''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated.
{{Navbox/Bosses}}
[[Category:Bosses]]
bb7b42c9d701b6e1db772a7bcd242b850128fe27
Category:Enemies
14
554
869
2025-08-21T18:57:13Z
Sharparam
284703
Created page with "[[Enemies]] in {{BFF}}."
wikitext
text/x-wiki
[[Enemies]] in {{BFF}}.
112bd8e00bed6ea82522cac44012b082f89bb6d9
Enemies
0
537
870
835
2025-08-21T18:58:04Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{Navbox/Enemies}}
[[Category:Enemies]]
d6faf8074e8ca5dfe61e1d61bd2b3e81348c1ba8
Category:Capes
14
555
871
2025-08-21T19:55:58Z
Sharparam
284703
Created page with "[[Capes]] in {{BFF}}. [[Category:Equipment]]"
wikitext
text/x-wiki
[[Capes]] in {{BFF}}.
[[Category:Equipment]]
610b5d39e64ba2027967f7f378bcd46fa727934f
Module:String
828
556
872
2025-08-21T20:01:02Z
Sharparam
284703
Created page with "--[[ This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. Global options ignore_errors: If set to 'true' or 1, any error c..."
Scribunto
text/plain
--[[
This module is intended to provide access to basic string functions.
Most of the functions provided here can be invoked with named parameters,
unnamed parameters, or a mixture. If named parameters are used, Mediawiki will
automatically remove any leading or trailing whitespace from the parameter.
Depending on the intended use, it may be advantageous to either preserve or
remove such whitespace.
Global options
ignore_errors: If set to 'true' or 1, any error condition will result in
an empty string being returned rather than an error message.
error_category: If an error occurs, specifies the name of a category to
include with the error message. The default category is
[Category:Errors reported by Module String].
no_category: If set to 'true' or 1, no category will be added if an error
is generated.
Unit tests for this module are available at Module:String/tests.
]]
local str = {}
--[[
len
This function returns the length of the target string.
Usage:
{{#invoke:String|len|target_string|}}
OR
{{#invoke:String|len|s=target_string}}
Parameters
s: The string whose length to report
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string.
]]
function str.len( frame )
local new_args = str._getParameters( frame.args, {'s'} )
local s = new_args['s'] or ''
return mw.ustring.len( s )
end
--[[
sub
This function returns a substring of the target string at specified indices.
Usage:
{{#invoke:String|sub|target_string|start_index|end_index}}
OR
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}
Parameters
s: The string to return a subset of
i: The first index of the substring to return, defaults to 1.
j: The last index of the string to return, defaults to the last character.
The first character of the string is assigned an index of 1. If either i or j
is a negative value, it is interpreted the same as selecting a character by
counting from the end of the string. Hence, a value of -1 is the same as
selecting the last character of the string.
If the requested indices are out of range for the given string, an error is
reported.
]]
function str.sub( frame )
local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } )
local s = new_args['s'] or ''
local i = tonumber( new_args['i'] ) or 1
local j = tonumber( new_args['j'] ) or -1
local len = mw.ustring.len( s )
-- Convert negatives for range checking
if i < 0 then
i = len + i + 1
end
if j < 0 then
j = len + j + 1
end
if i > len or j > len or i < 1 or j < 1 then
return str._error( 'String subset index out of range' )
end
if j < i then
return str._error( 'String subset indices out of order' )
end
return mw.ustring.sub( s, i, j )
end
--[[
This function implements that features of {{str sub old}} and is kept in order
to maintain these older templates.
]]
function str.sublength( frame )
local i = tonumber( frame.args.i ) or 0
local len = tonumber( frame.args.len )
return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )
end
--[[
_match
This function returns a substring from the source string that matches a
specified pattern. It is exported for use in other modules
Usage:
strmatch = require("Module:String")._match
sresult = strmatch( s, pattern, start, match, plain, nomatch )
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This sub-routine is exported for use in other modules
function str._match( s, pattern, start, match_index, plain_flag, nomatch )
if s == '' then
return str._error( 'Target string is empty' )
end
if pattern == '' then
return str._error( 'Pattern string is empty' )
end
start = tonumber(start) or 1
if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then
return str._error( 'Requested start is out of range' )
end
if match_index == 0 then
return str._error( 'Match index is out of range' )
end
if plain_flag then
pattern = str._escapePattern( pattern )
end
local result
if match_index == 1 then
-- Find first match is simple case
result = mw.ustring.match( s, pattern, start )
else
if start > 1 then
s = mw.ustring.sub( s, start )
end
local iterator = mw.ustring.gmatch(s, pattern)
if match_index > 0 then
-- Forward search
for w in iterator do
match_index = match_index - 1
if match_index == 0 then
result = w
break
end
end
else
-- Reverse search
local result_table = {}
local count = 1
for w in iterator do
result_table[count] = w
count = count + 1
end
result = result_table[ count + match_index ]
end
end
if result == nil then
if nomatch == nil then
return str._error( 'Match not found' )
else
return nomatch
end
else
return result
end
end
--[[
match
This function returns a substring from the source string that matches a
specified pattern.
Usage:
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
OR
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from each string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
If the match_number or start_index are out of range for the string being queried, then
this function generates an error. An error is also generated if no match is found.
If one adds the parameter ignore_errors=true, then the error will be suppressed and
an empty string will be returned on any failure.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This is the entry point for #invoke:String|match
function str.match( frame )
local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} )
local s = new_args['s'] or ''
local start = tonumber( new_args['start'] ) or 1
local plain_flag = str._getBoolean( new_args['plain'] or false )
local pattern = new_args['pattern'] or ''
local match_index = math.floor( tonumber(new_args['match']) or 1 )
local nomatch = new_args['nomatch']
return str._match( s, pattern, start, match_index, plain_flag, nomatch )
end
--[[
pos
This function returns a single character from the target string at position pos.
Usage:
{{#invoke:String|pos|target_string|index_value}}
OR
{{#invoke:String|pos|target=target_string|pos=index_value}}
Parameters
target: The string to search
pos: The index for the character to return
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
The first character has an index value of 1.
If one requests a negative value, this function will select a character by counting backwards
from the end of the string. In other words pos = -1 is the same as asking for the last character.
A requested value of zero, or a value greater than the length of the string returns an error.
]]
function str.pos( frame )
local new_args = str._getParameters( frame.args, {'target', 'pos'} )
local target_str = new_args['target'] or ''
local pos = tonumber( new_args['pos'] ) or 0
if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then
return str._error( 'String index out of range' )
end
return mw.ustring.sub( target_str, pos, pos )
end
--[[
str_find
This function duplicates the behavior of {{str_find}}, including all of its quirks.
This is provided in order to support existing templates, but is NOT RECOMMENDED for
new code and templates. New code is recommended to use the "find" function instead.
Returns the first index in "source" that is a match to "target". Indexing is 1-based,
and the function returns -1 if the "target" string is not present in "source".
Important Note: If the "target" string is empty / missing, this function returns a
value of "1", which is generally unexpected behavior, and must be accounted for
separatetly.
]]
function str.str_find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target'} )
local source_str = new_args['source'] or ''
local target_str = new_args['target'] or ''
if target_str == '' then
return 1
end
local start = mw.ustring.find( source_str, target_str, 1, true )
if start == nil then
start = -1
end
return start
end
--[[
find
This function allows one to search for a target string or pattern within another
string.
Usage:
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}
OR
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}
Parameters
source: The string to search
target: The string or pattern to find within source
start: The index within the source string to start the search, defaults to 1
plain: Boolean flag indicating that target should be understood as plain
text and not as a Lua style regular expression, defaults to true
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the parameter. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
This function returns the first index >= "start" where "target" can be found
within "source". Indices are 1-based. If "target" is not found, then this
function returns 0. If either "source" or "target" are missing / empty, this
function also returns 0.
This function should be safe for UTF-8 strings.
]]
function str.find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['target'] or ''
local start_pos = tonumber(new_args['start']) or 1
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return 0
end
plain = str._getBoolean( plain )
local start = mw.ustring.find( source_str, pattern, start_pos, plain )
if start == nil then
start = 0
end
return start
end
--[[
replace
This function allows one to replace a target string or pattern within another
string.
Usage:
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}
OR
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|
count=replacement_count|plain=plain_flag}}
Parameters
source: The string to search
pattern: The string or pattern to find within source
replace: The replacement text
count: The number of occurences to replace, defaults to all.
plain: Boolean flag indicating that pattern should be understood as plain
text and not as a Lua style regular expression, defaults to true
]]
function str.replace( frame )
local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['pattern'] or ''
local replace = new_args['replace'] or ''
local count = tonumber( new_args['count'] )
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return source_str
end
plain = str._getBoolean( plain )
if plain then
pattern = str._escapePattern( pattern )
replace = string.gsub( replace, "%%", "%%%%" ) --Only need to escape replacement sequences.
end
local result
if count ~= nil then
result = mw.ustring.gsub( source_str, pattern, replace, count )
else
result = mw.ustring.gsub( source_str, pattern, replace )
end
return result
end
--[[
simple function to pipe string.rep to templates.
]]
function str.rep( frame )
local repetitions = tonumber( frame.args[2] )
if not repetitions then
return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' )
end
return string.rep( frame.args[1] or '', repetitions )
end
--[[
escapePattern
This function escapes special characters from a Lua string pattern. See [1]
for details on how patterns work.
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
Usage:
{{#invoke:String|escapePattern|pattern_string}}
Parameters
pattern_string: The pattern string to escape.
]]
function str.escapePattern( frame )
local pattern_str = frame.args[1]
if not pattern_str then
return str._error( 'No pattern string specified' )
end
local result = str._escapePattern( pattern_str )
return result
end
--[[
count
This function counts the number of occurrences of one string in another.
]]
function str.count(frame)
local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'})
local source = args.source or ''
local pattern = args.pattern or ''
local plain = str._getBoolean(args.plain or true)
if plain then
pattern = str._escapePattern(pattern)
end
local _, count = mw.ustring.gsub(source, pattern, '')
return count
end
--[[
endswith
This function determines whether a string ends with another string.
]]
function str.endswith(frame)
local args = str._getParameters(frame.args, {'source', 'pattern'})
local source = args.source or ''
local pattern = args.pattern or ''
if pattern == '' then
-- All strings end with the empty string.
return "yes"
end
if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then
return "yes"
else
return ""
end
end
--[[
join
Join all non empty arguments together; the first argument is the separator.
Usage:
{{#invoke:String|join|sep|one|two|three}}
]]
function str.join(frame)
local args = {}
local sep
for _, v in ipairs( frame.args ) do
if sep then
if v ~= '' then
table.insert(args, v)
end
else
sep = v
end
end
return table.concat( args, sep or '' )
end
-- findpagetext returns the position of a piece of text in a page
-- First positional parameter or |text is the search text
-- Optional parameter |title is the page title, defaults to current page
-- Optional parameter |plain is either true for plain search (default) or false for Lua pattern search
-- Optional parameter |nomatch is the return value when no match is found; default is nil
function str._findpagetext(args)
-- process parameters
local nomatch = args.nomatch or ""
if nomatch == "" then nomatch = nil end
--
local text = mw.text.trim(args[1] or args.text or "")
if text == "" then return nil end
--
local title = args.title or ""
local titleobj
if title == "" then
titleobj = mw.title.getCurrentTitle()
else
titleobj = mw.title.new(title)
end
--
local plain = args.plain or ""
if plain:sub(1, 1) == "f" then plain = false else plain = true end
-- get the page content and look for 'text' - return position or nomatch
local content = titleobj and titleobj:getContent()
return content and mw.ustring.find(content, text, 1, plain) or nomatch
end
function str.findpagetext(frame)
local args = frame.args
local pargs = frame:getParent().args
for k, v in pairs(pargs) do
args[k] = v
end
if not (args[1] or args.text) then return nil end
-- just the first value
return (str._findpagetext(args))
end
--[[
Helper function that populates the argument list given that user may need to use a mix of
named and unnamed parameters. This is relevant because named parameters are not
identical to unnamed parameters due to string trimming, and when dealing with strings
we sometimes want to either preserve or remove that whitespace depending on the application.
]]
function str._getParameters( frame_args, arg_list )
local new_args = {}
local index = 1
local value
for _, arg in ipairs( arg_list ) do
value = frame_args[arg]
if value == nil then
value = frame_args[index]
index = index + 1
end
new_args[arg] = value
end
return new_args
end
--[[
Helper function to handle error messages.
]]
function str._error( error_str )
local frame = mw.getCurrentFrame()
local error_category = frame.args.error_category or 'Errors reported by Module String'
local ignore_errors = frame.args.ignore_errors or false
local no_category = frame.args.no_category or false
if str._getBoolean(ignore_errors) then
return ''
end
local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>'
if error_category ~= '' and not str._getBoolean( no_category ) then
error_str = '[[Category:' .. error_category .. ']]' .. error_str
end
return error_str
end
--[[
Helper Function to interpret boolean strings
]]
function str._getBoolean( boolean_str )
local boolean_value
if type( boolean_str ) == 'string' then
boolean_str = boolean_str:lower()
if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
or boolean_str == '' then
boolean_value = false
else
boolean_value = true
end
elseif type( boolean_str ) == 'boolean' then
boolean_value = boolean_str
else
error( 'No boolean value found' )
end
return boolean_value
end
--[[
Helper function that escapes all pattern characters so that they will be treated
as plain text.
]]
function str._escapePattern( pattern_str )
return ( string.gsub( pattern_str, "[%(%)%.%%%+%-%*%?%[%^%$%]]", "%%%0" ) )
end
return str
a3717be7740b8299448ef51ae8300caf00c3cac6
Module:String/doc
828
557
873
2025-08-21T20:02:33Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Module:String|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Module:String|Module and documentation on Wikipedia]]
<noinclude>[[Category:Module documentation pages]]</noinclude>
762229bd4719989f582c0ab0a6164c27e7dd989c
Template:Main other
10
558
874
2025-08-21T20:05:16Z
Sharparam
284703
Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:0}} | main | other }} }} | main = {{{1|}}} | other | #default = {{{2|}}} }}<noinclude> {{documentation}} <!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! --> </noinclude>"
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:0}}
| main
| other
}}
}}
| main = {{{1|}}}
| other
| #default = {{{2|}}}
}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
86ad907ffeea3cc545159e00cd1f2d6433946450
Template:Main other/doc
10
559
875
2025-08-21T20:07:20Z
Sharparam
284703
Created page with "== External links == * [[mw:Template:Main other|Template on MediaWiki]] <includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== External links ==
* [[mw:Template:Main other|Template on MediaWiki]]
<includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
89ed25ee7894a7a296aa3e7017ad4b3942444395
Category:Namespace manipulation templates
14
560
876
2025-08-21T20:07:33Z
Sharparam
284703
Created blank page
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Template:Infobox/Ring
10
561
877
2025-08-21T20:08:18Z
Sharparam
284703
Created page with "<includeonly>{{#invoke:infobox|main | kind = ring | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} }}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|main
| kind = ring
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
}}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude>
4e47a92e54ae186ca95884a7814fd17d484e6f19
Template:Infobox/Ring/doc
10
562
878
2025-08-21T20:09:51Z
Sharparam
284703
Created page with "== Example == {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== Example ==
{{Infobox/Ring
| title = Cool Ring
| image = Cool Ring.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Ring
| title = Cool Ring
| image = Cool Ring.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
3a0fcf05ffaac79fbaebadf1c4c33a7e5bb61b00
Amulets
0
444
879
654
2025-08-21T20:11:19Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{Navbox/Amulets}}
[[Category:Amulets]]
a1dffe598e440da35929b53420fd1a9c97aca8d4
Category:Amulets
14
563
880
2025-08-21T20:11:42Z
Sharparam
284703
Created page with "[[Amulets]] in {{BFF}}. [[Category:Equipment]]"
wikitext
text/x-wiki
[[Amulets]] in {{BFF}}.
[[Category:Equipment]]
0df5616094b34d958f04a0b771cb3febedfb2a3e
Template:Infobox/Amulet
10
564
881
2025-08-21T20:13:12Z
Sharparam
284703
Created page with "<includeonly>{{#invoke:infobox|main | kind = amulet | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} }} {{Main other|[[Categoryr:Amulets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|main
| kind = amulet
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
}}
{{Main other|[[Categoryr:Amulets]]}}</includeonly>
<noinclude>{{Documentation}}</noinclude>
59c7689eb27247274be01dad72a94fd39ab0f116
883
881
2025-08-21T20:15:25Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|main
| kind = amulet
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
}}
{{Main other|[[Category:Amulets]]}}</includeonly>
<noinclude>{{Documentation}}</noinclude>
98dd406e69d315cc644122750f3274345ee67c16
Template:Infobox/Amulet/doc
10
565
882
2025-08-21T20:14:12Z
Sharparam
284703
Created page with "== Example == {{Infobox/Amulet | title = Amulet of Kings | image = Amulet of Kings.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Amulet | title = Amulet of Kings | image = Amulet of Kings.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== Example ==
{{Infobox/Amulet
| title = Amulet of Kings
| image = Amulet of Kings.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Amulet
| title = Amulet of Kings
| image = Amulet of Kings.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
407f3f75b4941c92d58979ccedaae629985e2034
Category:Armor sets
14
566
884
2025-08-21T20:17:24Z
Sharparam
284703
Created page with "[[Armor sets]] in {{BFF}}. [[Category:Armor]]"
wikitext
text/x-wiki
[[Armor sets]] in {{BFF}}.
[[Category:Armor]]
4261c8c87af5c69c1fd95f9b534cdaa03bda2565
Category:Armor
14
567
885
2025-08-21T20:17:39Z
Sharparam
284703
Created page with "[[Armor]] in {{BFF}}. [[Category:Equipment]]"
wikitext
text/x-wiki
[[Armor]] in {{BFF}}.
[[Category:Equipment]]
1d8c33f61240ee031af7c8bc9003e6c464e562f2
Category:Shields
14
568
886
2025-08-21T20:18:20Z
Sharparam
284703
Created page with "[[Shields]] in {{BFF}}. [[Category:Equipment]]"
wikitext
text/x-wiki
[[Shields]] in {{BFF}}.
[[Category:Equipment]]
feeed44abd585d1042d90c77b1d9917cbbfc6847
Category:Dual Wields
14
469
887
703
2025-08-21T20:19:05Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Category:Two-handed weapons]]
[[Category:Weapons]]
d1d70b00110573e778b25c45bea57d07228f8da8
Category:Two-handed weapons
14
569
888
2025-08-21T20:19:19Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Category:Weapons]]
febdf29cf9dcbef034e184720fe19a5ac5f353d8
Category:Staves
14
570
889
2025-08-21T20:20:01Z
Sharparam
284703
Created page with "[[Staves]] in {{BFF}}. [[Category:Ranged weapons]]"
wikitext
text/x-wiki
[[Staves]] in {{BFF}}.
[[Category:Ranged weapons]]
fbcb5b72d01c72093ae71f361c912b871222d451
Category:Ranged weapons
14
571
890
2025-08-21T20:20:16Z
Sharparam
284703
Created page with "[[Category:Weapons]]"
wikitext
text/x-wiki
[[Category:Weapons]]
febdf29cf9dcbef034e184720fe19a5ac5f353d8
Template:Infobox/Weapon
10
451
891
667
2025-08-21T20:23:12Z
Sharparam
284703
Improve categorisation
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
57581ea141193600dd7a356e55ba1811c1743f42
Template:Infobox/Item
10
417
892
597
2025-08-21T20:28:13Z
Sharparam
284703
Improve categorisation
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind=item
| sep=,
| title={{{title|{{PAGENAME}}}}}
| image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections=DescriptionSection
| DescriptionSection=Description
| DescriptionSection_label=Description
| Description_nolabel=yes
}}{{Main other|{{#switch:{{lc:{{{type|}}}}}
| essential = [[Category:Essential items]]
| upgrade = [[Category:Upgrade items]]
| #default = [[Category:Items]]
}}}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]</noinclude>
9bd3533dad3a53907b2b069897e3830faeed6721
Ability Splinter
0
430
893
623
2025-08-21T20:29:24Z
Sharparam
284703
Add infobox
wikitext
text/x-wiki
{{Infobox/Item
| type = essential
| image = Ability Splinter.png
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. It is used to equip and change [[abilities]].
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Deluge]] || Found near the [[Paladin Mace]]. Facing where the mace is, head left and slightly behind and look behind the large pillar to find the item. || {{coords|-4581|-7721|5575}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and keep right until you get to the room with a staircase going down. Before heading down the staircase, walk around it on its right and check the corner to find the item. || {{coords|1120|-7590|161}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the second right to get to the edge of the cliff with a bunch of graves. The item can be found near one of the graves. || {{coords|1321|-8034|190}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the left path to a cliff. Climb the cliff by repeatedly tapping the jump button. Once at the top, take the path leading down and follow it past a group of buildings (where the [[Soul Reaper]] can be found). Past the buildings are a set of graves with the item on top of one of them.
|}
{{Navbox/Items}}
f41049ed237d82ef6acd68f7fb96cabec6e868ee
Handler Echo
0
421
894
605
2025-08-21T20:30:16Z
Sharparam
284703
Add type to infobox
wikitext
text/x-wiki
{{Infobox/Item
| image = Handler Echo.png
| title = {{PAGENAME}}
| type = essential
| Description = An obscure residue used to supplement [[The Handler|the Handler's]] capabilities. [[The Handler]] can use this to upgrade [[equipment]] more effectively.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] used to level up [[The Handler]], in order to increase the max level equipment can be upgraded to.
== Usage ==
If the item is in your inventory, [[The Handler]] will automatically level up when you next interact with her. A message will also pop up in the bottom right corner of the screen informing you of the new synchronization level.
== Acquisition ==
* Drops from [[Konrad the Traitor]].
* Can drop from samurai enemies in [[Uranopolis]] (limited to one drop).
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Rain District]] || Up some stairs. || {{coords|-36697.35|-17753.66|12174.48}}
|-
| [[Asylum]] || In the spiral staircase with the shortcut door to the courtyard there is a floating ghost. Move through the ghost and the echo will be right behind it. || {{coords|-4225|6824|9253}}
|-
| [[Desert]] || In the big building after the sand worm, where Yaroslav's crew is. The echo is sitting on a toppled pillar. || {{coords|3720|1159|-1397}}
|}
{{Navbox/Items}}
dc3fe45dda237d7748a0cf867d250cff08fedcec
Homunculus Mirage
0
423
895
609
2025-08-21T20:30:47Z
Sharparam
284703
Add type to infobox
wikitext
text/x-wiki
{{Infobox/Item
| type = essential
| tabs=Normal,Husk
| Normal_title = Homunculus Mirage
| Husk_title = Humunculus Mirage Husk
| images = [[File:Homunculus Mirage.png|300px]],[[File:Homunculus Mirage Husk.png|300px]]
| Normal_Description = The Homunculus triggers its ability only when your vital signs have ceased – reassembling your body on a molecular level elsewhere while keeping your consciousness intact, allowing for seamless and instantaneous relocation.
| Husk_Description = The husk of the Homunculus stores your current state and consciousness. Return at the Homunculus to combine the two again, allowing you to place the Homunculus elsewhere.
}}
{{Navbox/Items}}
903487e48beaa0c93f10e0a63a5d4c122f9906d6
Old Key
0
429
896
621
2025-08-21T20:31:16Z
Sharparam
284703
Add type to infobox
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Old Key.png
| type = essential
| Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]].
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Location ==
{{coords|19328.57|-41596.65|3.83}}
Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up.
== Usage ==
Unlocks the gate at the top of the [[Monastery]], found near the entrance to [[Konrad the Traitor|Konrad the Traitor's]] boss arena (keep going past the entrance instead of entering it).
{{Navbox/Items}}
35b7568dcd6463e558a8716ab5e0df86bc0371e0
Perk Essence
0
424
897
611
2025-08-21T20:31:35Z
Sharparam
284703
Add type to infobox
wikitext
text/x-wiki
{{Infobox/Item
| type = essential
| tabs = Stable,Unstable
| images = [[File:Perk Essence.png|300px]],[[File:Unstable Perk Essence.png|300px]]
| Stable_title = Perk Essence
| Unstable_title = Unstable Perk Essence
| Stable_Description = An artifact used in the process of embedding perks.
| Unstable_Description = Get to a checkpoint to turn it into a perk, on death goes back to it's [sic] original location.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] used to acquire [[perks]] or perk upgrades.
== Acquisition ==
The unstable variant drops from some [[bosses]] (excluding mini-bosses), bringing it to a [[homunculus]] without dying stabilises it. It has to be brought to a normal homunculus, not one spawned by the [[Homunculus Mirage]].
Dying on the way to a homunculus while the item is still in its unstable form will respawn it in the boss's arena, forcing the player to go back and pick it up again.
{{Navbox/Items}}
06df31e4640020666782a66b6361d649f91516a8
Plagued Blood
0
422
898
607
2025-08-21T20:31:52Z
Sharparam
284703
Add type to infobox
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Plagued Blood.png
| type = essential
| Description = Harvested from a burial site, this unsettling vial contains a sample of plagued blood belonging to a Revenant.
}}
== Location ==
{{coords|-3898|1671|1585}}
Located at the top of the big tower in [[Asylum|the asylum]], after climbing a staircase into a room with a bunch of empty bookshelves, look to your right to see the item on a table.
== Usage ==
Having this item in your inventory allows for spawning some optional bosses.
* [[Plagued Warden]]
* [[Plagued Revenant]]
{{Navbox/Items}}
14acdb051f6e55b447efed3ac05a0b7c62007bc6
Scanner
0
374
899
511
2025-08-21T20:32:13Z
Sharparam
284703
Add type to infobox
wikitext
text/x-wiki
{{Infobox/Item
| image = Scanner.png
| title = {{PAGENAME}}
| type = essential
| Description = Captures and interprets data across hidden and abstract dimensions, revealing information that transcends conventional spatial and temporal limits, providing a comprehensive view of both visible and imperceptible phenomena.
}}
The '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Overview ==
Activating the item scans the area around the player, revealing important interactables like [[data logs]] and ladders.
{{Navbox/Items}}
[[Category:Lore]]
6dde4eac60da31a5e41858bdeed680e9dda22183
Upgrade Splinter
0
432
900
627
2025-08-21T20:33:07Z
Sharparam
284703
Add infobox
wikitext
text/x-wiki
{{Infobox/Item
| image = Upgrade Splinter.png
| type = upgrade
}}
'''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3.
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}}
|}
{{Navbox/Items}}
b9f020a57eb70f08cefe430eb0760284abd62b57
901
900
2025-08-21T20:34:13Z
Sharparam
284703
Add "See also" for [[Upgrade Module]]
wikitext
text/x-wiki
{{Infobox/Item
| image = Upgrade Splinter.png
| type = upgrade
}}
'''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3.
== Locations ==
{| class="wikitable"
! Area !! Description !! Coordinates
|-
| [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}}
|}
== See also ==
* [[Upgrade Module]] – To upgrade to Mk 4 and 5.
{{Navbox/Items}}
4d57ed9542043b3fdb63d30bfaa147497119f15c
Upgrade Module
0
425
902
613
2025-08-21T20:35:20Z
Sharparam
284703
Add type to infobox and note for [[Upgrade Splinter]]
wikitext
text/x-wiki
{{Infobox/Item
| title = {{PAGENAME}}
| image = Upgrade Module.png
| type = upgrade
| Description = A rare artifact used in the process of upgrading gear.
}}
'''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5.
== See also ==
* [[Upgrade Splinter]] – To upgrade to Mk 1, 2, and 3.
{{Navbox/Items}}
c999ea8a43c85cc912948b06f8657a194aeea34e
Category:Upgrade items
14
419
903
601
2025-08-21T20:35:43Z
Sharparam
284703
Change category to essential items
wikitext
text/x-wiki
[[Category:Essential items]]
4679e283883b6184f5cfc91470c12804eae20cb9
Category:Weapons
14
468
904
701
2025-08-21T20:36:27Z
Sharparam
284703
Add link to [[Weapons]] and category
wikitext
text/x-wiki
[[Weapons]] are equipment the player can use to damage monsters and defend themselves.
[[Category:Equipment]]
9906cbd32ff766765cc3704c8230f08d17b42c05
Category:One-handed weapons
14
572
905
2025-08-21T20:36:53Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Category:Weapons]]
febdf29cf9dcbef034e184720fe19a5ac5f353d8
Category:Longbows
14
573
906
2025-08-21T20:37:23Z
Sharparam
284703
Created page with "[[Category:Ranged weapons]]"
wikitext
text/x-wiki
[[Category:Ranged weapons]]
f11922e287203334625452a716db9708dbdb2fe2
Arcane Bow
0
509
907
783
2025-08-21T20:37:51Z
Sharparam
284703
Fix type
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Arcane Bow.png
| Type = Longbow
| Damage type = Sharp
| Speed = Fast
| Passives = Vermillion Judgment
| Abilities = Arrow Twister
| Mk2_Damage_min = 184
| Mk2_Damage_max = 197
| Mk3_Damage_min = 251
| Mk3_Damage_max = 267
| Mk4_Damage_min = 292
| Mk4_Damage_max = 312
| Mk5_Damage_min = 334
| Mk5_Damage_max = 356
}}
'''{{PAGENAME}}''' is a [[Bows|bow]] in {{BFF}}.
== Location ==
{{coords|1261|-8400|1563}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head into the path on the right before the big stairs. Take the ladder at the end getting up onto a building, and then the next one. The item will be in the corner of the roof on a corpse.
{{Navbox/Weapons}}
c71bb9590b06d49cf37461cb2e73d4ceb69e4775
Taskmaster
0
510
908
785
2025-08-21T20:38:10Z
Sharparam
284703
Fix type
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Taskmaster.png
| Type = Longbow
| Damage type = Sharp
| Speed = Fast
| Passives = Rapid Fire, Critical Strike
| Mk2_Damage_min = 240
| Mk2_Damage_max = 256
}}
'''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}.
== Location ==
{{coord|4052|1265|-1412}}
Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and you'll see the bow resting against some run down brick arches.
{{Navbox/Weapons}}
2e790f8146f1b835c896cbaa546ab613a5058893
File:Sharparam.png
6
574
909
2025-08-21T20:39:28Z
Sharparam
284703
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
910
909
2025-08-21T20:40:07Z
Sharparam
284703
Protected "[[File:Sharparam.png]]": Profile image for a user ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite))
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Blade Dash
0
575
912
911
2025-08-21T20:42:30Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ability
| image = OrientalDash.png
| title = Blade Dash
| Cost = 45
| Cooldown = 15
| Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone.
}}
'''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
d8d63bcf9e2ab9e7610a637cbfae9e493d98a50d
Whirlwind Strike
0
576
914
913
2025-08-21T20:42:30Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ability
| image = OrientalSpin.png
| title = Whirlwind Strike
| Cost = 75
| Cooldown = 25
| Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone.
}}
'''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
e6c1e11c6f18f8785af475d924c7d62d672fe3b3
Divine Blessing
0
577
916
915
2025-08-21T20:42:30Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ability
| image = Divine Blessing.png
| title = {{PAGENAME}}
| Cost = 125
| Cooldown = 30
| Description = Restore 30% of your total [[HP]] and deal damage to all nearby [[Plague|plagued]] [[enemies]].
}}
'''{{PAGENAME}}''' is a [[Weapons|weapon]] [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
552de679ebb2751ab76780e73c8c534074b51109
Template:Navbox/Abilities
10
578
917
2025-08-21T20:43:15Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Abilities | title = Abilities | list1 = * [[Blade Dash]] * [[Divine Blessing]] }}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = Abilities
| list1 =
* [[Blade Dash]]
* [[Divine Blessing]]
}}<noinclude>{{Documentation}}</noinclude>
248794f927ba5a321603494f50191d9afdccac76
918
917
2025-08-21T20:43:45Z
Sharparam
284703
Add [[Whirlwind Strike]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = Abilities
| list1 =
* [[Blade Dash]]
* [[Divine Blessing]]
* [[Whirlwind Strike]]
}}<noinclude>{{Documentation}}</noinclude>
1c55ce1234b5272317e8123c68b027c0096255b8
920
918
2025-08-21T20:45:06Z
Sharparam
284703
Link to abilities page
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = [[Abilities]]
| list1 =
* [[Blade Dash]]
* [[Divine Blessing]]
* [[Whirlwind Strike]]
}}<noinclude>{{Documentation}}</noinclude>
b98da907f8e5f4b2ad9e5c5c7fc0502d0bf982cc
Template:Navbox/Abilities/doc
10
579
919
2025-08-21T20:44:22Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
87827f6829955b934e0e8073491c0fef23954bf8
Abilities
0
580
921
2025-08-21T20:46:54Z
Sharparam
284703
Created page with "'''Abilities''' are special skills that can be found on some [[weapons]]. {{Navbox/Abilities}} [[Category:Abilities]]"
wikitext
text/x-wiki
'''Abilities''' are special skills that can be found on some [[weapons]].
{{Navbox/Abilities}}
[[Category:Abilities]]
4fe632a6dc4cee00686ec11acc1158dbb0dfb610
Category:Abilities
14
581
922
2025-08-21T20:47:08Z
Sharparam
284703
Created page with "[[Abilities]] in {{BFF}}."
wikitext
text/x-wiki
[[Abilities]] in {{BFF}}.
ffb5b26c014e453bf5d766e2b1ebcdfaf27c1ad9
File:Scanner.png
6
582
923
2025-08-21T20:52:24Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|game}}
5fdc0517c60eec1aa02a1fef9763fa88c38be9ad
929
923
2025-08-21T20:58:57Z
Sharparam
284703
Add game image template
wikitext
text/x-wiki
{{Game image}}
== Licensing ==
{{License|game}}
3270ce19f01542118cc5c866db430fc73423612a
Template:File other
10
583
924
2025-08-21T20:54:17Z
Sharparam
284703
Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:6}} | file | other }} }} | file | image = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude>"
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:6}}
| file
| other
}}
}}
| file
| image = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0ae5bdb15fbe55f5787d00f85a443e4eac787c5e
Template:File other/doc
10
584
925
2025-08-21T20:55:18Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
0db4fcf6efd8e3996b46bb02dce919df6124f748
Template:Game image
10
585
926
2025-08-21T20:55:42Z
Sharparam
284703
Created page with "<includeonly>{{File other|[[Category:Game images]]}}</includeonly><noinclude> {{Documentation}} </noinclude>"
wikitext
text/x-wiki
<includeonly>{{File other|[[Category:Game images]]}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
c78a04923d00959be766f2908911a29b71cc1209
Template:Game image/doc
10
586
927
2025-08-21T20:57:55Z
Sharparam
284703
Created page with "Use on files that are images exported from the game. Places the file in the [[:Category:Game images|game images]] category. == Usage == {{Tlx|Game image}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
Use on files that are images exported from the game. Places the file in the [[:Category:Game images|game images]] category.
== Usage ==
{{Tlx|Game image}}
<includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
943ab5144b7869a9247c146638e1335b709d6c1f
Category:File templates
14
587
928
2025-08-21T20:58:16Z
Sharparam
284703
Created page with "Templates to help work with or categorise files."
wikitext
text/x-wiki
Templates to help work with or categorise files.
f23108893b2522f523cb55d4a4a4bfa79744cca6
Category:Game images
14
588
930
2025-08-21T20:59:29Z
Sharparam
284703
Created page with "Images extracted from the game files. Use the {{tl|Game image}} template to place files into this category."
wikitext
text/x-wiki
Images extracted from the game files. Use the {{tl|Game image}} template to place files into this category.
912de8fa5fb07765ad87496f457aaa1eacc6b8f9
931
930
2025-08-21T20:59:51Z
Sharparam
284703
Add parent category
wikitext
text/x-wiki
Images extracted from the game files. Use the {{tl|Game image}} template to place files into this category.
[[Category:Game assets]]
b72293034ec9442cf0a59178bb392cd2dc85c4f9
Category:Game assets
14
589
932
2025-08-21T21:00:34Z
Sharparam
284703
Created page with "Assets/files that have been sourced directly from the game files of {{BFF}}."
wikitext
text/x-wiki
Assets/files that have been sourced directly from the game files of {{BFF}}.
c36e430ebb51e2f3a5bb681e61f314fde5047b1a
933
932
2025-08-21T21:00:57Z
Sharparam
284703
Add template instruction
wikitext
text/x-wiki
Assets/files that have been sourced directly from the game files of {{BFF}}. Use the {{tl|Game asset}} template to place files into this category.
266793c2d375aa979be2e77e4ce56c927328281d
Template:Game asset
10
590
934
2025-08-21T21:01:25Z
Sharparam
284703
Created page with "<includeonly>{{File other|[[Category:Game assets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
<includeonly>{{File other|[[Category:Game assets]]}}</includeonly>
<noinclude>{{Documentation}}</noinclude>
1a4fad2b6dfc8a0d60ebdbe1b0d46e89842c5b99
Template:Game asset/doc
10
591
935
2025-08-21T21:02:51Z
Sharparam
284703
Created page with "Template to place files into the [[:Category:Game assets|game assets]] category. If the file is an image or audio file, use {{tl|Game image}} or {{tl|Game audio}} instead, respectively. == Usage == {{tlx|Game asset}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
Template to place files into the [[:Category:Game assets|game assets]] category.
If the file is an image or audio file, use {{tl|Game image}} or {{tl|Game audio}} instead, respectively.
== Usage ==
{{tlx|Game asset}}
<includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
6d2473959585275d27b6bd903f738e328c8d53a2
Template:Game audio
10
592
936
2025-08-21T21:03:24Z
Sharparam
284703
Created page with "<includeonly>{{File other|[[Category:Game audio]]}}</includeonly> <noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
<includeonly>{{File other|[[Category:Game audio]]}}</includeonly>
<noinclude>{{Documentation}}</noinclude>
78524f1842114d188967471f6571bdb2f0359cae
Template:Game audio/doc
10
593
937
2025-08-21T21:04:11Z
Sharparam
284703
Created page with "Places files into the [[:Category:Game audio|game audio]] category. == Usage == {{tlx|Game audio}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
Places files into the [[:Category:Game audio|game audio]] category.
== Usage ==
{{tlx|Game audio}}
<includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
d575cc599795375aaa040ff4b63e265bdd18bc57
Category:Game audio
14
594
938
2025-08-21T21:04:40Z
Sharparam
284703
Created page with "Audio files that have been extracted from the game files of {{BFF}}. Place files into this category by using the {{tl|Game audio}} template. [[Category:Game assets]]"
wikitext
text/x-wiki
Audio files that have been extracted from the game files of {{BFF}}. Place files into this category by using the {{tl|Game audio}} template.
[[Category:Game assets]]
1f7a2e55596868ce0dc93944e9b7eee2792f96ba
File:Katanas.png
6
595
939
2025-08-21T21:06:16Z
Sharparam
284703
{{Game image}}
wikitext
text/x-wiki
== Summary ==
{{Game image}}
== Licensing ==
{{License|game}}
e84980f43421c792e6f1c8e1312cd5fa11b6864e
File:Sharp outlined.png
6
596
940
2025-08-21T21:07:44Z
Sharparam
284703
Modified version of the icon from the game files to add a black outline.
wikitext
text/x-wiki
== Summary ==
Modified version of the icon from the game files to add a black outline.
== Licensing ==
{{License|game}}
d8df869b47897c8edf3e2084037876caca074149
File:Blunt outlined.png
6
597
941
2025-08-21T21:08:57Z
Sharparam
284703
Modified version of the icon from the game files to add a black outline.
wikitext
text/x-wiki
== Summary ==
Modified version of the icon from the game files to add a black outline.
== Licensing ==
{{License|game}}
d8df869b47897c8edf3e2084037876caca074149
File:Technomancy outlined.png
6
598
942
2025-08-21T21:09:12Z
Sharparam
284703
Modified version of the icon from the game files to add a black outline.
wikitext
text/x-wiki
== Summary ==
Modified version of the icon from the game files to add a black outline.
== Licensing ==
{{License|game}}
d8df869b47897c8edf3e2084037876caca074149
File:Sharp.png
6
599
943
2025-08-21T21:09:46Z
Sharparam
284703
{{Game image}}
wikitext
text/x-wiki
== Summary ==
{{Game image}}
== Licensing ==
{{License|game}}
e84980f43421c792e6f1c8e1312cd5fa11b6864e
File:Blunt.png
6
600
944
2025-08-21T21:10:08Z
Sharparam
284703
{{Game image}}
wikitext
text/x-wiki
== Summary ==
{{Game image}}
== Licensing ==
{{License|game}}
e84980f43421c792e6f1c8e1312cd5fa11b6864e
File:Technomancy.png
6
601
945
2025-08-21T21:10:26Z
Sharparam
284703
{{Game image}}
wikitext
text/x-wiki
== Summary ==
{{Game image}}
== Licensing ==
{{License|game}}
e84980f43421c792e6f1c8e1312cd5fa11b6864e
File:Uranopolis (Tower Complex).png
6
602
946
2025-08-21T21:14:25Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_Entrance.png
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_Entrance.png
}}
== Licensing ==
{{License|game}}
fb338377a1c6697787483e018e773b122f2b82dd
File:Uranopolis (Lone Tower).png
6
603
947
2025-08-21T21:15:15Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_LoneTower.png
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_LoneTower.png
}}
== Licensing ==
{{License|game}}
f379939b05f5531092f6cb5c5da18ed46af2958b
Uranopolis
0
352
948
467
2025-08-21T21:15:46Z
Sharparam
284703
Fix second sub-location todo
wikitext
text/x-wiki
'''Uranopolis''' is a location in {{BFF}}.
== Sub-locations ==
Uranopolis consists of two sub-locations: Tower Complex and Lone Tower.
=== Tower Complex ===
{{Main|Uranopolis/Tower Complex}}
[[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]]
The '''Tower Complex''' is the first sub-location encountered by the player.
{{clear}}
=== Lone Tower ===
[[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]]
The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here.
{{Navbox/Locations}}
[[Category:Locations]]
c3a53919ad49c80b8ca6ecf37e88e385e707727b
File:Monastery (Lower).png
6
604
949
2025-08-21T21:16:47Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monasatery_Bridge.png
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monasatery_Bridge.png
}}
== Licensing ==
{{License|game}}
2a25eca089eb36a086905fe8b30501e05598829b
File:Monastery (Upper).png
6
605
950
2025-08-21T21:17:30Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monastery_Upper.png
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monastery_Upper.png
}}
== Licensing ==
{{License|game}}
07f3467b9dd417d832f5d06d38aa7630d48e8745
Category:Locations
14
606
951
2025-08-21T21:18:52Z
Sharparam
284703
Created page with "[[Locations]] in {{BFF}}."
wikitext
text/x-wiki
[[Locations]] in {{BFF}}.
abf5a13f9593d93b2f288c96a230460de31f1da2
Locations
0
351
952
465
2025-08-21T21:19:09Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{Navbox/Locations}}
[[Category:Locations]]
867a4bbec1bc92e57b6daf306356c7fd1fee46af
Template:Sic
10
607
953
2025-08-21T21:19:23Z
Sharparam
284703
Created page with "<!-- Display the first two default parameters unless ? -->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!-- Display options for [sic] linked, unlinked(default) or hidden. -->{{#if:{{{hide|}}}|| [''{{#if:{{{nolink|}}}|sic|[[sic]]}}{{#ifeq:{{{1|}}}|?|?}}'']}}<!-- Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]] --><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||Category:Articles..."
wikitext
text/x-wiki
<!--
Display the first two default parameters unless ?
-->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!--
Display options for [sic] linked, unlinked(default) or hidden.
-->{{#if:{{{hide|}}}|| [''{{#if:{{{nolink|}}}|sic|[[sic]]}}{{#ifeq:{{{1|}}}|?|?}}'']}}<!--
Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]]
--><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||[[Category:Articles containing possible transcription errors]]}}}}--><noinclude>
{{documentation}}
</noinclude>
ca36b46c4c83b9a5c2bd1e9028abaeb475e53018
954
953
2025-08-21T21:19:55Z
Sharparam
284703
Fix link to sic on WP
wikitext
text/x-wiki
<!--
Display the first two default parameters unless ?
-->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!--
Display options for [sic] linked, unlinked(default) or hidden.
-->{{#if:{{{hide|}}}|| [''{{#if:{{{nolink|}}}|sic|[[wikipedia:sic]]}}{{#ifeq:{{{1|}}}|?|?}}'']}}<!--
Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]]
--><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||[[Category:Articles containing possible transcription errors]]}}}}--><noinclude>
{{documentation}}
</noinclude>
f4a1d499c2aee37410d1b095a38a7cb8d7bf948a
955
954
2025-08-21T21:20:10Z
Sharparam
284703
Fix sic link showing interwiki prefix
wikitext
text/x-wiki
<!--
Display the first two default parameters unless ?
-->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!--
Display options for [sic] linked, unlinked(default) or hidden.
-->{{#if:{{{hide|}}}|| [''{{#if:{{{nolink|}}}|sic|[[wikipedia:sic|sic]]}}{{#ifeq:{{{1|}}}|?|?}}'']}}<!--
Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]]
--><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||[[Category:Articles containing possible transcription errors]]}}}}--><noinclude>
{{documentation}}
</noinclude>
122173e063529ad4cdba860981e6080c8105c537
Template:Sic/doc
10
608
956
2025-08-21T21:21:27Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Template:Sic|Template and documentation on Wikipedia]] <includeonly>{{Sandbox other||[[Category:Inline templates]][[Category:Typing-aid templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Template:Sic|Template and documentation on Wikipedia]]
<includeonly>{{Sandbox other||[[Category:Inline templates]][[Category:Typing-aid templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
50e8c0b6c03f834f0c33ead4b4688565c98ce30e
Category:Inline templates
14
609
957
2025-08-21T21:21:46Z
Sharparam
284703
Created page with "Templates that can/should be used inline."
wikitext
text/x-wiki
Templates that can/should be used inline.
2b990a2df2dd087ebac8b1f311d1752d5b47b3fa
MediaWiki:Sidebar
8
324
958
418
2025-08-21T21:26:50Z
Sharparam
284703
Add useful links to sidebar
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** Special:NewFiles|New files
** randompage-url|randompage
* Bleak Faith
** Items
** Locations
** NPCs
** Enemies
** Bosses
* sidebar-customizing-wiki
** MediaWiki:Sidebar|sidebar-edit-sidebar
** MediaWiki:Common.css|sidebar-edit-common-css
** MediaWiki:Vector.css|sidebar-edit-vector-css
** MediaWiki:Common.js|sidebar-edit-common-js
** Special:Gadgets|sidebar-gadgets
** Special:Import|sidebar-special-import
** Special:Export|sidebar-special-export
** Special:AllPages|sidebar-all-pages
** Special:SpecialPages|sidebar-special-pages
* wiki.gg
** support:|sidebar-support-wiki
** Wikigg-ticket-link|sidebar-submit-ticket
** wikigg-socialmedia-joinlink|wikigg-socialmedia-jointext-sidebar
728fcc8f8362af28c1f933fc508a2334547f135a
File:Blok 6147.png
6
610
959
2025-08-21T21:28:04Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Blok.png
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Blok.png
}}
== Licensing ==
{{License|game}}
9839db94437e0e25d6cc026c5150e038d2f724c2
Homunculus
0
611
960
2025-08-21T21:28:36Z
Sharparam
284703
Created page with "'''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use. == Overview == The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]]. The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions). == List of homunculi == {| class="wikitable" ! [[Locations|Location]] !! Des..."
wikitext
text/x-wiki
'''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use.
== Overview ==
The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]].
The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions).
== List of homunculi ==
{| class="wikitable"
! [[Locations|Location]] !! Description !! Coordinates
|-
| [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}}
|-
| [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}}
|-
| [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}}
|-
| [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}}
|-
| [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}}
|-
| [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}}
|-
| [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}}
|-
| [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}}
|-
| [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}}
|-
| [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}}
|-
| rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}}
| Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}}
|-
| After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}}
|-
| After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}}
|}
== Notes ==
{{notelist|refs=
{{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}}
}}
== External links ==
* [[w:Homunculus|Homunculus on Wikipedia]]
a2232f7ee4c2f2293347db7ee209a477b56b6bb4
975
960
2025-08-21T21:33:46Z
Sharparam
284703
Fix link to Wikipedia
wikitext
text/x-wiki
'''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use.
== Overview ==
The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]].
The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions).
== List of homunculi ==
{| class="wikitable"
! [[Locations|Location]] !! Description !! Coordinates
|-
| [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}}
|-
| [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}}
|-
| [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}}
|-
| [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}}
|-
| [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}}
|-
| [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}}
|-
| [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}}
|-
| [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}}
|-
| [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}}
|-
| [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}}
|-
| rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}}
| Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}}
|-
| After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}}
|-
| After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}}
|}
== Notes ==
{{notelist|refs=
{{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}}
}}
== External links ==
* [[wikipedia:Homunculus|Homunculus on Wikipedia]]
829f2024ba392d81a9d14c59df992c329ac23b2d
Template:Notelist
10
612
962
961
2025-08-21T21:32:27Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{safesubst<noinclude />:Reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst<noinclude />:#switch:{{{group|}}}
| note
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group|}}}
| #default = lower-alpha
}}}}{{safesubst<noinclude />:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | notes | refs }}<noinclude>
{{Documentation}}</noinclude>
94f17b894235ff18c73072096f5940cdbcc5b719
Template:Reflist
10
613
964
963
2025-08-21T21:32:27Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<templatestyles src="Reflist/styles.css" /><div class="reflist<!--
-->{{#if:{{{1|}}}{{{colwidth|}}}| reflist-columns references-column-width}} {{#switch:{{{liststyle|{{{group|}}}}}}
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = reflist-{{{liststyle|{{{group}}}}}}
}}" <!-- End class, start style -->{{#if:{{{1|}}}
| {{#iferror:{{#ifexpr: {{{1|1}}} > 1 }} |style="column-width: {{{1}}};"}}
| {{#if: {{{colwidth|}}}|style="column-width: {{{colwidth}}};"}}
}}>
{{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}</div>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}<noinclude>
{{Documentation}}</noinclude>
5865246773ff390ed5700866ea2396d78a81b01f
Module:Check for unknown parameters
828
614
966
965
2025-08-21T21:32:27Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and trim(s) ~= ''
end
function p.check (frame)
local args = frame.args
local pargs = frame:getParent().args
local ignoreblank = isnotempty(frame.args['ignoreblank'])
local checkpos = isnotempty(frame.args['checkpositional'])
local knownargs = {}
local unknown = frame.args['unknown'] or 'Found _VALUE_, '
local preview = frame.args['preview']
local res = {}
local regexps = {}
local comments = {}
local commentstr = ''
local ispreview = frame:preprocess( "{{REVISIONID}}" ) == "" and 1 or 0
-- create the list of known args, regular expressions, and the return string
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
if isnotempty(preview) then
preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>'
elseif preview == nil then
preview = unknown
end
if ispreview == 1 then
unknown = preview
ignoreblank = false
end
-- adds one result to the output tables
local function addresult(k)
if k == '' then
-- Fix odd bug for | = which gets stripped to the empty string and
-- breaks category links
k = ' '
end
local r = unknown:gsub('_VALUE_', k)
table.insert(res, r)
table.insert(comments, '"' .. k .. '"')
end
-- loop over the parent args, and make sure they are on the list
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for i, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
k = mw.ustring.gsub(k, '[^%w%-_ ]', '?')
addresult(k)
end
elseif checkpos and
type(k) == 'number' and
knownargs[tostring(k)] == nil and
( not ignoreblank or isnotempty(v) )
then
addresult(k)
end
end
if #comments > 0 then
commentstr = '<!-- Module:Check for unknown parameters results: ' ..
table.concat(comments, ', ') .. '-->'
end
return table.concat(res) .. commentstr
end
return p
90cb45a6cbe02f0d73cbfdec8233df899b000e3d
Template:Note
10
615
968
967
2025-08-21T21:32:27Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#if:{{{name|}}}
|{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|name={{{name|}}}|group={{#switch: {{{group|}}}
| note
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group|}}}
| #default = lower-alpha
}}
}}
|{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|group={{#switch: {{{group|}}}
| note
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group|}}}
| #default = lower-alpha
}}
}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
6ed4e5c148014b92a23bd51d16f3180881bb876c
Template:Reflist/styles.css
10
616
970
969
2025-08-21T21:32:27Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
.reflist {
list-style-type: decimal;
margin-bottom: 0.5em;
}
@media screen {
.reflist {
font-size: 0.9em; /* Make default font smaller only on screens. */
}
}
.reflist .references {
font-size: 1em; /* Reset font size when nested in reflist. */
list-style-type: inherit; /* Enable custom list-style types. */
margin-bottom: 0; /* Avoid double margin when nested in reflist. */
}
.reflist-columns {
margin-top: 0.3em; /* Reset top margin for column-embedded lists. */
}
.reflist-columns ol {
margin-top: 0;
}
.reflist-columns li {
break-inside: avoid-column; /* Avoid elements breaking between columns. */
}
.reflist-upper-alpha {
list-style-type: upper-alpha;
}
.reflist-upper-roman {
list-style-type: upper-roman;
}
.reflist-lower-alpha {
list-style-type: lower-alpha;
}
.reflist-lower-greek {
list-style-type: lower-greek;
}
.reflist-lower-roman {
list-style-type: lower-roman;
}
e2f766e5d4d3ee66aca32f6714fef1bc97648e0a
Template:Ref
10
617
972
971
2025-08-21T21:32:27Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#if:{{{follow|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}|follow={{{follow|}}}}}|{{#if:{{{name|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|name={{{name|}}}|group={{{group|}}}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
9fd4ba12eab57eadfed1197d60df81947547d276
MediaWiki:Cite link label group-lower-alpha
8
618
974
973
2025-08-21T21:32:27Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz aaa aab aac aad aae aaf aag aah aai aaj aak aal aam aan aao aap aaq aar aas aat aau aav aaw aax aay aaz aba abb abc abd abe abf abg abh abi abj abk abl abm abn abo abp abq abr abs abt abu abv abw abx aby abz aca acb acc acd ace acf acg ach aci acj ack acl acm acn aco acp acq acr acs act acu acv acw acx acy acz ada adb adc add ade adf adg adh adi adj adk adl adm adn ado adp adq adr ads adt adu adv adw adx ady adz aea aeb aec aed aee aef aeg aeh aei aej aek ael aem aen aeo aep aeq aer aes aet aeu aev aew aex aey aez afa afb afc afd afe aff afg afh afi afj afk afl afm afn afo afp afq afr afs aft afu afv afw afx afy afz aga agb agc agd age agf agg agh agi agj agk agl agm agn ago agp agq agr ags agt agu agv agw agx agy agz aha ahb ahc ahd ahe ahf ahg ahh ahi ahj ahk ahl ahm ahn aho ahp ahq ahr ahs aht ahu ahv ahw ahx ahy ahz aia aib aic aid aie aif aig aih aii aij aik ail aim ain aio aip aiq air ais ait aiu aiv aiw aix aiy aiz aja ajb ajc ajd aje ajf ajg ajh aji ajj ajk ajl ajm ajn ajo ajp ajq ajr ajs ajt aju ajv ajw ajx ajy ajz aka akb akc akd ake akf akg akh aki akj akk akl akm akn ako akp akq akr aks akt aku akv akw akx aky akz ala alb alc ald ale alf alg alh ali alj alk all alm aln alo alp alq alr als alt alu alv alw alx aly alz ama amb amc amd ame amf amg amh ami amj amk aml amm amn amo amp amq amr ams amt amu amv amw amx amy amz ana anb anc and ane anf ang anh ani anj ank anl anm ann ano anp anq anr ans ant anu anv anw anx any anz aoa aob aoc aod aoe aof aog aoh aoi aoj aok aol aom aon aoo aop aoq aor aos aot aou aov aow aox aoy aoz apa apb apc apd ape apf apg aph api apj apk apl apm apn apo app apq apr aps apt apu apv apw apx apy apz aqa aqb aqc aqd aqe aqf aqg aqh aqi aqj aqk aql aqm aqn aqo aqp aqq aqr aqs aqt aqu aqv aqw aqx aqy aqz ara arb arc ard are arf arg arh ari arj ark arl arm arn aro arp arq arr ars art aru arv arw arx ary arz asa asb asc asd ase asf asg ash asi asj ask asl asm asn aso asp asq asr ass ast asu asv asw asx asy asz ata atb atc atd ate atf atg ath ati atj atk atl atm atn ato atp atq atr ats att atu atv atw atx aty atz aua aub auc aud aue auf aug auh aui auj auk aul aum aun auo aup auq aur aus aut auu auv auw aux auy auz ava avb avc avd ave avf avg avh avi avj avk avl avm avn avo avp avq avr avs avt avu avv avw avx avy avz awa awb awc awd awe awf awg awh awi awj awk awl awm awn awo awp awq awr aws awt awu awv aww awx awy awz axa axb axc axd axe axf axg axh axi axj axk axl axm axn axo axp axq axr axs axt axu axv axw axx axy axz aya ayb ayc ayd aye ayf ayg ayh ayi ayj ayk ayl aym ayn ayo ayp ayq ayr ays ayt ayu ayv ayw ayx ayy ayz aza azb azc azd aze azf azg azh azi azj azk azl azm azn azo azp azq azr azs azt azu azv azw azx azy azz
b49c822b47338613f0c10a02bd4f6a2a6735e324
New Game Plus
0
619
976
2025-08-21T21:35:35Z
Sharparam
284703
Created page with "{{stub}} '''{{PAGENAME}}''', also known as '''New Game+''' or '''NG+''', is the option to restart the game after beating it to keep using the same character while increasing the difficulty and the max [[level]] cap. == Overview == There is no limit to how many times the player can restart the game, but there will be no further changes after the third iteration (NG+++, or NG+3). == Changes == === Max [[level]] === Each time a new iteration is started, the max level ca..."
wikitext
text/x-wiki
{{stub}}
'''{{PAGENAME}}''', also known as '''New Game+''' or '''NG+''', is the option to restart the game after beating it to keep using the same character while increasing the difficulty and the max [[level]] cap.
== Overview ==
There is no limit to how many times the player can restart the game, but there will be no further changes after the third iteration (NG+++, or NG+3).
== Changes ==
=== Max [[level]] ===
Each time a new iteration is started, the max level cap is increased by 5, until NG+3. After the third restart, the level cap stays the same. This means the maximum possible level that can be attained is 40 (25 from the base game, with an additional 5 from each NG+ iteration up to NG+3).
{| class="wikitable mw-collapsible mw-collapsed" style="text-align: right;"
! scope="col" | New Game
! scope="col" | Max level
|-
| 0 || 25
|-
| 1 || 30
|-
| 2 || 35
|-
| 3 || 40
|}
=== The Handler ===
In NG+, [[The Handler]] has an additional location near the first [[Homunculus]] in the [[Monastery#Lower|lower Monastery]].
f120a3e05824c1bb6685e05cbeb802dbfab0ea8d
977
976
2025-08-21T21:35:52Z
Sharparam
284703
Add category
wikitext
text/x-wiki
{{stub}}
'''{{PAGENAME}}''', also known as '''New Game+''' or '''NG+''', is the option to restart the game after beating it to keep using the same character while increasing the difficulty and the max [[level]] cap.
== Overview ==
There is no limit to how many times the player can restart the game, but there will be no further changes after the third iteration (NG+++, or NG+3).
== Changes ==
=== Max [[level]] ===
Each time a new iteration is started, the max level cap is increased by 5, until NG+3. After the third restart, the level cap stays the same. This means the maximum possible level that can be attained is 40 (25 from the base game, with an additional 5 from each NG+ iteration up to NG+3).
{| class="wikitable mw-collapsible mw-collapsed" style="text-align: right;"
! scope="col" | New Game
! scope="col" | Max level
|-
| 0 || 25
|-
| 1 || 30
|-
| 2 || 35
|-
| 3 || 40
|}
=== The Handler ===
In NG+, [[The Handler]] has an additional location near the first [[Homunculus]] in the [[Monastery#Lower|lower Monastery]].
[[Category:Game mechanics]]
d3138f3f7fa8eea7813d91a9269fb44c902991af
Category:Game mechanics
14
620
978
2025-08-21T21:36:21Z
Sharparam
284703
Created page with "Pages that describe concepts that make up how the game works."
wikitext
text/x-wiki
Pages that describe concepts that make up how the game works.
39eae09a03f9fcae63682fe46d2e3ddfb9af495f
NG+
0
621
979
2025-08-21T21:37:00Z
Sharparam
284703
Redirected page to [[New Game Plus]]
wikitext
text/x-wiki
#REDIRECT [[New Game Plus]]
8809153b9bcd913847df520edf01980e98855f5b
New Game+
0
622
980
2025-08-21T21:37:15Z
Sharparam
284703
Redirected page to [[New Game Plus]]
wikitext
text/x-wiki
#REDIRECT [[New Game Plus]]
8809153b9bcd913847df520edf01980e98855f5b
File:The Handler Blok 6147.png
6
623
981
2025-08-21T21:38:38Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:The Handler Deluge.png
6
624
982
2025-08-21T21:39:01Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:The Handler Asylum.png
6
625
983
2025-08-21T21:39:21Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:The Handler Upper Blocks.png
6
626
984
2025-08-21T21:39:40Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:The Handler Machinarium.png
6
627
985
2025-08-21T21:39:54Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:Homunculus Mirage.png
6
628
986
2025-08-21T21:47:54Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Homunculus
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Homunculus
}}
== Licensing ==
{{License|game}}
fc5c2ddb9ea822503dfa3596a0a0b4ff213f9f3d
File:Homunculus Mirage Husk.png
6
629
987
2025-08-21T21:48:41Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Homunculus1
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Homunculus1
}}
== Licensing ==
{{License|game}}
fdcc48c10fce6b059573bc3c191c38246a9d4540
File:Ability Splinter.png
6
630
988
2025-08-21T22:07:29Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_99
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_99
}}
== Licensing ==
{{License|game}}
cc3d774105f02e18a0268d993eff4a288bbde91a
File:Upgrade Splinter.png
6
631
989
2025-08-21T22:12:53Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_64
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_64
}}
== Licensing ==
{{License|game}}
f7a6b20cf9ed043950eee055a324323c91f45780
File:Upgrade Module.png
6
632
990
2025-08-21T22:13:33Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRunes/ClassicRunes_66
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRunes/ClassicRunes_66
}}
== Licensing ==
{{License|game}}
06698d20f8bdb3e2489af2ec0362c661b1e82459
File:Handler Echo.png
6
633
991
2025-08-21T22:34:45Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/key__3_1
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/key__3_1
}}
== Licensing ==
{{License|game}}
8faf7726b0945dd94b058d357fc1f997c9c568d9
File:Old Key.png
6
634
992
2025-08-21T22:35:49Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/Icon_OldKey
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/Icon_OldKey
}}
== Licensing ==
{{License|game}}
8dbd7a91e88980a16aa92acffed1f18d078d42db
File:Twinblade.png
6
635
993
2025-08-21T22:38:09Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Twinblade
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Twinblade
}}
== Licensing ==
{{License|game}}
f57b3438161ddfe6622c37effca2b63099b4ac31
File:Blades of Atropos.png
6
636
994
2025-08-21T22:39:05Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Atropos
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Atropos
}}
== Licensing ==
{{License|game}}
d6861ba34bbb0c868dacbf1a87e03d9d7c07f176
File:Daggers.png
6
637
995
2025-08-21T22:39:45Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Daggers1
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Daggers1
}}
== Licensing ==
{{License|game}}
e7218b6cb1ed21937cd637c65a60bb67bccdca55
File:Kamas.png
6
638
996
2025-08-21T22:40:25Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Kama
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Kama
}}
== Licensing ==
{{License|game}}
5b145fc525755a6a2f4bbfd78888039f5348c836
File:Khopeshs.png
6
639
997
2025-08-21T22:41:05Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Khopesh
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Khopesh
}}
== Licensing ==
{{License|game}}
510571eda0c8cb67da332a8d77a80876aee87923
File:Lacerators.png
6
640
998
2025-08-21T22:41:40Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Lacerator
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Lacerator
}}
== Licensing ==
{{License|game}}
5362b7aa8a461a6f084269e5182de957f385a43f
File:Divine Greataxe.png
6
641
999
2025-08-21T22:42:16Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_DivineGreataxe
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_DivineGreataxe
}}
== Licensing ==
{{License|game}}
00f73c265cad1832e38da340f48f82cc61c4ec8a
File:Paladin Mace.png
6
642
1000
2025-08-21T22:43:14Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_PaladinHammer
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_PaladinHammer
}}
== Licensing ==
{{License|game}}
fd301ddc685577d335bd1a27f591cbcadbd7ca5b
File:Scimitar.png
6
643
1001
2025-08-21T22:43:48Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Scimitar
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Scimitar
}}
3aad4afb94525075ea36eb0555e0637f33d1228d
1002
1001
2025-08-21T22:44:14Z
Sharparam
284703
Add license
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Scimitar
}}
== Licensing ==
{{License|game}}
bef934861065d3f24dcb6fdae6d78ffdc5ecff1f
File:Anastasia.png
6
644
1003
2025-08-21T22:44:57Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Anastasia
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Anastasia
}}
== Licensing ==
{{License|game}}
132c2e9a61717db76ba25f12bb83d2614fbe4c15
File:Nodachi.png
6
645
1004
2025-08-21T22:45:35Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Nodachi
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Nodachi
}}
== Licensing ==
{{License|game}}
1905a4e62612e5745b6ed0facd953984c0559869
File:Royal Claymore.png
6
646
1005
2025-08-21T22:46:14Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_RoyalClaymore
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_RoyalClaymore
}}
== Licensing ==
{{License|game}}
039ef7deb84016626039991c1b0c99d2a268ef41
Royal Claymore
0
503
1006
771
2025-08-21T22:46:48Z
Sharparam
284703
Add note about normal [[Claymore]]
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Royal Claymore.png
| Type = Two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Claymore Swing, Sword Strike
| Mk3_Damage_min = 315
| Mk3_Damage_max = 344
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Location ==
{{coords|-9938|7939|-1340}}
Found in [[Desert|the Desert]]. Starting where the [[Shifting Sands]] data log can be found, climb up the stairs on either side and walk through the arch. The item can be seen across a gap. Do a jump while sprinting to cross the gap and reach the item.
== See also ==
* [[Claymore]] – The normal version of the weapon.
{{Navbox/Weapons}}
811d68f1793d05b574f32314fb8c2e0fd7382058
File:Soul Reaper.png
6
647
1007
2025-08-21T22:47:25Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Soulreaper
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Soulreaper
}}
== Licensing ==
{{License|game}}
2aaba316c56f0b5b2cdbf0449fd1c2c26a85906a
File:Valtiel.png
6
648
1008
2025-08-21T22:47:56Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Valtiel
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Valtiel
}}
== Licensing ==
{{License|game}}
107c0ec41d9dbd5a274cb131e01ae7d9cf000c40
File:Arcane Bow.png
6
649
1009
2025-08-21T22:48:31Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArcaneBow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArcaneBow
}}
== Licensing ==
{{License|game}}
9db94b2b997e955748afee80df0be40529fc81a5
File:Taskmaster.png
6
650
1010
2025-08-21T22:49:05Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Taskmaster
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Taskmaster
}}
== Licensing ==
{{License|game}}
b3bc57a59bcfa9e63f5e6e5695f456d2491bec54
File:Asklepios.png
6
651
1011
2025-08-21T22:49:39Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Asklepios
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Asklepios
}}
== Licensing ==
{{License|game}}
301ba27e8025b499157739bb8d92fa4aaa4381fb
File:Blessed Crosier.png
6
652
1012
2025-08-21T22:50:19Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Crosier
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Crosier
}}
== Licensing ==
{{License|game}}
105800c0a6a3bbaa9b74f85cce69844db316613e
File:Vermillion Staff.png
6
653
1013
2025-08-21T22:50:49Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_VermillionStaff
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_VermillionStaff
}}
== Licensing ==
{{License|game}}
ed8025b89564e7e52c655ea6ef1b33da408b557b
Twinblades
0
654
1014
2025-08-21T22:51:18Z
Sharparam
284703
Created page with "'''Twinblades''' are a type of [[Weapons|weapon]] in {{BFF}}. [[Category:Twinblades]]"
wikitext
text/x-wiki
'''Twinblades''' are a type of [[Weapons|weapon]] in {{BFF}}.
[[Category:Twinblades]]
6cf4c13012b9674afbf0c196a84986b92f6c394c
Category:Twinblades
14
655
1015
2025-08-21T22:51:46Z
Sharparam
284703
Created page with "[[Category:Two-handed weapons]]"
wikitext
text/x-wiki
[[Category:Two-handed weapons]]
797f628182636dd7d53e09a5330ca3c8e98ffe59
Greatweapons
0
656
1016
2025-08-21T22:52:20Z
Sharparam
284703
Created page with "'''Greatweapons''' are a type of [[Two-handed weapons|two-handed weapon]] in {{BFF}}. [[Category:Greatweapons]]"
wikitext
text/x-wiki
'''Greatweapons''' are a type of [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
[[Category:Greatweapons]]
e6ca350d0fb12afe7023946321db37dda9360e39
Category:Greatweapons
14
657
1017
2025-08-21T22:52:32Z
Sharparam
284703
Created page with "[[Category:Two-handed weapons]]"
wikitext
text/x-wiki
[[Category:Two-handed weapons]]
797f628182636dd7d53e09a5330ca3c8e98ffe59
Two-handed weapons
0
658
1018
2025-08-21T22:53:14Z
Sharparam
284703
Created page with "'''Two-handed weapons''' are a type of [[Weapons|weapon]] in {{BFF}}. As they require wielding with both hands, a [[Shields|shield]] cannot be equipped at the same time. [[Category:Two-handed weapons]]"
wikitext
text/x-wiki
'''Two-handed weapons''' are a type of [[Weapons|weapon]] in {{BFF}}. As they require wielding with both hands, a [[Shields|shield]] cannot be equipped at the same time.
[[Category:Two-handed weapons]]
ac75a2ff82d7dc4dcc2faff8bb98a7e16898edc2
Ranged weapons
0
659
1019
2025-08-21T22:54:19Z
Sharparam
284703
Created page with "'''Ranged weapons''' in {{BFF}} can be used to attack enemies at range, without having to get into melee distance. == Overview == There are two types of ranged weapons, [[longbows]] and [[staves]]. [[Category:Ranged weapons]]"
wikitext
text/x-wiki
'''Ranged weapons''' in {{BFF}} can be used to attack enemies at range, without having to get into melee distance.
== Overview ==
There are two types of ranged weapons, [[longbows]] and [[staves]].
[[Category:Ranged weapons]]
8959093ae31819cb3ccc6a125991241501951913
Longbows
0
660
1020
2025-08-21T22:54:52Z
Sharparam
284703
Created page with "'''Longbows''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. They are currently the only type of bow available. [[Category:Longbows]]"
wikitext
text/x-wiki
'''Longbows''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. They are currently the only type of bow available.
[[Category:Longbows]]
c497b3be60be0f4b1eca6d7ad8060afc43fe2f21
Staves
0
661
1021
2025-08-21T22:55:21Z
Sharparam
284703
Created page with "'''Staves''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. [[Category:Staves]]"
wikitext
text/x-wiki
'''Staves''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}.
[[Category:Staves]]
8f6d470b45b1575b318b02cf1c263572c30e4e8b
Upgrade items
0
662
1022
2025-08-21T22:57:48Z
Sharparam
284703
Created page with "'''Upgrade items''' in {{BFF}} can be used to upgrade equipment to higher mark levels. == Overview == There are two upgrade items available. === Upgrade Splinter === {{Main|Upgrade Splinter}} Upgrade splinters are used to upgrade [[equipment]] to Mk 1, 2, and 3. === Upgrade Modules === {{Main|Upgrade Module}} Upgrade modules are used to upgrade equipment to Mk 4 and 5. [[Category:Upgrade items]]"
wikitext
text/x-wiki
'''Upgrade items''' in {{BFF}} can be used to upgrade equipment to higher mark levels.
== Overview ==
There are two upgrade items available.
=== Upgrade Splinter ===
{{Main|Upgrade Splinter}}
Upgrade splinters are used to upgrade [[equipment]] to Mk 1, 2, and 3.
=== Upgrade Modules ===
{{Main|Upgrade Module}}
Upgrade modules are used to upgrade equipment to Mk 4 and 5.
[[Category:Upgrade items]]
cb0f9a551001e3b722320d79fdf946e6eddcf8b6
Template:Navbox/Essential items
10
663
1023
2025-08-21T23:01:04Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Essential items | title = [[Essential items]] | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] }}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Essential items
| title = [[Essential items]]
| list1 =
* [[Ability Splinter]]
* [[Handler Echo]]
* [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]])
* [[Mobius Blade]]
* [[Old Key]]
* [[Perk Essence]] ([[Unstable Perk Essence|Unstable]])
* [[Plagued Blood]]
* [[Scanner]]
| group1.1 = [[Upgrade items|Upgrade]]
| list1.1 =
* [[Upgrade Splinter]]
* [[Upgrade Module]]
}}<noinclude>{{Documentation}}</noinclude>
1adce5372339cfa58118bd7b6ed5a8d7f993200d
Template:Navbox/Essential items/doc
10
664
1024
2025-08-21T23:01:37Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
a072d936de3f697ea20b212186fc4bf85674e635
Template:Navbox/Items
10
285
1025
323
2025-08-21T23:02:22Z
Sharparam
284703
Move essential items to child navbox
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = [[Essential items|Essential]]
| list1 = {{Navbox/Essential items|child}}
| group2 = [[Anomalous crystals]]
| list2 = {{Navbox/Anomalous crystals|child}}
| group3 = [[Consumables]]
| list3 = {{Navbox/Consumables|child}}
| group4 = [[Equipment]]
| list4 = {{Navbox/Equipment|child}}
| group5 = [[Materials]]
| list5 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
69d95ac18f0d9bf0023d12092ad0a5f2ddc9990b
Essential items
0
665
1026
2025-08-21T23:02:43Z
Sharparam
284703
Created page with "{{Navbox/Essential items}} [[Category:Essential items]]"
wikitext
text/x-wiki
{{Navbox/Essential items}}
[[Category:Essential items]]
02ca5641a551e0ead287a697a66ea738ef164267
Mobius Blade
0
666
1027
2025-08-21T23:07:40Z
Sharparam
284703
Created page with "{{Infobox/Item | type = essential | image = Mobius Blade.png }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Overview == The player can use the blade to kill themselves, allowing them to respawn at the [[homunculus]] they last saved their position at (or a [[Homunculus Mirage]]). {{Navbox/Essential items}}"
wikitext
text/x-wiki
{{Infobox/Item
| type = essential
| image = Mobius Blade.png
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Overview ==
The player can use the blade to kill themselves, allowing them to respawn at the [[homunculus]] they last saved their position at (or a [[Homunculus Mirage]]).
{{Navbox/Essential items}}
4865fb010f21a17b4d993d6f39357d69eadea7b7
File:Mobius Blade.png
6
667
1028
2025-08-21T23:08:26Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_MobiusBlade
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_MobiusBlade
}}
== Licensing ==
{{License|game}}
9ef3d7d55709957c049a3375b5b88ae6202d3eb4
File:Folk Cape.png
6
668
1029
2025-08-21T23:40:37Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_FolkCape
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_FolkCape
}}
== Licensing ==
{{License|game}}
1e1acda1f5c3e858a7735b33901fc7a37c770bfa
File:Corrupted Cape.png
6
669
1030
2025-08-21T23:41:21Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptedCape
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptedCape
}}
== Licensing ==
{{License|game}}
86ede209dfdff68e916fa5aafb18b559581d91f8
File:Techpriest Cape.png
6
670
1031
2025-08-21T23:44:18Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_HighPriestCape
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_HighPriestCape
}}
== Licensing ==
{{License|game}}
32d01bfc81b007ced7bde3a6456418a748fb4857
Techpriest Cape
0
515
1032
794
2025-08-21T23:44:51Z
Sharparam
284703
Add note on internal game file name
wikitext
text/x-wiki
{{Infobox/Cape
| image = Techpriest Cape
| title = {{PAGENAME}}
| Effect1 = +50 Max [[flux]] points.
| Effect2 = +150 [[Flux]] leech rating.
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player.
== Location ==
{{coords|-4527|8973|9614}}
Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left.
== Trivia ==
* "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]].
* The cape is called "HighPriestCape" in the game files.
{{Navbox/Capes}}
564e35049b1bb09829bde7aab564b7e15b98d8db
1033
1032
2025-08-21T23:45:34Z
Sharparam
284703
Fix image name
wikitext
text/x-wiki
{{Infobox/Cape
| image = Techpriest Cape.png
| title = {{PAGENAME}}
| Effect1 = +50 Max [[flux]] points.
| Effect2 = +150 [[Flux]] leech rating.
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player.
== Location ==
{{coords|-4527|8973|9614}}
Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left.
== Trivia ==
* "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]].
* The cape is called "HighPriestCape" in the game files.
{{Navbox/Capes}}
3222744a93dd1658eafe1d855b99f59e8a1de857
File:Wanderer Cape.png
6
671
1034
2025-08-21T23:46:08Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_WandererCape
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_WandererCape
}}
== Licensing ==
{{License|game}}
59f5d1d11c35ee9a04826ad1f5ff33f51646d7ac
File:Librarian Hood.png
6
672
1035
2025-08-21T23:48:51Z
Sharparam
284703
{{Game file
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryHood
}}
wikitext
text/x-wiki
== Summary ==
{{Game file
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryHood
}}
== Licensing ==
{{License|game}}
110860aa292ef66d5f6ed3b6afa7920caee63ee0
1061
1035
2025-08-22T00:23:39Z
Sharparam
284703
Fix template name
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryHood
}}
== Licensing ==
{{License|game}}
bea980a0ea5124ea67512b1dbc156457b8428213
File:Plagued Revenant Helmet.png
6
673
1036
2025-08-21T23:49:28Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_PlaguedRevenantHelmet
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_PlaguedRevenantHelmet
}}
== Licensing ==
{{License|game}}
adcd5cca12e8cb8758dc92663575b61298d942ac
File:Skullface Helmet.png
6
674
1037
2025-08-21T23:50:01Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_Skullface
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_Skullface
}}
== Licensing ==
{{License|game}}
13eb7e5ec1d14cf7ea75b4d27004fea01cd10745
File:Techpriest Helmet.png
6
675
1038
2025-08-21T23:50:38Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_Techpriest
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_Techpriest
}}
== Licensing ==
{{License|game}}
249ed277fd956d36cddc43935f1f56f08cca9eef
File:Citadel Warrior Chest.png
6
676
1039
2025-08-21T23:51:13Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_WarriorCuirass
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_WarriorCuirass
}}
== Licensing ==
{{License|game}}
1e4cb45419070142433921a992c177f948e7f846
File:Corrupted Cuirass.png
6
677
1040
2025-08-21T23:51:40Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptChest
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptChest
}}
== Licensing ==
{{License|game}}
6af71d11c2d4579dfa923f8f77aaf4a4c087597c
File:Librarian Overcoat.png
6
678
1041
2025-08-21T23:52:14Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibrarianChest
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibrarianChest
}}
== Licensing ==
{{License|game}}
c77e94b8315764c85113e24c9674a1c6c8cf8fda
File:Librarian Trousers.png
6
679
1042
2025-08-21T23:52:46Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryPants
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryPants
}}
== Licensing ==
{{License|game}}
7177dd164cc4369689e183b83b300d4e95a07b0f
File:Upper Blocks.png
6
680
1043
2025-08-22T00:00:33Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/UpperBlocks
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/UpperBlocks
}}
== Licensing ==
{{License|game}}
7cfe449c7d77f4edb4b76116219f67466bf01fa8
File:Rain District (Sewers).png
6
681
1044
2025-08-22T00:01:11Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Sewer
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Sewer
}}
== Licensing ==
{{License|game}}
9e5470e55d56bba0e4dad6b63c457a1c08dd0bcb
File:Rain District (Center).png
6
682
1045
2025-08-22T00:01:37Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Center
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Center
}}
== Licensing ==
{{License|game}}
70759fe0eec60d5d0ce99da02d4eaac2cb63203b
File:Deluge.png
6
683
1046
2025-08-22T00:02:00Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Deluge
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Deluge
}}
== Licensing ==
{{License|game}}
cfc96f2e156ae120c5e6bf630617f999bee3d4f9
File:Asylum.png
6
684
1047
2025-08-22T00:02:23Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Asylum
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Asylum
}}
== Licensing ==
{{License|game}}
50c6dcfd17601590137c501e8d93f4b61fbd2f45
File:Ghost Town (Floor 13).png
6
685
1048
2025-08-22T00:02:55Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown
}}
== Licensing ==
{{License|game}}
0974507d010f1d5de5e3b6affaeb63d6fd4b9fcd
File:Ghost Town (Floor 1).png
6
686
1049
2025-08-22T00:03:13Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown_Floor1
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown_Floor1
}}
== Licensing ==
{{License|game}}
9648988f1c9544e7583148058fc05b32671ea75f
File:Machinarium.png
6
687
1050
2025-08-22T00:03:38Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Machinarium
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Machinarium
}}
== Licensing ==
{{License|game}}
95d75682881ecf1489569c7a882291ae51becc5c
File:Desert.png
6
688
1051
2025-08-22T00:03:59Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Desert
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Desert
}}
== Licensing ==
{{License|game}}
233e96a1fc045c10cc5d2580564d904c2a477c26
File:Desert Mirage.png
6
689
1052
2025-08-22T00:04:26Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/DesertMirage
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/DesertMirage
}}
== Licensing ==
{{License|game}}
7d227ef4860febfdb792b9c1cc849a3d35a7bb6f
File:Anomaly.png
6
690
1053
2025-08-22T00:04:49Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Anomaly
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/Anomaly
}}
== Licensing ==
{{License|game}}
26aca621fbecbbfc5a2a8e46e0bb2f3ad61c640e
File:Vermillion Fields (Plaza).png
6
691
1054
2025-08-22T00:05:30Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionPlaza
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionPlaza
}}
== Licensing ==
{{License|game}}
47f31e8ce34e4bf716aae7924e3d8dbb2fcebdff
File:Vermillion Fields (Temple).png
6
692
1055
2025-08-22T00:05:52Z
Sharparam
284703
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionTemple
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionTemple
}}
== Licensing ==
{{License|game}}
2b5902316fc2a4752f3e3d19b8eba897da81610f
File:Statues location.jpg
6
693
1056
2025-08-22T00:08:12Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:Crescent Axe.png
6
694
1057
2025-08-22T00:11:06Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_CrescentAxe
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_CrescentAxe
}}
== Licensing ==
{{License|game}}
e4f60d5d622c5eb43841b4ffc6b32d78ce3cd014
Crescent Axe
0
502
1058
769
2025-08-22T00:11:35Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Crescent Axe.png
| Type = two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Expose Armor, Crescent Slash
| Mk2_Damage_min = 251
| Mk2_Damage_max = 271
}}
== Location ==
{{coords|-3932|1535|1532}}
Located in the room with [[The Banshee]] [[Data logs|data log]].
{{Navbox/Weapons}}
a8301762c20f8a07104c5e919cb9fbfceed2e8f5
1060
1058
2025-08-22T00:20:03Z
Sharparam
284703
Add description
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Crescent Axe.png
| Type = two-handed
| Damage type = Sharp
| Speed = Slow
| Abilities = Expose Armor, Crescent Slash
| Mk2_Damage_min = 251
| Mk2_Damage_max = 271
}}
'''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}.
== Location ==
{{coords|-3932|1535|1532}}
Located in the room with [[The Banshee]] [[Data logs|data log]].
{{Navbox/Weapons}}
00b81a1c9f4c6b9f1f6a2a0308f9d8036122d562
Template:Navbox/Weapons
10
438
1059
645
2025-08-22T00:12:35Z
Sharparam
284703
Add [[Crescent Axe]]
wikitext
text/x-wiki
<!-- Weapons must be listed in alphabetical order! -->
{{Navbox
| {{{1|}}}
| template = Navbox/Weapons
| title = [[Weapons]]
| group1 = [[One-handed weapons|One-handed]]
| list1 =
* [[Arming Sword]]
* [[Industrial Axe]]
* [[Industrial Mace]]
* [[Iron Pipe]]
* [[Longsword]]
* [[Machinist's Hammer]]
* [[Morning Star]]
* [[Paladin Mace]]
* [[Ratagan Sabre]]
* [[Scimitar]]
* [[Soul Breaker]]
* [[Tire Iron]]
* [[Torch]]
* [[Woodchopper]]
| group2 = [[Two-handed weapons|Two-handed]]
| list2 =
* [[Anastasia]]
* [[Claymore]]
* [[Crescent Axe]]
* [[Faussart]]
* [[Halberd]]
* [[Mechanical Tenderizer]]
* [[Nodachi]]
* [[Royal Claymore]]
* [[Rusty Claymore]]
* [[Solaris]]
* [[Soul Reaper]]
* [[Valtiel]]
| group2.1 = [[Dual Wields]]
| list2.1 =
* [[Blades of Atropos]]
* [[Daggers]]
* [[Kamas]]
* [[Katanas]]
* [[Khopeshs]]
* [[Lacerators]]
| group2.2 = [[Twinblades]]
| list2.2 =
* [[Twinblade]]
| group2.3 = [[Greatweapons]]
| list2.3 =
* [[Armor Buster]]
* [[Divine Greataxe]]
* [[Eviscerator]]
* [[Greathammer]]
| group3 = [[Ranged weapons|Ranged]]
| group3.1 = [[Longbows]]
| list3.1 =
* [[Arcane Bow]]
* [[Longbow]]
* [[Taskmaster]]
* [[Winged bow]]
| group3.2 = [[Staves]]
| list3.2 =
* [[Asklepios]]
* [[Blessed Crosier]]
* [[Evolved Staff]]
* [[Mechanomad Staff]]
* [[Vermillion Staff]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
58088fcaffd9bc941436dc381724677f054ceb46
Category:Helmets
14
695
1062
2025-08-22T00:25:01Z
Sharparam
284703
Created page with "[[Category:Armor]]"
wikitext
text/x-wiki
[[Category:Armor]]
8dbf198b5dcaa87a18100850cc78880444b773ad
Heartbeat
0
388
1063
539
2025-08-22T00:25:42Z
Sharparam
284703
Fix category
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}.
== Overview ==
{{Quote
|Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat feels like as word repeated until it loses meaning. Nothing endures here.
}}
== Location ==
{{coords|3326|-6471|-6573}}
Found in the [[Monastery#Lower|Monastery (Lower)]]. Starting at the [[Homunculus]], go forward until the end of the roof where the first enemy is, then take the left path that goes down several stairs. Continue into the hallway at the bottom and take a left, then go up the elevator. Go straight and you'll come to a platform with a staircase going up to the right. The data log is right before the staircase. Use [[Scanner|the scanner]] to more easily find it.
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
6b4655eec7f3f3e087d002c3a1281d247e0b0cf2
Category:Legguards
14
696
1064
2025-08-22T00:26:02Z
Sharparam
284703
Created page with "[[Category:Armor]]"
wikitext
text/x-wiki
[[Category:Armor]]
8dbf198b5dcaa87a18100850cc78880444b773ad
Category:Materials
14
697
1065
2025-08-22T00:26:18Z
Sharparam
284703
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Category:Modules
14
698
1066
2025-08-22T00:26:37Z
Sharparam
284703
Created page with "Lua modules."
wikitext
text/x-wiki
Lua modules.
079e82b53167721297f91da34adfc9459140e554
Category:Pages that need coordinates
14
699
1067
2025-08-22T00:27:59Z
Sharparam
284703
Created page with "Pages that are missing coordinates to help players locate them. Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate. Coordinates can be specified by using the {{tl|Coordinates}} template."
wikitext
text/x-wiki
Pages that are missing coordinates to help players locate them.
Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate.
Coordinates can be specified by using the {{tl|Coordinates}} template.
c583e0f1126353a4444174e9d73b247ae2968254
Skullface Helmet
0
490
1068
745
2025-08-22T00:30:40Z
Sharparam
284703
Fix formatting of passives
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Skullface Helmet.png
| Type = Helmet
| Weight = Light
| Passives = Volatile Illusions
| Mk5_Sharp = 692
| Mk5_Blunt = 692
| Mk5_Technomancy = 928
}}
== Location ==
{{coords|-4063|1564|1686}}
After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet.
{{Navbox/Armor}}
d5a1b5a552329e4ac95e57677ce97662ce7115e3
Template:Infobox/Armor
10
453
1069
671
2025-08-22T00:31:55Z
Sharparam
284703
Use {{tl:Plainlist}} instead of {{tl:Hlist}} for passives
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Weight,Set,Passives
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| helmet = [[Helmet]]
| pauldrons = [[Pauldrons]]
| chestguard = [[Chestguard]]
| legguard = [[Legguard]]
| gauntlet = [[Gauntlet]]
| #default = {{{Type}}}
}}}}
|Set={{#if:{{{Set|}}}|[[{{{Set}}}]]}}
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \!
| token = @@@@
| pattern = [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{{Mk0_Sharp|???}}}
|Mk0_Blunt={{{Mk0_Blunt|???}}}
|Mk0_Technomancy={{{Mk0_Technomancy|???}}}
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| helmet = [[Category:Helmets]]
| pauldrons = [[Category:Pauldrons]]
| chestguard = [[Category:Chestguards]]
| legguard = [[Category:Legguards]]
| gauntlet = [[Category:Gauntlets]]
| #default = [[Category:Armor]]
}}{{Armor/CargoStore
|name={{{title|}}}
|setname={{{Set|}}}
|type={{{Type|}}}
|weight={{{Weight|}}}
|sharpMk0={{{Mk0_Sharp|}}}
|bluntMk0={{{Mk0_Blunt|}}}
|technomancyMk0={{{Mk0_Technomancy|}}}
|sharpMk1={{{Mk1_Sharp|}}}
|bluntMk1={{{Mk1_Blunt|}}}
|technomancyMk1={{{Mk1_Technomancy|}}}
|sharpMk2={{{Mk2_Sharp|}}}
|bluntMk2={{{Mk2_Blunt|}}}
|technomancyMk2={{{Mk2_Technomancy|}}}
|sharpMk3={{{Mk3_Sharp|}}}
|bluntMk3={{{Mk3_Blunt|}}}
|technomancyMk3={{{Mk3_Technomancy|}}}
|sharpMk4={{{Mk4_Sharp|}}}
|bluntMk4={{{Mk4_Blunt|}}}
|technomancyMk4={{{Mk4_Technomancy|}}}
|sharpMk5={{{Mk5_Sharp|}}}
|bluntMk5={{{Mk5_Blunt|}}}
|technomancyMk5={{{Mk5_Technomancy|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
87c41b6009da8db75d705c5a2cd72f5ef3ad20d0
Techpriest Helmet
0
491
1070
747
2025-08-22T00:32:35Z
Sharparam
284703
Fix passives list
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Techpriest Helmet.png
| Type = Helmet
| Weight = Light
| Passives = Minor Flux Regen
| Mk5_Sharp = 722
| Mk5_Blunt = 722
| Mk5_Technomancy = 928
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|1272|-8495|551}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the stairs and take a narrow path on the right leading to a small area behind a building with the helmet in a corner.
{{Navbox/Armor}}
6bf0cbd27f554dbd5cd936fb46578e34b4b84ae6
Module:Track listing/styles.css
828
414
1071
589
2025-08-22T00:33:18Z
Sharparam
284703
Remove unused template
sanitized-css
text/css
.tracklist {
border-spacing: 0;
}
/* set on all rows we can set the total length row to transparent */
.tracklist tr {
background-color: var(--background-color-base, #fff);
}
.tracklist tr:nth-child(2n-1) {
background-color: var(--background-color-neutral-subtle, #f8f9fa);
}
.tracklist caption {
text-align: left;
font-weight: bold;
}
.tracklist td,
.tracklist th[scope="row"] {
vertical-align: top;
}
.tracklist th[scope="col"] {
text-align: left;
background-color: var(--background-color-neutral, #eaecf0);
}
.tracklist th.tracklist-length-header,
.tracklist th.tracklist-number-header,
.tracklist th[scope="row"],
.tracklist-length,
.tracklist-total-length td {
padding-right: 10px;
text-align: right;
}
.tracklist th[scope="row"] {
font-weight: normal;
}
.tracklist-number-header {
width: 2em;
padding-left: 10px;
}
.tracklist-length-header {
width: 4em;
}
.tracklist tr.tracklist-total-length {
background-color: transparent;
}
.tracklist .tracklist-total-length th {
padding: 0;
font-weight: bold;
}
.tracklist-total-length th > span {
float: right;
padding: 0 10px;
background-color: var(--background-color-neutral, #eaecf0);
}
.tracklist-total-length td {
background-color: var(--background-color-neutral, #eaecf0);
font-weight: bold;
padding: 0 10px 0 0;
}
f8262e857e4655dfadbdb5ad31f192ca96a267be
Module:Hatnote/styles.css
828
415
1072
590
2025-08-22T00:33:37Z
Sharparam
284703
Remove unused template
sanitized-css
text/css
.hatnote {
font-style: italic;
}
/* Limit structure CSS to divs because of [[Module:Hatnote inline]] */
div.hatnote {
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
}
.hatnote i {
font-style: normal;
}
/* The templatestyles element inserts a link element before hatnotes.
* TODO: Remove link if/when WMF resolves T200206 */
.hatnote + link + .hatnote {
margin-top: -0.5em;
}
@media print {
body.ns-0 .hatnote {
display: none !important;
}
}
eacdbf0b74568c1efba92340368f477c45b286e6
Template:Order of magnitude
10
700
1073
2025-08-22T00:35:53Z
Sharparam
284703
Created page with "<includeonly>{{safesubst:<noinclude/>#ifexpr:{{{1|0}}}=0 |{{safesubst:<noinclude/>#ifexpr:abs{{{1|0}}}1=1 |0 |{{safesubst:<noinclude/>#expr:floor((ln(abs{{{1}}}1)/ln10)+1)}} }} |{{safesubst:<noinclude/>#expr:floor((ln(abs({{{1|0}}}) )/ln 10)+1E((abs{{{1|0}}}>1E100 or abs{{{1|0}}}<1E-100)-14))}} }}</includeonly><noinclude> {{documentation}} </noinclude>"
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#ifexpr:{{{1|0}}}=0
|{{safesubst:<noinclude/>#ifexpr:abs{{{1|0}}}1=1
|0
|{{safesubst:<noinclude/>#expr:floor((ln(abs{{{1}}}1)/ln10)+1)}}
}}
|{{safesubst:<noinclude/>#expr:floor((ln(abs({{{1|0}}}) )/ln 10)+1E((abs{{{1|0}}}>1E100 or abs{{{1|0}}}<1E-100)-14))}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
cede5694e8ebb404ecdd17ae1f8e1c5d19562728
Module:Sortkey
828
701
1074
2025-08-22T00:36:58Z
Sharparam
284703
Created page with "local getArgs = require('Module:Arguments').getArgs local p = {} function p._encode(sortkey) -- Protect against sortkey nesting. -- Example: {{sort|{{dts|2013|07|07}}|{{dts|1990|12|01}}}} if string.find(sortkey, "sortkey") or string.find(sortkey, "data-sort-value") then return ""; end return mw.text.encode(sortkey) end function p.encode(frame) local args = getArgs(frame); return p._encode(args[1] or "") end local function valid_number(num) -- Return true..."
Scribunto
text/plain
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p._encode(sortkey)
-- Protect against sortkey nesting.
-- Example: {{sort|{{dts|2013|07|07}}|{{dts|1990|12|01}}}}
if string.find(sortkey, "sortkey") or string.find(sortkey, "data-sort-value") then
return "";
end
return mw.text.encode(sortkey)
end
function p.encode(frame)
local args = getArgs(frame);
return p._encode(args[1] or "")
end
local function valid_number(num)
-- Return true if num is a valid number.
-- In Scribunto (different from some standard Lua), when expressed as a string,
-- overflow or other problems are indicated with text like "inf" or "nan"
-- which are regarded as invalid here (each contains "n").
if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then
return true
end
end
function p._sortKeyForNumber(value)
local sortkey
if not valid_number(value) then
if value < 0 then
sortkey = '1000000000000000000'
else
sortkey = '9000000000000000000'
end
elseif value == 0 then
sortkey = '5000000000000000000'
else
local mag = math.floor(math.log10(math.abs(value)) + 1e-14)
local prefix
if value > 0 then
prefix = 7000 + mag
else
prefix = 2999 - mag
value = value + 10^(mag+1)
end
sortkey = string.format('%d', prefix) .. string.format('%015.0f', math.floor(value * 10^(math.min(28,14-mag))))
end
return sortkey;
end
function p.sortKeyForNumber(frame)
local args = getArgs(frame);
return p._sortKeyForNumber(args[1] or "")
end
return p
61c7b121abc7df4d9f0cab5456de8cb0de4ed1e2
Template:Hidden sort key
10
702
1075
2025-08-22T00:37:33Z
Sharparam
284703
Created page with "<span data-sort-value="{{#invoke:sortkey|encode|{{{1}}}}}" style="display:none;"></span><noinclude> {{Documentation}} </noinclude>"
wikitext
text/x-wiki
<span data-sort-value="{{#invoke:sortkey|encode|{{{1}}}}}" style="display:none;"></span><noinclude>
{{Documentation}}
</noinclude>
90e59249d00fc722efaf114ab4f6d3c2edcf640c
Template:Hid
10
703
1076
2025-08-22T00:37:50Z
Sharparam
284703
Redirected page to [[Template:Hidden sort key]]
wikitext
text/x-wiki
#REDIRECT [[Template:Hidden sort key]]
3c894cab38ac0a316503172fe1f0de434c40bae8
Template:Round
10
704
1077
2025-08-22T00:37:59Z
Sharparam
284703
Created page with "<includeonly>{{safesubst<noinclude/>:#iferror:{{#expr:{{{2|0}}}}} | {{main other|[[Category:Pages with bad rounding precision]]}}{{hid|Bad rounding here}}<!-- -->{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | 1-{{order of magnitude|{{{1}}}}} }}| {{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | {{{2|0}}}}}}}</includeonly><noinclude> {{documentation}} </noinclude>"
wikitext
text/x-wiki
<includeonly>{{safesubst<noinclude/>:#iferror:{{#expr:{{{2|0}}}}} |
{{main other|[[Category:Pages with bad rounding precision]]}}{{hid|Bad rounding here}}<!--
-->{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | 1-{{order of magnitude|{{{1}}}}} }}|
{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | {{{2|0}}}}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
9c2874586b74824fe1beb6830b56eabe7ad936ce
Template:Median
10
705
1078
2025-08-22T00:38:36Z
Sharparam
284703
Created page with "{{#invoke:math|median}} <noinclude>{{doc}}</noinclude>"
wikitext
text/x-wiki
{{#invoke:math|median}} <noinclude>{{doc}}</noinclude>
57105bd7f84192a6b93c460a09f4acb9700dfd24
Template:Median/doc
10
706
1079
2025-08-22T00:39:07Z
Sharparam
284703
Created page with "This template is used to find the median of a series of numbers. {{clear}} ==Parameters== Parameters with a number as the value are the numbers to find the average of. ==Examples== *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|40|50|1000}}</syntaxhighlight> → {{Median|20|10|30|40|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|50|1000}}</syntaxhighlight> → {{Median|20|10|30|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|..."
wikitext
text/x-wiki
This template is used to find the median of a series of numbers.
{{clear}}
==Parameters==
Parameters with a number as the value are the numbers to find the average of.
==Examples==
*<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|40|50|1000}}</syntaxhighlight> → {{Median|20|10|30|40|50|1000}}
*<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|50|1000}}</syntaxhighlight> → {{Median|20|10|30|50|1000}}
*<syntaxhighlight lang="wikitext" inline>{{Median|10.1|20.1|30.1|50.1|1000.1}}</syntaxhighlight> → {{Median|20.1|10.1|30.1|50.1|1000.1}}
==See also==
*{{tl|Average}}
6f5fe5da1f5a16fe5f485990dc980ccd555dfac7
Level
0
707
1081
1080
2025-08-22T00:43:08Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{stub}}
'''{{PAGENAME}}''' is a measure of a player's experience.
== Overview ==
The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects.
The amount of experience points required to reach further levels will regularly increase, although not with every level.
Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2.
The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]].
{| class="wikitable sticky-header hover-highlight" style="text-align: right;"
|-
! scope="col" | Level
! scope="col" | EXP to next
! scope="col" | Cost increase
! scope="col" | Total EXP
|-
| 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}}
|-
| 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}}
|-
| 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}}
|-
| 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}}
|-
| 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}}
|-
| 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}}
|-
| 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}}
|-
| 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}}
|-
| 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}}
|-
| 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}}
|-
| 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}}
|-
| 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}}
|-
| 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}}
|-
| 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}}
|-
| 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}}
|-
| 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}}
|-
| 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}}
|-
| 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}}
|-
| 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}}
|-
| 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}}
|-
| 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}}
|-
| 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}}
|-
| 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}}
|-
| 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}}
|-
| 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}}
|-
| 25 || ??? || ??? || {{fnum|430950}}
|}
[[Category:Game mechanics]]
2d60aff79f3c19820de1c03f6ed887e247b40df6
1096
1081
2025-08-22T00:48:51Z
Sharparam
284703
/* Overview */ Update level table
wikitext
text/x-wiki
{{stub}}
'''{{PAGENAME}}''' is a measure of a player's experience.
== Overview ==
The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects.
The amount of experience points required to reach further levels will regularly increase, although not with every level.
Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2.
The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]].
{| class="wikitable sticky-header hover-highlight" style="text-align: right;"
|-
! scope="col" | Level
! scope="col" | EXP to next
! scope="col" | Cost increase
! scope="col" | Total EXP
! scope="col" | Attribute points
! scope="col" | Total attr points
|-
| 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}} || 0 || 0
|-
| 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}} || 2 || 2
|-
| 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}} || 2 || 4
|-
| 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}} || 2 || 6
|-
| 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}} || 2 || 8
|-
| 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}} || 4 || 12
|-
| 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}} || 2 || 14
|-
| 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}} || 2 || 16
|-
| 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}} || 2 || 18
|-
| 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}} || 2 || 20
|-
| 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}} || 4 || 24
|-
| 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}} || 2 || 26
|-
| 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}} || 2 || 28
|-
| 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}} || 2 || 30
|-
| 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}} || 2 || 32
|-
| 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}} || 4 || 36
|-
| 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}} || 2 || 38
|-
| 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}} || 2 || 40
|-
| 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}} || 2 || 42
|-
| 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}} || 2 || 44
|-
| 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}} || 4 || 48
|-
| 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}} || 2 || 50
|-
| 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}} || 2 || 52
|-
| 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}} || 2 || 54
|-
| 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}} || 2 || 56
|-
| 25 || {{fnum|103420}} || {{fnum|78420}} || {{fnum|430950}} || 6 || 62
|-
| 26 || {{fnum|103430}} || {{fnum|10}} || {{fnum|534370}} || 3 || 65
|-
| 27 || {{fnum|103430}} || {{fnum|0}} || {{fnum|637800}} || 3 || 68
|-
| 28 || {{fnum|103430}} || {{fnum|0}} || {{fnum|741230}} || 3 || 71
|-
| 29 || {{fnum|103430}} || {{fnum|0}} || {{fnum|844660}} || 3 || 74
|}
[[Category:Game mechanics]]
836d770a69e5b4fe2126732e89aea01c3ac6074e
Category:Attributes
14
708
1083
1082
2025-08-22T00:43:08Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[Category:Game mechanics]]
f2739a7f6d15068b5f220f8cbb0a1aa293521862
Entropy
0
709
1085
1084
2025-08-22T00:43:08Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a property of the player in {{BFF}}.
== Overview ==
Entropy can only be gained from a few sources.
* Dying to a [[Vermillion Knight]] increases entropy by 0.25%.
* Dying during phase 2 of the [[Royal Division Captain Yulia & Vermillion Mirage]] boss fight (after Yulia joins the fight) increases entropy by 0.5%.
Upon reaching 100% entropy, the player's save file is deleted.
[[Category:Game mechanics]]
cda5c4f1fca74bd5447670462ba15ebe07df0b38
Strength
0
710
1087
1086
2025-08-22T00:43:08Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects weapon damage and max weight.
== Overview ==
Strength affects bonus weapon damage, as well as the max weight which affects encumbrance.
The gain to max weight is {{val|450|u=g}} for every attribute point until 45, which is the last to give the increment. Every additional level into strength after that will not increase max weight, so it has a hard cap of {{val|40.5|u=kg}}.
The gain to bonus weapon damage is always 10.8%, but going past 92 shows the total bonus damage as always being 1%. It is unclear if this is just a visual bug or if the bonus damage actually does drop down to 1%.
{| class="wikitable sortable hover-highlight sticky-header-multi mw-collapsible mw-collapsed" style="text-align: right;"
|-
! class="unsortable" scope="col" rowspan="2" | Strength
! class="unsortable" scope="col" rowspan="2" | +Weapon DMG
! class="unsortable" scope="col" rowspan="2" | Max weight (g)
! class="unsortable" scope="col" colspan="2" | Increments
|-
! class="unsortable" scope="col" | +Weapon DMG
! class="unsortable" scope="col" | Max weight (g)
|-
| 0 || 0.0% || {{fnum|20250}} || 0.0% || 0
|-
| 1 || 10.8% || {{fnum|20700}} || 10.8% || 450
|-
| 2 || 21.6% || {{fnum|21150}} || 10.8% || 450
|-
| 3 || 32.4% || {{fnum|21600}} || 10.8% || 450
|-
| 4 || 43.2% || {{fnum|22050}} || 10.8% || 450
|-
| 5 || 54.0% || {{fnum|22500}} || 10.8% || 450
|-
| 6 || 64.8% || {{fnum|22950}} || 10.8% || 450
|-
| 7 || 75.6% || {{fnum|23400}} || 10.8% || 450
|-
| 8 || 86.4% || {{fnum|23850}} || 10.8% || 450
|-
| 9 || 97.2% || {{fnum|24300}} || 10.8% || 450
|-
| 10 || 108.0% || {{fnum|24750}} || 10.8% || 450
|-
| 11 || 118.8% || {{fnum|25200}} || 10.8% || 450
|-
| 12 || 129.6% || {{fnum|25650}} || 10.8% || 450
|-
| 13 || 140.4% || {{fnum|26100}} || 10.8% || 450
|-
| 14 || 151.2% || {{fnum|26550}} || 10.8% || 450
|-
| 15 || 162.0% || {{fnum|27000}} || 10.8% || 450
|-
| 16 || 172.8% || {{fnum|27450}} || 10.8% || 450
|-
| 17 || 183.6% || {{fnum|27900}} || 10.8% || 450
|-
| 18 || 194.4% || {{fnum|28350}} || 10.8% || 450
|-
| 19 || 205.2% || {{fnum|28800}} || 10.8% || 450
|-
| 20 || 216.0% || {{fnum|29250}} || 10.8% || 450
|-
| 21 || 226.8% || {{fnum|29700}} || 10.8% || 450
|-
| 22 || 237.6% || {{fnum|30150}} || 10.8% || 450
|-
| 23 || 248.4% || {{fnum|30600}} || 10.8% || 450
|-
| 24 || 259.2% || {{fnum|31050}} || 10.8% || 450
|-
| 25 || 270.0% || {{fnum|31500}} || 10.8% || 450
|-
| 26 || 280.8% || {{fnum|31950}} || 10.8% || 450
|-
| 27 || 291.6% || {{fnum|32400}} || 10.8% || 450
|-
| 28 || 302.4% || {{fnum|32850}} || 10.8% || 450
|-
| 29 || 313.2% || {{fnum|33300}} || 10.8% || 450
|-
| 30 || 324.0% || {{fnum|33750}} || 10.8% || 450
|-
| 31 || 334.8% || {{fnum|34200}} || 10.8% || 450
|-
| 32 || 345.6% || {{fnum|34650}} || 10.8% || 450
|-
| 33 || 356.4% || {{fnum|35100}} || 10.8% || 450
|-
| 34 || 367.2% || {{fnum|35550}} || 10.8% || 450
|-
| 35 || 378.0% || {{fnum|36000}} || 10.8% || 450
|-
| 36 || 388.8% || {{fnum|36450}} || 10.8% || 450
|-
| 37 || 399.6% || {{fnum|36900}} || 10.8% || 450
|-
| 38 || 410.4% || {{fnum|37350}} || 10.8% || 450
|-
| 39 || 421.2% || {{fnum|37800}} || 10.8% || 450
|-
| 40 || 432.0% || {{fnum|38250}} || 10.8% || 450
|-
| 41 || 442.8% || {{fnum|38700}} || 10.8% || 450
|-
| 42 || 453.6% || {{fnum|39150}} || 10.8% || 450
|-
| 43 || 464.4% || {{fnum|39600}} || 10.8% || 450
|-
| 44 || 475.2% || {{fnum|40050}} || 10.8% || 450
|-
| 45 || 486.0% || {{fnum|40500}} || 10.8% || 450
|-
| 46 || 496.8% || {{fnum|40500}} || 10.8% || 0
|-
| 47 || 507.6% || {{fnum|40500}} || 10.8% || 0
|-
| 48 || 518.4% || {{fnum|40500}} || 10.8% || 0
|-
| 49 || 529.2% || {{fnum|40500}} || 10.8% || 0
|-
| 50 || 540.0% || {{fnum|40500}} || 10.8% || 0
|-
| 51 || 550.8% || {{fnum|40500}} || 10.8% || 0
|-
| 52 || 561.6% || {{fnum|40500}} || 10.8% || 0
|-
| 53 || 572.4% || {{fnum|40500}} || 10.8% || 0
|-
| 54 || 583.2% || {{fnum|40500}} || 10.8% || 0
|-
| 55 || 594.0% || {{fnum|40500}} || 10.8% || 0
|-
| 56 || 604.8% || {{fnum|40500}} || 10.8% || 0
|-
| 57 || 615.6% || {{fnum|40500}} || 10.8% || 0
|-
| 58 || 626.4% || {{fnum|40500}} || 10.8% || 0
|-
| 59 || 637.2% || {{fnum|40500}} || 10.8% || 0
|-
| 60 || 648.0% || {{fnum|40500}} || 10.8% || 0
|-
| 61 || 658.8% || {{fnum|40500}} || 10.8% || 0
|-
| 62 || 669.6% || {{fnum|40500}} || 10.8% || 0
|-
| 63 || 680.4% || {{fnum|40500}} || 10.8% || 0
|-
| 64 || 691.2% || {{fnum|40500}} || 10.8% || 0
|-
| 65 || 702.0% || {{fnum|40500}} || 10.8% || 0
|-
| 66 || 712.8% || {{fnum|40500}} || 10.8% || 0
|-
| 67 || 723.6% || {{fnum|40500}} || 10.8% || 0
|-
| 68 || 734.4% || {{fnum|40500}} || 10.8% || 0
|-
| 69 || 745.2% || {{fnum|40500}} || 10.8% || 0
|-
| 70 || 756.0% || {{fnum|40500}} || 10.8% || 0
|-
| 71 || 766.8% || {{fnum|40500}} || 10.8% || 0
|-
| 72 || 777.6% || {{fnum|40500}} || 10.8% || 0
|-
| 73 || 788.4% || {{fnum|40500}} || 10.8% || 0
|-
| 74 || 799.2% || {{fnum|40500}} || 10.8% || 0
|-
| 75 || 810.0% || {{fnum|40500}} || 10.8% || 0
|-
| 76 || 820.8% || {{fnum|40500}} || 10.8% || 0
|-
| 77 || 831.6% || {{fnum|40500}} || 10.8% || 0
|-
| 78 || 842.4% || {{fnum|40500}} || 10.8% || 0
|-
| 79 || 853.2% || {{fnum|40500}} || 10.8% || 0
|-
| 80 || 864.0% || {{fnum|40500}} || 10.8% || 0
|-
| 81 || 874.8% || {{fnum|40500}} || 10.8% || 0
|-
| 82 || 885.6% || {{fnum|40500}} || 10.8% || 0
|-
| 83 || 896.4% || {{fnum|40500}} || 10.8% || 0
|-
| 84 || 907.2% || {{fnum|40500}} || 10.8% || 0
|-
| 85 || 918.0% || {{fnum|40500}} || 10.8% || 0
|-
| 86 || 928.8% || {{fnum|40500}} || 10.8% || 0
|-
| 87 || 939.6% || {{fnum|40500}} || 10.8% || 0
|-
| 88 || 950.4% || {{fnum|40500}} || 10.8% || 0
|-
| 89 || 961.2% || {{fnum|40500}} || 10.8% || 0
|-
| 90 || 972.0% || {{fnum|40500}} || 10.8% || 0
|-
| 91 || 982.8% || {{fnum|40500}} || 10.8% || 0
|-
| 92 || 993.6% || {{fnum|40500}} || 10.8% || 0
|}
[[Category:Attributes]]
acf936b03bf018cd91d4c8f8790137535cf71c2d
Agility
0
711
1089
1088
2025-08-22T00:43:08Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects stats related to critical chance, stamina, speed, and boss resistance to arrows.
== Overview ==
Critical chance and melee swing speed both have a hard cap at 100. The hard caps for other stats can be seen in the table when their increment amount drops to zero.
<!--<div class="noresize">-->
{| class="wikitable hover-highlight mw-collapsible mw-collapsed sortable sticky-header-multi" style="text-align: right;"
|-
! class="unsortable" scope="col" rowspan="2" | Agility
! class="unsortable" scope="col" rowspan="2" | Crit chance
! class="unsortable" scope="col" rowspan="2" | Stamina
! class="unsortable" scope="col" rowspan="2" | Stam delay
! class="unsortable" scope="col" rowspan="2" | Move speed
! class="unsortable" scope="col" rowspan="2" | Melee swing speed
! class="unsortable" scope="col" rowspan="2" | Range wep draw spd pen
! class="unsortable" scope="col" rowspan="2" | Boss arrow res reduction
! class="unsortable" scope="col" colspan="7" | Increments
|-
! class="unsortable" scope="col" | Crit chance
! class="unsortable" scope="col" | Stamina
! class="unsortable" scope="col" | Stam delay
! class="unsortable" scope="col" | Move speed
! class="unsortable" scope="col" | Melee swing speed
! class="unsortable" scope="col" | Range wep draw spd pen
! class="unsortable" scope="col" | Boss arrow res reduction
|-
| 0 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 25.00% || 0% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 0.00% || 0%
|-
| 1 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 23.89% || 1% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 2 || 0.25% || 105 || 1.90 || 100.00% || 100.0% || 22.78% || 2% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 3 || 0.50% || 105 || 1.90 || 100.00% || 100.0% || 21.67% || 3% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 4 || 0.75% || 105 || 1.90 || 100.00% || 100.0% || 20.56% || 4% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 5 || 1.00% || 105 || 1.90 || 100.00% || 100.0% || 19.45% || 5% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1%
|-
| 6 || 1.50% || 107 || 1.89 || 100.00% || 100.0% || 18.34% || 6% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 7 || 2.00% || 109 || 1.88 || 100.00% || 100.0% || 17.23% || 7% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 8 || 2.50% || 111 || 1.87 || 100.00% || 100.0% || 16.12% || 8% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 9 || 3.00% || 113 || 1.86 || 100.00% || 100.0% || 15.01% || 9% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 10 || 3.50% || 115 || 1.85 || 100.00% || 100.0% || 13.90% || 10% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 11 || 4.10% || 117 || 1.84 || 100.00% || 100.0% || 12.79% || 11% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 12 || 4.70% || 119 || 1.83 || 100.00% || 100.0% || 11.68% || 12% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 13 || 5.30% || 121 || 1.82 || 100.00% || 100.0% || 10.57% || 13% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 14 || 5.90% || 123 || 1.81 || 100.00% || 100.0% || 9.46% || 14% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 15 || 6.50% || 125 || 1.80 || 100.00% || 100.0% || 8.35% || 15% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1%
|-
| 16 || 9.07% || 127 || 1.79 || 100.17% || 100.5% || 7.24% || 16% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 17 || 11.64% || 129 || 1.78 || 100.34% || 101.0% || 6.13% || 17% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 18 || 14.21% || 131 || 1.77 || 100.51% || 101.5% || 5.02% || 18% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 19 || 16.78% || 133 || 1.76 || 100.68% || 102.0% || 3.91% || 19% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 20 || 19.35% || 135 || 1.75 || 100.85% || 102.5% || 2.80% || 20% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 21 || 21.92% || 137 || 1.74 || 101.02% || 103.0% || 1.69% || 21% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 22 || 24.49% || 139 || 1.73 || 101.19% || 103.5% || 0.58% || 22% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 23 || 27.06% || 141 || 1.72 || 101.36% || 104.0% || -0.53% || 23% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 24 || 29.63% || 143 || 1.71 || 101.53% || 104.5% || -1.64% || 24% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 25 || 32.20% || 145 || 1.70 || 101.70% || 105.0% || -2.75% || 25% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 26 || 34.77% || 147 || 1.69 || 101.87% || 105.5% || -3.86% || 26% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 27 || 37.34% || 149 || 1.68 || 102.04% || 106.0% || -4.97% || 27% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 28 || 39.91% || 151 || 1.67 || 102.21% || 106.5% || -6.08% || 28% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 29 || 42.48% || 153 || 1.66 || 102.38% || 107.0% || -7.19% || 29% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 30 || 45.05% || 155 || 1.65 || 102.55% || 107.5% || -8.30% || 30% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 31 || 46.05% || 157 || 1.64 || 102.72% || 108.0% || -9.41% || 31% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 32 || 47.05% || 159 || 1.63 || 102.89% || 108.5% || -10.52% || 32% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 33 || 48.05% || 161 || 1.62 || 103.06% || 109.0% || -11.63% || 33% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 34 || 49.05% || 163 || 1.61 || 103.23% || 109.5% || -12.74% || 34% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 35 || 50.05% || 165 || 1.60 || 103.40% || 110.0% || -13.85% || 35% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 36 || 51.05% || 167 || 1.59 || 103.57% || 110.5% || -14.96% || 36% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 37 || 52.05% || 169 || 1.58 || 103.74% || 111.0% || -16.07% || 37% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 38 || 53.05% || 171 || 1.57 || 103.91% || 111.5% || -17.18% || 38% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 39 || 54.05% || 173 || 1.56 || 104.08% || 112.0% || -18.29% || 39% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 40 || 55.05% || 175 || 1.55 || 104.25% || 112.5% || -19.40% || 40% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 41 || 56.05% || 177 || 1.54 || 104.42% || 113.0% || -20.51% || 41% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 42 || 57.05% || 179 || 1.53 || 104.59% || 113.5% || -21.62% || 42% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 43 || 58.05% || 181 || 1.52 || 104.76% || 114.0% || -22.73% || 43% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 44 || 59.05% || 183 || 1.51 || 104.93% || 114.5% || -23.84% || 44% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 45 || 60.05% || 185 || 1.50 || 105.10% || 115.0% || -24.95% || 45% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1%
|-
| 46 || 61.05% || 186 || 1.50 || 105.24% || 115.5% || -24.95% || 46% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 47 || 62.05% || 187 || 1.50 || 105.38% || 116.0% || -24.95% || 47% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 48 || 63.05% || 188 || 1.50 || 105.52% || 116.5% || -24.95% || 48% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 49 || 64.05% || 189 || 1.50 || 105.66% || 117.0% || -24.95% || 49% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 50 || 65.05% || 190 || 1.50 || 105.80% || 117.5% || -24.95% || 50% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1%
|-
| 51 || 65.45% || 191 || 1.50 || 105.94% || 117.7% || -24.95% || 51% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 52 || 65.85% || 192 || 1.50 || 106.08% || 117.9% || -24.95% || 52% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 53 || 66.25% || 193 || 1.50 || 106.22% || 118.1% || -24.95% || 53% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 54 || 66.65% || 194 || 1.50 || 106.36% || 118.3% || -24.95% || 54% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 55 || 67.05% || 195 || 1.50 || 106.50% || 118.5% || -24.95% || 55% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 56 || 67.45% || 196 || 1.50 || 106.64% || 118.7% || -24.95% || 56% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 57 || 67.85% || 197 || 1.50 || 106.78% || 118.9% || -24.95% || 57% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 58 || 68.25% || 198 || 1.50 || 106.92% || 119.1% || -24.95% || 58% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 59 || 68.65% || 199 || 1.50 || 107.06% || 119.3% || -24.95% || 59% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 60 || 69.05% || 200 || 1.50 || 107.20% || 119.5% || -24.95% || 60% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 61 || 69.45% || 201 || 1.50 || 107.34% || 119.7% || -24.95% || 61% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 62 || 69.85% || 202 || 1.50 || 107.48% || 119.9% || -24.95% || 62% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 63 || 70.25% || 203 || 1.50 || 107.62% || 120.1% || -24.95% || 63% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 64 || 70.65% || 204 || 1.50 || 107.76% || 120.3% || -24.95% || 64% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 65 || 71.05% || 205 || 1.50 || 107.90% || 120.5% || -24.95% || 65% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 66 || 71.45% || 206 || 1.50 || 108.04% || 120.7% || -24.95% || 66% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 67 || 71.85% || 207 || 1.50 || 108.18% || 120.9% || -24.95% || 67% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 68 || 72.25% || 208 || 1.50 || 108.32% || 121.1% || -24.95% || 68% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 69 || 72.65% || 209 || 1.50 || 108.46% || 121.3% || -24.95% || 69% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 70 || 73.05% || 210 || 1.50 || 108.60% || 121.5% || -24.95% || 70% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 71 || 73.45% || 211 || 1.50 || 108.74% || 121.7% || -24.95% || 71% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 72 || 73.85% || 212 || 1.50 || 108.88% || 121.9% || -24.95% || 72% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 73 || 74.25% || 213 || 1.50 || 109.02% || 122.1% || -24.95% || 73% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 74 || 74.65% || 214 || 1.50 || 109.16% || 122.3% || -24.95% || 74% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 75 || 75.05% || 215 || 1.50 || 109.30% || 122.5% || -24.95% || 75% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1%
|-
| 76 || 75.25% || 216 || 1.50 || 109.44% || 122.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 77 || 75.45% || 217 || 1.50 || 109.58% || 122.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 78 || 75.65% || 218 || 1.50 || 109.72% || 122.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 79 || 75.85% || 219 || 1.50 || 109.86% || 122.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 80 || 76.05% || 220 || 1.50 || 110.00% || 123.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0%
|-
| 81 || 76.25% || 221 || 1.50 || 110.00% || 123.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 82 || 76.45% || 222 || 1.50 || 110.00% || 123.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 83 || 76.65% || 223 || 1.50 || 110.00% || 123.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 84 || 76.85% || 224 || 1.50 || 110.00% || 123.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 85 || 77.05% || 225 || 1.50 || 110.00% || 123.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 86 || 77.25% || 226 || 1.50 || 110.00% || 123.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 87 || 77.45% || 227 || 1.50 || 110.00% || 123.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 88 || 77.65% || 228 || 1.50 || 110.00% || 123.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 89 || 77.85% || 229 || 1.50 || 110.00% || 123.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 90 || 78.05% || 230 || 1.50 || 110.00% || 124.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 91 || 78.25% || 231 || 1.50 || 110.00% || 124.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 92 || 78.45% || 232 || 1.50 || 110.00% || 124.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 93 || 78.65% || 233 || 1.50 || 110.00% || 124.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 94 || 78.85% || 234 || 1.50 || 110.00% || 124.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 95 || 79.05% || 235 || 1.50 || 110.00% || 124.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 96 || 79.25% || 236 || 1.50 || 110.00% || 124.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 97 || 79.45% || 237 || 1.50 || 110.00% || 124.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 98 || 79.65% || 238 || 1.50 || 110.00% || 124.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 99 || 79.85% || 239 || 1.50 || 110.00% || 124.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|-
| 100 || 80.05% || 240 || 1.50 || 110.00% || 125.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0%
|}
<!--</div>-->
[[Category:Attributes]]
7a701b76e512860658a8b6ad71e4474cbf3409ce
Attributes
0
712
1091
1090
2025-08-22T00:43:08Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' determine the player's [[stats]].
== Overview ==
Each time the player [[Level|levels up]], they get two points to spend on one of the four attributes.
== Strength ==
{{main|Strength}}
== Agility ==
{{main|Agility}}
== Intelligence ==
{{main|Intelligence}}
== Constitution ==
{{main|Constitution}}
[[Category:Attributes]]
9e68b22348fa67fdf1237f31b0043c8996b44821
Template:Fnum
10
713
1092
2025-08-22T00:44:05Z
Sharparam
284703
Created page with "{{#invoke:Formatnum|main}}<noinclude> {{Documentation}} </noinclude>"
wikitext
text/x-wiki
{{#invoke:Formatnum|main}}<noinclude>
{{Documentation}}
</noinclude>
610b9ebfdb987a06a7ffa7b6c9a99ace22ce370c
Module:Formatnum
828
714
1093
2025-08-22T00:44:58Z
Sharparam
284703
Created page with "local getArgs = require('Module:Arguments').getArgs local gaps = require('Module:Gapnum').gaps local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local number = args[1] or args.number or '' local prec = args.prec or nil return p.formatNum(number, prec) end function p.formatNum(number, prec) -- Do not alter the specified value when it is not a valid number, return it as is local value = to..."
Scribunto
text/plain
local getArgs = require('Module:Arguments').getArgs
local gaps = require('Module:Gapnum').gaps
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
local number = args[1] or args.number or ''
local prec = args.prec or nil
return p.formatNum(number, prec)
end
function p.formatNum(number, prec)
-- Do not alter the specified value when it is not a valid number, return it as is
local value = tonumber(number)
if value == nil then
return number
end
return gaps(value, { prec = prec })
end
return p
e262e6249b47c2293a72504f7c619d5a2319f144
Module:Formatnum/doc
828
715
1094
2025-08-22T00:45:21Z
Sharparam
284703
Created page with "== Examples == * <syntaxhighlight lang="wikitext" inline>{{fnum|999999}}</syntaxhighlight> → {{fnum|999999}} * <syntaxhighlight lang="wikitext" inline>{{fnum|999999|prec=2}}</syntaxhighlight> → {{fnum|999999|prec=2}} * <syntaxhighlight lang="wikitext" inline>{{fnum|999999.99|prec=2}}</syntaxhighlight> → {{fnum|999999.99|prec=2}}"
wikitext
text/x-wiki
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{fnum|999999}}</syntaxhighlight> → {{fnum|999999}}
* <syntaxhighlight lang="wikitext" inline>{{fnum|999999|prec=2}}</syntaxhighlight> → {{fnum|999999|prec=2}}
* <syntaxhighlight lang="wikitext" inline>{{fnum|999999.99|prec=2}}</syntaxhighlight> → {{fnum|999999.99|prec=2}}
0052a8d10ce94177ba8324b60420d90b79b8059f
Module:Gapnum
828
716
1095
2025-08-22T00:45:51Z
Sharparam
284703
Created page with "local p = {} local getArgs function p.main(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end local args = getArgs(frame, {wrappers = 'Template:Gapnum'}) local n = args[1] if not n then error('Parameter 1 is required') elseif not tonumber(n) and not tonumber(n, 36) then -- Validates any number with base ≤ 36 error('Unable to convert "' .. args[1] .. '" to a number') end local gap = args.gap local precision = tonumber(args.p..."
Scribunto
text/plain
local p = {}
local getArgs
function p.main(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {wrappers = 'Template:Gapnum'})
local n = args[1]
if not n then
error('Parameter 1 is required')
elseif not tonumber(n) and not tonumber(n, 36) then -- Validates any number with base ≤ 36
error('Unable to convert "' .. args[1] .. '" to a number')
end
local gap = args.gap
local precision = tonumber(args.prec)
return p.gaps(n,{gap=gap,prec=precision})
end
-- Not named p._main so that it has a better function name when required by Module:Val
function p.gaps(n,tbl)
local nstr = tostring(n)
if not tbl then
tbl = {}
end
local gap = tbl.gap or '.25em'
local int_part, frac_part = p.groups(n,tbl.prec)
local ret = mw.html.create('span')
:css('white-space','nowrap')
-- No gap necessary on first group
:wikitext(table.remove(int_part,1))
-- Build int part
for _, v in ipairs(int_part) do
ret:tag('span')
:css('margin-left',gap)
:wikitext(v)
end
if frac_part then
-- The first group after the decimal shouldn't have a gap
ret:wikitext('.' .. table.remove(frac_part,1))
-- Build frac part
for _, v in ipairs(frac_part) do
ret:tag('span')
:css('margin-left',gap)
:wikitext(v)
end
end
return ret
end
-- Creates tables where each element is a different group of the number
function p.groups(num,precision)
local nstr = tostring(num)
if not precision then
precision = -1
else
precision = tonumber(precision)
end
local decimalloc = nstr:find('.', 1, true)
local int_part, frac_part
if decimalloc == nil then
int_part = nstr
if precision > 0 then
frac_part = "0"
end
else
int_part = nstr:sub(1, decimalloc-1)
frac_part = nstr:sub(decimalloc + 1)
end
-- only define ret_i as an empty table, let ret_d stay nil
local ret_i,ret_d = {}
-- Loop to handle most of the groupings; from right to left, so that if a group has less than 3 members, it will be the first group
while int_part:len() > 3 do
-- Insert in first spot, since we're moving backwards
table.insert(ret_i,1,int_part:sub(-3))
int_part = int_part:sub(1,-4)
end
-- handle any left over numbers
if int_part:len() > 0 then
table.insert(ret_i,1,int_part)
end
if precision ~= 0 and frac_part then
ret_d = {}
if precision == -1 then
precision = frac_part:len()
end
-- Reduce the length of the string if required precision is less than actual precision
-- OR
-- Increase it (by adding 0s) if the required precision is more than actual
local offset = precision - frac_part:len()
if offset < 0 then
frac_part = frac_part:sub(1,precision)
elseif offset > 0 then
frac_part = frac_part .. string.rep('0', offset)
end
-- Allow groups of 3 or 2 (3 first)
for v in string.gmatch(frac_part,'%d%d%d?') do
table.insert(ret_d,v)
end
-- Preference for groups of 4 instead of groups of 1 at the end
if #frac_part % 3 == 1 then
if frac_part:len() == 1 then
ret_d = {frac_part}
else
local last_g = ret_d[#ret_d] or ''
last_g = last_g..frac_part:sub(-1)
ret_d[#ret_d] = last_g
end
end
end
return ret_i,ret_d
end
return p
6f8d2352b772fec644235b007ba3793006835986
Template:Val
10
717
1098
1097
2025-08-22T00:55:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#invoke:val|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
de315e9728588de49567fc363ccc28b987b6e298
Module:Val
828
718
1100
1099
2025-08-22T00:55:50Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- For Template:Val, output a number and optional unit.
-- Format options include scientific and uncertainty notations.
local numdot = '.' -- decimal mark (use ',' for Italian)
local numsep = ',' -- group separator (use ' ' for Italian)
local mtext = {
-- Message and other text that should be localized.
['mt-bad-exponent'] = 'exponent parameter (<b>e</b>)',
['mt-parameter'] = 'parameter ',
['mt-not-number'] = 'is not a valid number',
['mt-cannot-range'] = 'cannot use a range if the first parameter includes "e"',
['mt-need-range'] = 'needs a range in parameter 2',
['mt-should-range'] = 'should be a range',
['mt-cannot-with-e'] = 'cannot be used if the first parameter includes "e"',
['mt-not-range'] = 'does not accept a range',
['mt-cannot-e'] = 'cannot use e notation',
['mt-too-many-parameter'] = 'too many parameters',
['mt-need-number'] = 'need a number after the last parameter because it is a range.',
['mt-ignore-parameter4'] = 'Val parameter 4 ignored',
['mt-val-not-supported'] = 'Val parameter "%s=%s" is not supported',
['mt-invalid-scale'] = 'Unit "%s" has invalid scale "%s"',
['mt-both-u-ul'] = 'unit (<b>u</b>) and unit with link (<b>ul</b>) are both specified, only one is allowed.',
['mt-both-up-upl'] = 'unit per (<b>up</b>) and unit per with link (<b>upl</b>) are both specified, only one is allowed.',
}
local data_module = 'Module:Val/units'
local convert_module = 'Module:Convert'
local function valerror(msg, nocat, iswarning)
-- Return formatted message text for an error or warning.
-- Can append "#FormattingError" to URL of a page with a problem to find it.
local anchor = '<span id="FormattingError"></span>'
local body, category
if nocat or mw.title.getCurrentTitle():inNamespaces(1, 2, 3, 5) then
-- No category in Talk, User, User_talk, or Wikipedia_talk.
category = ''
else
category = '[[Category:Pages with incorrect formatting templates use]]'
end
iswarning = false -- problems are infrequent so try showing large error so editor will notice
if iswarning then
body = '<sup class="noprint Inline-Template" style="white-space:nowrap;">' ..
'[[Template:Val|<span title="' ..
msg:gsub('"', '"') ..
'">warning</span>]]</sup>'
else
body = '<strong class="error">' ..
'Error in {{[[Template:val|val]]}}: ' ..
msg ..
'</strong>'
end
return anchor .. body .. category
end
local range_types = {
-- No need for ' ' because nowrap applies to all output.
[","] = ", ",
["by"] = " by ",
["-"] = "–",
["–"] = "–",
["and"] = " and ",
["or"] = " or " ,
["to"] = " to " ,
["x"] = " × ",
["×"] = " × ",
["/"] = "/",
}
local range_repeat_unit = {
-- WP:UNIT wants unit repeated when a "multiply" range is used.
["x"] = true,
["×"] = true,
}
local function extract_item(index, numbers, arg)
-- Extract an item from arg and store the result in numbers[index].
-- If no argument or if argument is valid, return nil (no error);
-- otherwise, return an error message.
-- The stored result is:
-- * a table for a number (empty if there was no specified number); or
-- * a string for range text
-- Input like 1e3 is regarded as invalid for all except argument 1
-- which accepts e notation as an alternative to the 'e' argument.
-- Input group separators are removed.
local which = index
local function fail(msg)
local description
if which == 'e' then
description = mtext['mt-bad-exponent']
else
description = mtext['mt-parameter'] .. which
end
return description .. ' ' .. (msg or mtext['mt-not-number']) .. '.'
end
local result = {}
local range = range_types[arg]
if range then
if type(index) == 'number' and (index % 2 == 0) then
if index == 2 then
if numbers[1] and numbers[1].exp then
return fail(mtext['mt-cannot-range'])
end
numbers.has_ranges = true
else
if not numbers.has_ranges then
return fail(mtext['mt-need-range'])
end
end
numbers[index] = range
if range_repeat_unit[arg] then
-- Any "repeat" range forces unit (if any) to be repeated for all items.
numbers.isrepeat = true
end
return nil
end
return fail(mtext['mt-not-range'])
end
if numbers.has_ranges and type(index) == 'number' and (index % 2 == 0) then
return fail(mtext['mt-should-range'])
end
if index == 'e' then
local e = numbers[1] and numbers[1].exp
if e then
if arg then
return fail(mtext['mt-cannot-with-e'])
end
arg = e
which = 1
end
end
if arg and arg ~= '' then
arg = arg:gsub(numsep, '')
if numdot ~= '.' then
arg = arg:gsub(numdot, '.')
end
if arg:sub(1, 1) == '(' and arg:sub(-1) == ')' then
result.parens = true
arg = arg:sub(2, -2)
end
local a, b = arg:match('^(.+)[Ee](.+)$')
if a then
if index == 1 then
arg = a
result.exp = b
else
return fail(mtext['mt-cannot-e'])
end
end
local isnegative, propersign, prefix
local minus = '−'
prefix, arg = arg:match('^(.-)([%d.]+)$')
local value = tonumber(arg)
if not value then
return fail()
end
if arg:sub(1, 1) == '.' then
arg = '0' .. arg
end
if prefix == '' then
-- Ignore.
elseif prefix == '±' then
-- Display for first number, ignore for others.
if index == 1 then
propersign = '±'
end
elseif prefix == '+' then
propersign = '+'
elseif prefix == '-' or prefix == minus then
propersign = minus
isnegative = true
else
return fail()
end
result.clean = arg
result.sign = propersign or ''
result.value = isnegative and -value or value
end
numbers[index] = result
return nil -- no error
end
local function get_args(numbers, args)
-- Extract arguments and store the results in numbers.
-- Return nothing (no error) if ok; otherwise, return an error message.
for index = 1, 99 do
local which = index
local arg = args[which] -- has been trimmed
if not arg then
which = 'e'
arg = args[which]
end
local msg = extract_item(which, numbers, arg)
if msg then
return msg
end
if which == 'e' then
break
end
if index > 19 then
return mtext['mt-too-many-parameter']
end
end
if numbers.has_ranges and (#numbers % 2 == 0) then
return mtext['mt-need-number']
end
end
local function get_scale(text, ucode)
-- Return the value of text as a number, or throw an error.
-- This supports extremely basic expressions of the form:
-- a / b
-- a ^ b
-- where a and b are numbers or 'pi'.
local n = tonumber(text)
if n then
return n
end
n = text:gsub('pi', math.pi)
for _, op in ipairs({ '/', '^' }) do
local a, b = n:match('^(.-)' .. op .. '(.*)$')
if a then
a = tonumber(a)
b = tonumber(b)
if a and b then
if op == '/' then
return a / b
elseif op == '^' then
return a ^ b
end
end
break
end
end
error(string.format(mtext['mt-invalid-scale'], ucode, text))
end
local function get_builtin_unit(ucode, definitions)
-- Return table of information for the specified built-in unit, or nil if not known.
-- Each defined unit code must be followed by two spaces (not tab characters).
local _, pos = definitions:find('\n' .. ucode .. ' ', 1, true)
if pos then
local endline = definitions:find('%s*\n', pos)
if endline then
local result = {}
local n = 0
local text = definitions:sub(pos + 1, endline - 1):gsub('%s%s+', '\t')
for item in (text .. '\t'):gmatch('(%S.-)\t') do
if item == 'ALIAS' then
result.alias = true
elseif item == 'ANGLE' then
result.isangle = true
result.nospace = true
elseif item == 'NOSPACE' then
result.nospace = true
elseif item == 'SI' then
result.si = true
else
n = n + 1
if n == 1 then
local link, symbol = item:match('^%[%[([^|]+)|(.+)%]%]$')
if link then
result.symbol = symbol
result.link = link
n = 2
else
result.symbol = item
end
elseif n == 2 then
result.link = item
elseif n == 3 then
result.scale_text = item
result.scale = get_scale(item, ucode)
else
result.more_ignored = item
break
end
end
end
if result.si then
local s = result.symbol
if ucode == 'mc' .. s or ucode == 'mu' .. s then
result.ucode = 'µ' .. s -- unit code for convert should be this
end
end
if n >= 2 or (n >= 1 and result.alias) then
return result
end
-- Ignore invalid definition, treating it as a comment.
end
end
end
local function convert_lookup(ucode, value, scaled_top, want_link, si, options)
local lookup = require(convert_module)._unit
return lookup(ucode, {
value = value,
scaled_top = scaled_top,
link = want_link,
si = si,
sort = options.sortable,
})
end
local function get_unit(ucode, value, scaled_top, options)
local want_link = options.want_link
if scaled_top then
want_link = options.want_per_link
end
local data = mw.loadData(data_module)
local result = options.want_longscale and
get_builtin_unit(ucode, data.builtin_units_long_scale) or
get_builtin_unit(ucode, data.builtin_units)
local si, use_convert
if result then
if result.alias then
ucode = result.symbol
use_convert = true
end
if result.scale then
-- Setting si means convert will use the unit as given, and the sort key
-- will be calculated from the value without any extra scaling that may
-- occur if convert found the unit code. For example, if val defines the
-- unit 'year' with a scale and if si were not set, convert would also apply
-- its own scale because convert knows that a year is 31,557,600 seconds.
si = { result.symbol, result.link }
value = value * result.scale
end
if result.si then
ucode = result.ucode or ucode
si = { result.symbol, result.link }
use_convert = true
end
else
result = {}
use_convert = true
end
local convert_unit = convert_lookup(ucode, value, scaled_top, want_link, si, options)
result.sortkey = convert_unit.sortspan
if use_convert then
result.text = convert_unit.text
result.scaled_top = convert_unit.scaled_value
else
if want_link then
result.text = '[[' .. result.link .. '|' .. result.symbol .. ']]'
else
result.text = result.symbol
end
result.scaled_top = value
end
return result
end
local function makeunit(value, options)
-- Return table of information for the requested unit and options, or
-- return nil if no unit.
options = options or {}
local unit
local ucode = options.u
local percode = options.per
if ucode then
unit = get_unit(ucode, value, nil, options)
elseif percode then
unit = { nospace = true, scaled_top = value }
else
return nil
end
local text = unit.text or ''
local sortkey = unit.sortkey
if percode then
local function bracketed(code, text)
return code:find('[*./]') and '(' .. text .. ')' or text
end
local perunit = get_unit(percode, 1, unit.scaled_top, options)
text = (ucode and bracketed(ucode, text) or '') ..
'/' .. bracketed(percode, perunit.text)
sortkey = perunit.sortkey
end
if not (unit.nospace or options.nospace) then
text = ' ' .. text
end
return { text = text, isangle = unit.isangle, sortkey = sortkey }
end
local function list_units(mode)
-- Return wikitext to list the built-in units.
-- A unit code should not contain wikimarkup so don't bother escaping.
local data = mw.loadData(data_module)
local definitions = data.builtin_units .. data.builtin_units_long_scale
local last_was_blank = true
local n = 0
local result = {}
local function add(line)
if line == '' then
last_was_blank = true
else
if last_was_blank and n > 0 then
n = n + 1
result[n] = ''
end
last_was_blank = false
n = n + 1
result[n] = line
end
end
local si_prefixes = {
-- These are the prefixes recognized by convert; u is accepted for micro.
y = 'y',
z = 'z',
a = 'a',
f = 'f',
p = 'p',
n = 'n',
u = 'µ',
['µ'] = 'µ',
m = 'm',
c = 'c',
d = 'd',
da = 'da',
h = 'h',
k = 'k',
M = 'M',
G = 'G',
T = 'T',
P = 'P',
E = 'E',
Z = 'Z',
Y = 'Y',
}
local function is_valid(ucode, unit)
if unit and not unit.more_ignored then
assert(type(unit.symbol) == 'string' and unit.symbol ~= '')
if unit.alias then
if unit.link or unit.scale_text or unit.si then
return false
end
end
if unit.si then
if unit.scale_text then
return false
end
ucode = unit.ucode or ucode
local base = unit.symbol
if ucode == base then
unit.display = base
return true
end
local plen = #ucode - #base
if plen > 0 then
local prefix = si_prefixes[ucode:sub(1, plen)]
if prefix and ucode:sub(plen + 1) == base then
unit.display = prefix .. base
return true
end
end
else
unit.display = unit.symbol
return true
end
end
return false
end
local lookup = require(convert_module)._unit
local function show_convert(ucode, unit)
-- If a built-in unit defines a scale or sets the SI flag, any unit defined in
-- convert is not used (the scale or SI prefix's scale is used for a sort key).
-- If there is no scale or SI flag, and the unit is not defined in convert,
-- the sort key may not be correct; this allows such units to be identified.
if not (unit.si or unit.scale_text) then
if mode == 'convert' then
unit.show = not lookup(unit.alias and unit.symbol or ucode).unknown
unit.show_text = 'CONVERT'
elseif mode == 'unknown' then
unit.show = lookup(unit.alias and unit.symbol or ucode).unknown
unit.show_text = 'UNKNOWN'
elseif not unit.alias then
-- Show convert's scale in square brackets ('[1]' for an unknown unit).
-- Don't show scale for an alias because it's misleading for temperature
-- and an alias is probably not useful for anything else.
local scale = lookup(ucode, {value=1, sort='on'}).scaled_value
if type(scale) == 'number' then
scale = string.format('%.5g', scale):gsub('e%+?(%-?)0*(%d+)', 'e%1%2')
else
scale = '?'
end
unit.show = true
unit.show_text = '[' .. scale .. ']'
end
end
end
for line in definitions:gmatch('([^\n]*)\n') do
local pos, _ = line:find(' ', 1, true)
if pos then
local ucode = line:sub(1, pos - 1)
local unit = get_builtin_unit(ucode, '\n' .. line .. '\n')
if is_valid(ucode, unit) then
show_convert(ucode, unit)
local flags, text
if unit.alias then
text = unit.symbol
else
text = '[[' .. unit.link .. '|' .. unit.display .. ']]'
end
if unit.isangle then
unit.nospace = nil -- don't show redundant flag
end
for _, f in ipairs({
{ 'alias', 'ALIAS' },
{ 'isangle', 'ANGLE' },
{ 'nospace', 'NOSPACE' },
{ 'si', 'SI' },
{ 'scale_text', unit.scale_text },
{ 'show', unit.show_text },
}) do
if unit[f[1]] then
local t = f[2]
if t:match('^%u+$') then
t = '<small>' .. t .. '</small>'
end
if flags then
flags = flags .. ' ' .. t
else
flags = t
end
end
end
if flags then
text = text .. ' • ' .. flags
end
add(ucode .. ' = ' .. text .. '<br />')
else
add(line .. ' ◆ <b>invalid definition</b><br />')
end
else
add(line)
end
end
return table.concat(result, '\n')
end
local delimit_groups = require('Module:Gapnum').groups
local function delimit(sign, numstr, fmt)
-- Return sign and numstr (unsigned digits or numdot only) after formatting.
-- Four-digit integers are not formatted with gaps.
fmt = (fmt or ''):lower()
if fmt == 'none' or (fmt == '' and #numstr == 4 and numstr:match('^%d+$')) then
return sign .. numstr
end
-- Group number by integer and decimal parts.
-- If there is no decimal part, delimit_groups returns only one table.
local ipart, dpart = delimit_groups(numstr)
local result
if fmt == 'commas' then
result = sign .. table.concat(ipart, numsep)
if dpart then
result = result .. numdot .. table.concat(dpart)
end
else
-- Delimit with a small gap by default.
local groups = {}
groups[1] = table.remove(ipart, 1)
for _, v in ipairs(ipart) do
table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>')
end
if dpart then
table.insert(groups, numdot .. (table.remove(dpart, 1) or ''))
for _, v in ipairs(dpart) do
table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>')
end
end
result = sign .. table.concat(groups)
end
return result
end
local function sup_sub(sup, sub, align)
-- Return the same result as Module:Su except val defaults to align=right.
if align == 'l' or align == 'left' then
align = 'left'
elseif align == 'c' or align == 'center' then
align = 'center'
else
align = 'right'
end
return '<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1.2em;font-size:85%;text-align:' ..
align .. ';">' .. sup .. '<br />' .. sub .. '</span>'
end
local function range_text(items, unit_table, options)
local fmt = options.fmt
local nend = items.nend or ''
if items.isrepeat or unit_table.isangle then
nend = nend .. unit_table.text
end
local text = ''
for i = 1, #items do
if i % 2 == 0 then
text = text .. items[i]
else
text = text .. delimit(items[i].sign, items[i].clean, fmt) .. nend
end
end
return text
end
local function uncertainty_text(uncertainty, unit_table, options)
local angle, text, need_parens
if unit_table.isangle then
angle = unit_table.text
end
local upper = uncertainty.upper or {}
local lower = uncertainty.lower or {}
local uncU = upper.clean
if uncU then
local fmt = options.fmt
local uncL = lower.clean
if uncL then
uncU = delimit('+', uncU, fmt) .. (upper.errend or '')
uncL = delimit('−', uncL, fmt) .. (lower.errend or '')
if angle then
uncU = uncU .. angle
uncL = uncL .. angle
end
text = (angle or '') ..
'<span style="margin-left:0.3em;">' ..
sup_sub(uncU, uncL, options.align) ..
'</span>'
else
if upper.parens then
text = '(' .. uncU .. ')' -- old template did not delimit
else
text = (angle or '') ..
'<span style="margin-left:0.225em;margin-right:0.225em;">±</span>' ..
delimit('', uncU, fmt)
need_parens = true
end
if uncertainty.errend then
text = text .. uncertainty.errend
end
if angle then
text = text .. angle
end
end
else
if angle then
text = angle
end
end
return text, need_parens
end
local function _main(values, unit_spec, options)
if options.sandbox then
data_module = data_module .. '/sandbox'
convert_module = convert_module .. '/sandbox'
end
local action = options.action
if action then
if action == 'list' then
-- Kludge: am using the align parameter (a=xxx) for type of list.
return list_units(options.align)
end
return valerror('invalid action "' .. action .. '".', options.nocat)
end
local number = values.number or (values.numbers and values.numbers[1]) or {}
local e_10 = options.e or {}
local novalue = (number.value == nil and e_10.clean == nil)
local fmt = options.fmt
local want_sort = true
local sortable = options.sortable
if sortable == 'off' or (sortable == nil and novalue) then
want_sort = false
elseif sortable == 'debug' then
-- Same as sortable = 'on' but the sort key is displayed.
else
sortable = 'on'
end
local sort_value = 1
if want_sort then
sort_value = number.value or 1
if e_10.value and sort_value ~= 0 then
-- The 'if' avoids {{val|0|e=1234}} giving an invalid sort_value due to overflow.
sort_value = sort_value * 10^e_10.value
end
end
local unit_table = makeunit(sort_value, {
u = unit_spec.u,
want_link = unit_spec.want_link,
per = unit_spec.per,
want_per_link = unit_spec.want_per_link,
nospace = novalue,
want_longscale = unit_spec.want_longscale,
sortable = sortable,
})
local sortkey
if unit_table then
if want_sort then
sortkey = unit_table.sortkey
end
else
unit_table = { text = '' }
if want_sort then
sortkey = convert_lookup('dummy', sort_value, nil, nil, nil, { sortable = sortable }).sortspan
end
end
local final_unit = unit_table.isangle and '' or unit_table.text
local e_text, n_text, need_parens
local uncertainty = values.uncertainty
if uncertainty then
if number.clean then
n_text = delimit(number.sign, number.clean, fmt) .. (number.nend or '')
local text
text, need_parens = uncertainty_text(uncertainty, unit_table, options)
if text then
n_text = n_text .. text
end
else
n_text = ''
end
else
if values.numbers.isrepeat then
final_unit = ''
end
n_text = range_text(values.numbers, unit_table, options)
need_parens = true
end
if e_10.clean then
if need_parens then
n_text = '(' .. n_text .. ')'
end
e_text = '10<sup>' .. delimit(e_10.sign, e_10.clean, fmt) .. '</sup>'
if number.clean then
e_text = '<span style="margin-left:0.25em;margin-right:0.15em;">×</span>' .. e_text
end
else
e_text = ''
end
local result =
(sortkey or '') ..
(options.prefix or '') ..
n_text ..
e_text ..
final_unit ..
(options.suffix or '')
if result ~= '' then
result = '<span class="nowrap">' .. result .. '</span>'
end
return result .. (options.warning or '')
end
local function check_parameters(args, has_ranges, nocat)
-- Return warning text for the first problem parameter found, or nothing if ok.
local whitelist = {
a = true,
action = true,
debug = true,
e = true,
['end'] = true,
errend = true,
['+errend'] = true,
['-errend'] = true,
fmt = true,
['long scale'] = true,
long_scale = true,
longscale = true,
nocategory = true,
p = true,
s = true,
sortable = true,
u = true,
ul = true,
up = true,
upl = true,
}
for k, v in pairs(args) do
if type(k) == 'string' and not whitelist[k] then
local warning = string.format(mtext['mt-val-not-supported'], k, v)
return valerror(warning, nocat, true)
end
end
if not has_ranges and args[4] then
return valerror(mtext['mt-ignore-parameter4'], nocat, true)
end
end
local function main(frame)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame, {wrappers = { 'Template:Val' }})
local nocat = args.nocategory
local numbers = {} -- table of number tables, perhaps with range text
local msg = get_args(numbers, args)
if msg then
return valerror(msg, nocat)
end
if args.u and args.ul then
return valerror(mtext['mt-both-u-ul'], nocat)
end
if args.up and args.upl then
return valerror(mtext['mt-both-up-upl'], nocat)
end
local values
if numbers.has_ranges then
-- Multiple values with range separators but no uncertainty.
numbers.nend = args['end']
values = {
numbers = numbers,
}
else
-- A single value with optional uncertainty.
local function setfield(i, dst, src)
local v = args[src]
if v then
if numbers[i] then
numbers[i][dst] = v
else
numbers[i] = { [dst] = v }
end
end
end
setfield(1, 'nend', 'end')
setfield(2, 'errend', '+errend')
setfield(3, 'errend', '-errend')
values = {
number = numbers[1],
uncertainty = {
upper = numbers[2],
lower = numbers[3],
errend = args.errend,
}
}
end
local unit_spec = {
u = args.ul or args.u,
want_link = args.ul ~= nil,
per = args.upl or args.up,
want_per_link = args.upl ~= nil,
want_longscale = (args.longscale or args.long_scale or args['long scale']) == 'on',
}
local options = {
action = args.action,
align = args.a,
e = numbers.e,
fmt = args.fmt,
nocat = nocat,
prefix = args.p,
sandbox = string.find(frame:getTitle(), 'sandbox', 1, true) ~= nil,
sortable = args.sortable or (args.debug == 'yes' and 'debug' or nil),
suffix = args.s,
warning = check_parameters(args, numbers.has_ranges, nocat),
}
return _main(values, unit_spec, options)
end
return { main = main, _main = _main }
6a50e544e78223a89c0b012cb5fc6de86419edf8
Module:Val/units
828
719
1102
1101
2025-08-22T00:55:50Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- Definitions for units known to val
-- File format is two strings and a return statement with them in it:
-- string in quotes [=[ ... builtin_units ... ]=].
-- string in quotes [=[ ... builtin_units_long_scale ... ]=].
-- First string, builtin_units, is short-scale, second string is long scale.
-- Entry format:
-- One record per line, starting in first column, having 2-4 fields.
-- Field separator: two or more spaces
-- Between first and second fields: two or more spaces
-- Between all other fields: two or more spaces, or one or more tabs
-- Entries without two spaces in them are ignored.
-- There must be a blank line before the first entry and after the last.
-- I.e. the first two and last two characters of the string must be newlines.
-- Format of entry. Two record types:
--
-- One record type is a wikilink:
-- Unit-code [[ pagename | Symbol-accepts-HTML-only ]]
-- Text-field separator is still two spaces. Two spaces not allowed in wikilink.
--
-- The other record type is all fields:
-- Unit-code symbol-accepts-HTML-only pagename#section-OK
--
-- Plus there is an optional field that goes at the end after two or more spaces.
-- Whether it is a number or an equation or the letters SI,
-- any of these three has the same function: a wikitable sorting "scale".
-- It is for sorting, and it works for either record type.
-- Difference is SI can't accept HTML. But SI correctly scales any SI prefix.
-- (Optional fields ALIAS and NOSPACE and ANGLE are for advanced users.)
-- "Invalid unit" error:
-- Using SI requires that the symbol equal unit-code, so never allows HTML.
-- Any difference between SI or symbol must be an SI prefix, such as k, M, or G.
-- A space at the end of an entry is an error. No space at each EOL.
local builtin_units = [=[
== Test ==
Foo [[Hz|<samp>Foo</samp>]]
Baz [[Hertz|baz<sub>0</sub>]]
Baz [[Kelvins|baz<sub>0</sub>]]
Bar [[Foobar|bar<abbr title="super duper">0</abbr>]]
quux [[Foobar|<span title="super duper 2">bar0</span>]]
== Unsorted units ==
c0 [[Speed of light#Numerical value, notation, and units|''c''<sub>0</sub>]]
lbf [[Pound (force)|<span title="pound-force">lb<sub>F</sub></span>]]
N.s [[Newton-second|N⋅s]]
J.K-1 [[Joule per kelvin|J⋅K<sup>−1</sup>]]
C.mol-1 [[Faraday constant|C⋅mol<sup>−1</sup>]]
C/mol [[Faraday constant|C/mol]]
C.kg-1 [[Roentgen (unit)|C⋅kg<sup>−1</sup>]]
C/kg [[Roentgen (unit)|C/kg]]
F.m-1 [[vacuum permittivity|F⋅m<sup>−1</sup>]]
F/m [[vacuum permittivity|F/m]]
e [[Elementary charge|''e'']]
kB [[Kilobyte|kB]] 8e3
KB [[Kilobyte|KB]] 8e3
MB [[Megabyte|MB]] 8e6
GB [[Gigabyte|GB]] 8e9
TB [[Terabyte|TB]] 8e12
lx [[Lux (unit)|lx]]
nat [[nat (unit)|nat]]
== Time and frequency ==
byte/s [[Data rate units|byte/s]] 8
kB/s [[Data rate units#Kilobyte per second|<span title="Kilobytes per second">kB/s</span>]] 8e3
MB/s [[Data rate units#Megabyte per second|<span title="Megabytes per second">MB/s</span>]] 8e6
GB/s [[Data rate units#Gigabyte per second|<span title="Gigabytes per second">GB/s</span>]] 8e9
TB/s [[Data rate units#Terabyte per second|<span title="Terabytes per second">TB/s</span>]] 8e12
bit/s [[Bit per second|bit/s]] 1
bps [[Bit per second|bit/s]] 1
kbit/s [[Kilobit per second|kbit/s]] 1e3
Mbit/s [[Megabit per second|Mbit/s]] 1e6
Gbit/s [[Gigabit per second|Gbit/s]] 1e9
Tbit/s [[Terabit per second|Tbit/s]] 1e12
kT/s [[Transfer (computing)|<span title="Kilotransfers per second">kT/s</span>]] 1e3
MT/s [[Transfer (computing)|<span title="Megatransfers per second">MT/s</span>]] 1e6
GT/s [[Transfer (computing)|<span title="Gigatransfers per second">GT/s</span>]] 1e9
year [[Year|year]] 31557600
years [[Year|years]] 31557600
yr [[Year#Symbols and abbreviations|yr]] 31557600
y [[Year|y]] 31557600
a [[Annum|a]] 31557600
Ga [[Gigaannum|Ga]] 31557600000000000
Ma [[Megaannum|Ma]] 31557600000000
ka [[Kiloannum|ka]] 31557600000
kyr [[kyr|kyr]] 31557600000
kya [[kyr|kya]] 31557600000
myr [[myr|myr]] 31557600000000
mya [[Mya (unit)|mya]] 31557600000000
byr [[Billion years|byr]] 31557600000000000
bya [[Billion years ago|bya]] 31557600000000000
Gyr [[billion years|Gyr]] 31557600000000000
BP [[Before present|BP]]
uBP [[Radiocarbon dating#Calibration|<sup>14</sup>C yr BP]]
BC [[Before Christ|BC]] -1
AD [[Anno Domini|AD]] 1
BCE [[Before the Common Era|BCE]] -1
CE [[Common Era|CE]] 1
JD [[Julian date|JD]] 1
MJD [[Modified Julian date|MJD]] 1
s-1 [[Second|s<sup>−1</sup>]]
s-2 [[Second|s<sup>−2</sup>]]
s2 [[Second|s<sup>2</sup>]]
s [[Second|s]] SI
as [[Attosecond|s]] SI
cs [[Second|s]] SI
das [[Second|s]] SI
ds [[Second|s]] SI
Es [[Second|s]] SI
fs [[Femtosecond|s]] SI
Gs [[Second|s]] SI
hs [[Second|s]] SI
ks [[Second|s]] SI
ms [[Millisecond|s]] SI
µs [[Microsecond|s]] SI
us [[Microsecond|s]] SI
Ms [[Second|s]] SI
ns [[Nanosecond|s]] SI
ps [[Picosecond|s]] SI
Ps [[Second|s]] SI
Ts [[Second|s]] SI
Ys [[Second|s]] SI
ys [[Yoctosecond|s]] SI
Zs [[Second|s]] SI
zs [[Zeptosecond|s]] SI
Hz [[Hertz|Hz]] SI
aHz [[Hertz|Hz]] SI
cHz [[Hertz|Hz]] SI
daHz [[Hertz|Hz]] SI
dHz [[Hertz|Hz]] SI
EHz [[Hertz|Hz]] SI
fHz [[Hertz|Hz]] SI
hHz [[Hertz|Hz]] SI
GHz [[Gigahertz|Hz]] SI
kHz [[Kilohertz|Hz]] SI
MHz [[Megahertz|Hz]] SI
mHz [[Hertz|Hz]] SI
uHz [[Hertz|Hz]] SI
µHz [[Hertz|Hz]] SI
nHz [[Hertz|Hz]] SI
pHz [[Hertz|Hz]] SI
PHz [[Hertz|Hz]] SI
THz [[Hertz|Hz]] SI
yHz [[Hertz|Hz]] SI
YHz [[Hertz|Hz]] SI
zHz [[Hertz|Hz]] SI
ZHz [[Hertz|Hz]] SI
ips [[Inch per second|ips]]
== Length, area, volume ==
Å3 [[Ångström|Å<sup>3</sup>]]
fb-1 [[Barn (unit)#Inverse femtobarn|fb<sup>−1</sup>]]
m-1 [[Metre|m<sup>−1</sup>]]
m-2 [[Square metre|m<sup>−2</sup>]]
m-3 [[Cubic metre|m<sup>−3</sup>]]
km2 [[Square kilometre|km<sup>2</sup>]]
km3 [[Cubic kilometre|km<sup>3</sup>]]
µm2 [[Square metre|µm<sup>2</sup>]]
um2 [[Square metre|µm<sup>2</sup>]]
am2 [[Square metre|am<sup>2</sup>]]
cm2 [[Square centimetre|cm<sup>2</sup>]]
dam2 [[Square metre|dam<sup>2</sup>]]
dm2 [[Square metre|dm<sup>2</sup>]]
Em2 [[Square metre|Em<sup>2</sup>]]
fm2 [[Square metre|fm<sup>2</sup>]]
Gm2 [[Square metre|Gm<sup>2</sup>]]
hm2 [[Square metre|hm<sup>2</sup>]]
mm2 [[Square metre|mm<sup>2</sup>]]
Mm2 [[Square metre|Mm<sup>2</sup>]]
nm2 [[Square metre|nm<sup>2</sup>]]
pm2 [[Square metre|pm<sup>2</sup>]]
Pm2 [[Square metre|Pm<sup>2</sup>]]
Tm2 [[Square metre|Tm<sup>2</sup>]]
ym2 [[Square metre|ym<sup>2</sup>]]
Ym2 [[Square metre|Ym<sup>2</sup>]]
zm2 [[Square metre|zm<sup>2</sup>]]
Zm2 [[Square metre|Zm<sup>2</sup>]]
gal [[Gallon|gal]]
Gal [[Gal (unit)|Gal]]
uGal [[Gal (unit)|µGal]]
µGal [[Gal (unit)|µGal]]
mGal [[Gal (unit)|mGal]]
b [[Barn (unit)|b]] SI
ab [[Barn (unit)|b]] SI
cb [[Barn (unit)|b]] SI
dab [[Barn (unit)|b]] SI
db [[Barn (unit)|b]] SI
Eb [[Barn (unit)|b]] SI
fb [[Barn (unit)|b]] SI
Gb [[Barn (unit)|b]] SI
hb [[Barn (unit)|b]] SI
kb [[Barn (unit)|b]] SI
mb [[Barn (unit)|b]] SI
µb [[Barn (unit)|b]] SI
ub [[Barn (unit)|b]] SI
Mb [[Barn (unit)|b]] SI
nb [[Barn (unit)|b]] SI
pb [[Barn (unit)|b]] SI
Pb [[Barn (unit)|b]] SI
Tb [[Barn (unit)|b]] SI
Yb [[Barn (unit)|b]] SI
yb [[Barn (unit)|b]] SI
Zb [[Barn (unit)|b]] SI
zb [[Barn (unit)|b]] SI
== Velocity and acceleration ==
m.s-2 [[Metre per second squared|m⋅s<sup>−2</sup>]]
m/s2 [[Metre per second squared|m/s<sup>2</sup>]]
m.s-1 [[Metre per second|m⋅s<sup>−1</sup>]]
m/s [[Metre per second|m/s]]
km.s-1 [[Metre per second|km⋅s<sup>−1</sup>]]
km/s [[Metre per second|km/s]]
== Mass and energy ==
lbm [[Pound (mass)|<span title="pound-mass">lb<sub>m</sub></span>]]
uJ [[Joule|µJ]]
J.s [[Joule-second|J⋅s]]
kWh [[Kilowatt hour|kWh]]
kW.h [[Kilowatt hour|kW⋅h]]
J/C [[Volt|J/C]]
J/kg [[Joule|J/kg]]
Da [[Dalton (unit)|Da]] SI
EDa [[Dalton (unit)|Da]] SI
PDa [[Dalton (unit)|Da]] SI
TDa [[Dalton (unit)|Da]] SI
GDa [[Dalton (unit)|Da]] SI
MDa [[Dalton (unit)|Da]] SI
kDa [[Dalton (unit)|Da]] SI
mDa [[Dalton (unit)|Da]] SI
uDa [[Dalton (unit)|Da]] SI
μDa [[Dalton (unit)|Da]] SI
nDa [[Dalton (unit)|Da]] SI
pDa [[Dalton (unit)|Da]] SI
fDa [[Dalton (unit)|Da]] SI
aDa [[Dalton (unit)|Da]] SI
g [[Gram|g]] SI
ag [[Attogram|g]] SI
cg [[Centigram|g]] SI
dag [[Gram|g]] SI
dg [[Decigram|g]] SI
Eg [[Exagram|g]] SI
fg [[Femtogram|g]] SI
Gg [[Gigagram|g]] SI
hg [[Kilogram#SI multiples|g]] SI
kg [[Kilogram|g]] SI
mcg [[Microgram|g]] SI
Mg [[Megagram|g]] SI
mg [[Milligram|g]] SI
ug [[Microgram|g]] SI
µg [[Microgram|g]] SI
ng [[Nanogram|g]] SI
Pg [[Petagram|g]] SI
pg [[Picogram|g]] SI
Tg [[Tonne|g]] SI
yg [[Yoctogram|g]] SI
Yg [[Yottagram|g]] SI
zg [[Zeptogram|g]] SI
Zg [[Zettagram|g]] SI
== Pressure and density ==
psi [[Pounds per square inch|psi]]
g.cm-3 [[Gram per cubic centimetre|g⋅cm<sup>−3</sup>]]
g/cm3 [[Gram per cubic centimetre|g/cm<sup>3</sup>]]
kg.m-3 [[Kilogram per cubic metre|kg⋅m<sup>−3</sup>]]
kg/m3 [[Kilogram per cubic metre|kg/m<sup>3</sup>]]
kg/cm3 [[Density#Formula and common units|kg/cm<sup>3</sup>]]
g/L [[Gram per litre|g/L]]
g/l [[Gram per litre|g/l]]
mcg/dL [[Gram per litre|µg/dL]]
mcg/dl [[Gram per litre|µg/dl]]
mg/mL [[Gram per litre|mg/mL]]
mg/ml [[Gram per litre|mg/ml]]
ug/dL [[Gram per litre|µg/dL]]
ug/dl [[Gram per litre|µg/dl]]
μg/dL [[Gram per litre|μg/dL]]
μg/dl [[Gram per litre|μg/dl]]
mg.L-1 [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]]
mg/L [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]]
mg.l-1 [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]]
mg/l [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]]
== Fracture toughness ==
MPa.m.5 [[Fracture toughness|MPa⋅m<sup>1/2</sup>]]
kPa.m.5 [[Fracture toughness|kPa⋅m<sup>1/2</sup>]]
Pa.m.5 [[Fracture toughness|Pa⋅m<sup>1/2</sup>]]
== Temperature ==
degC °C ALIAS
degF °F ALIAS
degR °R ALIAS
K [[Kelvin|K]] SI
YK [[Yottakelvin|K]] SI
ZK [[Zettakelvin|K]] SI
EK [[Kelvin|K]] SI
PK [[Petakelvin|K]] SI
TK [[Terakelvin|K]] SI
GK [[Gigakelvin|K]] SI
MK [[Megakelvin|K]] SI
kK [[Kilokelvin|K]] SI
hK [[Hectokelvin|K]] SI
daK [[Decakelvin|K]] SI
dK [[Decikelvin|K]] SI
cK [[Centikelvin|K]] SI
mK [[Millikelvin|K]] SI
µK [[Microkelvin|K]] SI
uK [[Microkelvin|K]] SI
nK [[Nanokelvin|K]] SI
pK [[Picokelvin|K]] SI
fK [[Femtokelvin|K]] SI
aK [[Attokelvin|K]] SI
zK [[Zeptokelvin|K]] SI
yK [[Yoctokelvin|K]] SI
== Electromagnetism ==
Wb [[Weber (unit)|Wb]]
N.A-2 [[Permeability (electromagnetism)|N⋅A<sup>−2</sup>]]
H.m-1 [[Permeability (electromagnetism)|H⋅m<sup>−1</sup>]]
V.m-1 [[Electric field|V⋅m<sup>−1</sup>]]
V/m [[Electric field|V/m]]
C [[Coulomb|C]] SI
YC [[Coulomb|C]] SI
ZC [[Coulomb|C]] SI
EC [[Coulomb|C]] SI
PC [[Coulomb|C]] SI
TC [[Coulomb|C]] SI
GC [[Coulomb|C]] SI
MC [[Coulomb|C]] SI
kC [[Coulomb|C]] SI
hC [[Coulomb|C]] SI
daC [[Coulomb|C]] SI
dC [[Coulomb|C]] SI
cC [[Coulomb|C]] SI
mC [[Coulomb|C]] SI
µC [[Coulomb|C]] SI
uC [[Coulomb|C]] SI
nC [[Coulomb|C]] SI
pC [[Coulomb|C]] SI
fC [[Coulomb|C]] SI
aC [[Coulomb|C]] SI
zC [[Coulomb|C]] SI
yC [[Coulomb|C]] SI
F [[Farad|F]] SI
YF [[Farad|F]] SI
ZF [[Farad|F]] SI
EF [[Farad|F]] SI
PF [[Farad|F]] SI
TF [[Farad|F]] SI
GF [[Farad|F]] SI
MF [[Farad|F]] SI
kF [[Farad|F]] SI
hF [[Farad|F]] SI
daF [[Farad|F]] SI
dF [[Farad|F]] SI
cF [[Farad|F]] SI
mF [[Farad|F]] SI
µF [[Farad|F]] SI
uF [[Farad|F]] SI
nF [[Farad|F]] SI
pF [[Farad|F]] SI
fF [[Farad|F]] SI
aF [[Farad|F]] SI
zF [[Farad|F]] SI
yF [[Farad|F]] SI
H [[Henry (unit)|H]] SI
YH [[Henry (unit)|H]] SI
ZH [[Henry (unit)|H]] SI
EH [[Henry (unit)|H]] SI
PH [[Henry (unit)|H]] SI
TH [[Henry (unit)|H]] SI
GH [[Henry (unit)|H]] SI
MH [[Henry (unit)|H]] SI
kH [[Henry (unit)|H]] SI
hH [[Henry (unit)|H]] SI
daH [[Henry (unit)|H]] SI
dH [[Henry (unit)|H]] SI
cH [[Henry (unit)|H]] SI
mH [[Henry (unit)|H]] SI
µH [[Henry (unit)|H]] SI
uH [[Henry (unit)|H]] SI
nH [[Henry (unit)|H]] SI
pH [[Henry (unit)|H]] SI
fH [[Henry (unit)|H]] SI
aH [[Henry (unit)|H]] SI
zH [[Henry (unit)|H]] SI
yH [[Henry (unit)|H]] SI
A [[Ampere|A]] SI
YA [[Ampere|A]] SI
ZA [[Ampere|A]] SI
EA [[Ampere|A]] SI
PA [[Ampere|A]] SI
TA [[Ampere|A]] SI
GA [[Ampere|A]] SI
MA [[Ampere|A]] SI
kA [[Ampere|A]] SI
hA [[Ampere|A]] SI
daA [[Ampere|A]] SI
dA [[Ampere|A]] SI
cA [[Ampere|A]] SI
mA [[Ampere|A]] SI
µA [[Ampere|A]] SI
uA [[Ampere|A]] SI
nA [[Ampere|A]] SI
pA [[Ampere|A]] SI
fA [[Ampere|A]] SI
aA [[Ampere|A]] SI
zA [[Ampere|A]] SI
yA [[Ampere|A]] SI
V [[Volt|V]] SI
YV [[Volt|V]] SI
ZV [[Volt|V]] SI
EV [[Volt|V]] SI
PV [[Volt|V]] SI
TV [[Volt|V]] SI
GV [[Volt|V]] SI
MV [[Volt|V]] SI
kV [[Volt|V]] SI
hV [[Volt|V]] SI
daV [[Volt|V]] SI
dV [[Volt|V]] SI
cV [[Volt|V]] SI
mV [[Volt|V]] SI
µV [[Volt|V]] SI
uV [[Volt|V]] SI
nV [[Volt|V]] SI
pV [[Volt|V]] SI
fV [[Volt|V]] SI
aV [[Volt|V]] SI
zV [[Volt|V]] SI
yV [[Volt|V]] SI
VA [[Volt-ampere|VA]] SI
YVA [[Volt-ampere|VA]] SI
ZVA [[Volt-ampere|VA]] SI
EVA [[Volt-ampere|VA]] SI
PVA [[Volt-ampere|VA]] SI
TVA [[Volt-ampere|VA]] SI
GVA [[Volt-ampere|VA]] SI
MVA [[Volt-ampere|VA]] SI
kVA [[Volt-ampere|VA]] SI
hVA [[Volt-ampere|VA]] SI
daVA [[Volt-ampere|VA]] SI
dVA [[Volt-ampere|VA]] SI
cVA [[Volt-ampere|VA]] SI
mVA [[Volt-ampere|VA]] SI
µVA [[Volt-ampere|VA]] SI
uVA [[Volt-ampere|VA]] SI
nVA [[Volt-ampere|VA]] SI
pVA [[Volt-ampere|VA]] SI
fVA [[Volt-ampere|VA]] SI
aVA [[Volt-ampere|VA]] SI
zVA [[Volt-ampere|VA]] SI
yVA [[Volt-ampere|VA]] SI
Ω [[Ohm|Ω]] SI
YΩ.m [[Electrical resistivity and conductivity#Definition|YΩ⋅m]] 1e24
ZΩ.m [[Electrical resistivity and conductivity#Definition|ZΩ⋅m]] 1e21
EΩ.m [[Electrical resistivity and conductivity#Definition|EΩ⋅m]] 1e18
PΩ.m [[Electrical resistivity and conductivity#Definition|PΩ⋅m]] 1e15
TΩ.m [[Electrical resistivity and conductivity#Definition|TΩ⋅m]] 1e12
GΩ.m [[Electrical resistivity and conductivity#Definition|GΩ⋅m]] 1e9
MΩ.m [[Electrical resistivity and conductivity#Definition|MΩ⋅m]] 1e6
kΩ.m [[Electrical resistivity and conductivity#Definition|kΩ⋅m]] 1e3
Ω.m [[Electrical resistivity and conductivity#Definition|Ω⋅m]] 1
mΩ.m [[Electrical resistivity and conductivity#Definition|mΩ⋅m]] 1e-3
µΩ.m [[Electrical resistivity and conductivity#Definition|µΩ⋅m]] 1e-6
uΩ.m [[Electrical resistivity and conductivity#Definition|µΩ⋅m]] 1e-6
nΩ.m [[Electrical resistivity and conductivity#Definition|nΩ⋅m]] 1e-9
pΩ.m [[Electrical resistivity and conductivity#Definition|pΩ⋅m]] 1e-12
fΩ.m [[Electrical resistivity and conductivity#Definition|fΩ⋅m]] 1e-15
aΩ.m [[Electrical resistivity and conductivity#Definition|aΩ⋅m]] 1e-18
zΩ.m [[Electrical resistivity and conductivity#Definition|zΩ⋅m]] 1e-21
yΩ.m [[Electrical resistivity and conductivity#Definition|yΩ⋅m]] 1e-24
R [[Rayleigh (unit)|R]] SI
G [[Gauss (unit)|G]] SI
aG [[Attogauss|G]] SI
cG [[Centigauss|G]] SI
daG [[Decagauss|G]] SI
dG [[Decigauss|G]] SI
EG [[Exagauss|G]] SI
fG [[Femtogauss|G]] SI
GG [[Gigagauss|G]] SI
hG [[Hectogauss|G]] SI
kG [[Kilogauss|G]] SI
MG [[Megagauss|G]] SI
mG [[Milligauss|G]] SI
uG [[Microgauss|G]] SI
µG [[Microgauss|G]] SI
nG [[Nanogauss|G]] SI
PG [[Petagauss|G]] SI
pG [[Picogauss|G]] SI
TG [[Teragauss|G]] SI
yG [[Yoctogauss|G]] SI
YG [[Yottagauss|G]] SI
zG [[Zeptogauss|G]] SI
ZG [[Zettagauss|G]] SI
T [[Tesla (unit)|T]] SI
aT [[Attotesla|T]] SI
cT [[Centitesla|T]] SI
daT [[Decatesla|T]] SI
dT [[Decitesla|T]] SI
ET [[Exatesla|T]] SI
fT [[Femtotesla|T]] SI
GT [[Gigatesla|T]] SI
hT [[Hectotesla|T]] SI
kT [[Kilotesla|T]] SI
MT [[Megatesla|T]] SI
mT [[Millitesla|T]] SI
uT [[Microtesla|T]] SI
µT [[Microtesla|T]] SI
nT [[Nanotesla|T]] SI
PT [[Petatesla|T]] SI
pT [[Picotesla|T]] SI
TT [[Teratesla|T]] SI
yT [[Yoctotesla|T]] SI
YT [[Yottatesla|T]] SI
zT [[Zeptotesla|T]] SI
ZT [[Zettatesla|T]] SI
== Astrophysics ==
au [[Astronomical unit|au]]
c [[Speed of light|''c'']]
ly [[Light-year|ly]]
Earth mass [[Earth mass|''M''<sub>🜨</sub>]]
Earth radius [[Earth radius|''R''<sub>🜨</sub>]]
M_Earth [[Earth mass|''M''<sub>🜨</sub>]]
R_Earth [[Earth radius|''R''<sub>🜨</sub>]]
M+ [[Earth mass|''M''<sub>🜨</sub>]]
R+ [[Earth radius|''R''<sub>🜨</sub>]]
Jupiter mass [[Jupiter mass|''M''<sub>J</sub>]]
Jupiter radius [[Jupiter radius|''R''<sub>J</sub>]]
Jy [[Jansky|Jy]]
M_Jupiter [[Jupiter mass|''M''<sub>J</sub>]]
R_Jupiter [[Jupiter radius|''R''<sub>J</sub>]]
Solar mass [[Solar mass|''M''<sub>☉</sub>]]
solar mass [[Solar mass|''M''<sub>☉</sub>]]
M_Solar [[Solar mass|''M''<sub>☉</sub>]]
M_solar [[Solar mass|''M''<sub>☉</sub>]]
R_Solar [[Solar radius|''R''<sub>☉</sub>]]
R_solar [[Solar radius|''R''<sub>☉</sub>]]
Solar radius [[Solar radius|''R''<sub>☉</sub>]]
solar radius [[Solar radius|''R''<sub>☉</sub>]]
Solar luminosity [[Solar luminosity|''L''<sub>☉</sub>]]
solar luminosity [[Solar luminosity|''L''<sub>☉</sub>]]
L_solar [[Solar luminosity|''L''<sub>☉</sub>]]
L_Solar [[Solar luminosity|''L''<sub>☉</sub>]]
Lo [[Solar luminosity|''L''<sub>☉</sub>]]
pc2 [[Parsec|pc<sup>2</sup>]]
pc3 [[Parsec|pc<sup>3</sup>]]
kpc2 [[Parsec#Parsecs and kiloparsecs|kpc<sup>2</sup>]]
kpc3 [[Parsec#Parsecs and kiloparsecs|kpc<sup>3</sup>]]
kpc [[Parsec#Parsecs and kiloparsecs|kpc]]
Mpc2 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>2</sup>]]
Mpc3 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>3</sup>]]
Mpc [[Parsec#Megaparsecs and gigaparsecs|Mpc]]
Gpc2 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>2</sup>]]
Gpc3 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>3</sup>]]
Gpc [[Parsec#Megaparsecs and gigaparsecs|Gpc]]
== Nuclear physics and chemistry ==
cm-1 [[Wavenumber|cm<sup>−1</sup>]]
u [[Unified atomic mass unit|u]]
osmol [[Osmole (unit)|osmol]]
Osm [[Osmole (unit)|Osm]]
M [[Molarity|M]]
TM [[Molarity|M]] SI
GM [[Molarity|M]] SI
MM [[Molarity|M]] SI
kM [[Molarity|M]] SI
hM [[Molarity|M]] SI
daM [[Molarity|M]] SI
dM [[Molarity|M]] SI
cM [[Molarity|M]] SI
mM [[Molarity|M]] SI
uM [[Molarity|M]] 1e-6
nM [[Molarity|M]] SI
pM [[Molarity|M]] SI
kg.mol-1 [[Molar mass|kg⋅mol<sup>−1</sup>]]
kg/mol [[Molar mass|kg/mol]]
g.mol-1 [[Molar mass|g⋅mol<sup>−1</sup>]]
g/mol [[Molar mass|g/mol]]
eV/c2 [[Electronvolt#Mass|eV/''c''<sup>2</sup>]]
keV/c2 [[Electronvolt#Mass|keV/''c''<sup>2</sup>]]
MeV/c2 [[Electronvolt#Mass|MeV/''c''<sup>2</sup>]]
GeV/c2 [[Electronvolt#Mass|GeV/''c''<sup>2</sup>]]
TeV/c2 [[Electronvolt#Mass|TeV/''c''<sup>2</sup>]]
eV [[Electronvolt|eV]]
meV [[Electronvolt|meV]]
keV [[Electronvolt|keV]]
MeV [[Electronvolt|MeV]]
GeV [[Electronvolt|GeV]]
TeV [[Electronvolt|TeV]]
mol-1 [[Avogadro constant|mol<sup>−1</sup>]]
J.mol-1 [[Joule per mole|J⋅mol<sup>−1</sup>]]
J/mol [[Joule per mole|J/mol]]
kJ.mol-1 [[Joule per mole|kJ⋅mol<sup>−1</sup>]]
kJ/mol [[Joule per mole|kJ/mol]]
MJ.mol-1 [[Joule per mole|MJ⋅mol<sup>−1</sup>]]
MJ/mol [[Joule per mole|MJ/mol]]
GJ.mol-1 [[Joule per mole|GJ⋅mol<sup>−1</sup>]]
GJ/mol [[Joule per mole|GJ/mol]]
TJ.mol-1 [[Joule per mole|TJ⋅mol<sup>−1</sup>]]
TJ/mol [[Joule per mole|TJ/mol]]
μB [[Bohr magneton|''μ''<sub>B</sub>]]
== Numbers and phrases ==
pp [[Page (paper)|pp]]
ppb [[Parts per billion|ppb]] 1e-9
ppm [[Parts per million|ppm]] 1e-6
billiard [[Orders of magnitude (numbers)#1015|billiard]] 1e15
billion [[1,000,000,000|billion]] 1e9
billionth [[1,000,000,000|billionth]] 1e-9
billionths [[1,000,000,000|billionths]] 1e-9
decilliard [[Orders of magnitude (numbers)#1063|decilliard]] 1e63
decillion [[Orders of magnitude (numbers)#1033|decillion]] 1e33
decillionth [[Orders of magnitude (numbers)#1033|decillionth]] 1e-33
decillionths [[Orders of magnitude (numbers)#1033|decillionths]] 1e-33
milliard [[1,000,000,000|milliard]] 1e9
million [[Million|million]] 1e6
millionth [[Million|millionth]] 1e-6
millionths [[Million|millionths]] 1e-6
nonilliard [[Orders of magnitude (numbers)#1057|nonilliard]] 1e57
nonillion [[Orders of magnitude (numbers)#1030|nonillion]] 1e30
nonillionth [[Orders of magnitude (numbers)#1030|nonillionth]] 1e-30
nonillionths [[Orders of magnitude (numbers)#1030|nonillionths]] 1e-30
octilliard [[Orders of magnitude (numbers)#1051|octilliard]] 1e51
octillion [[Orders of magnitude (numbers)#1027|octillion]] 1e27
octillionth [[Orders of magnitude (numbers)#1027|octillionth]] 1e-27
octillionths [[Orders of magnitude (numbers)#1027|octillionths]] 1e-27
quadrilliard [[Orders of magnitude (numbers)#1027|quadrilliard]] 1e27
quadrillion [[Orders of magnitude (numbers)#1015|quadrillion]] 1e15
quadrillionth [[Orders of magnitude (numbers)#1015|quadrillionth]] 1e-15
quadrillionths [[Orders of magnitude (numbers)#1015|quadrillionths]] 1e-15
quintilliard [[Orders of magnitude (numbers)#1033|quintilliard]] 1e33
quintillion [[Orders of magnitude (numbers)#1018|quintillion]] 1e18
quintillionth [[Orders of magnitude (numbers)#1018|quintillionth]] 1e-18
quintillionths [[Orders of magnitude (numbers)#1018|quintillionths]] 1e-18
septilliard [[Orders of magnitude (numbers)#1045|septilliard]] 1e45
septillion [[Orders of magnitude (numbers)#1024|septillion]] 1e24
septillionth [[Orders of magnitude (numbers)#1024|septillionth]] 1e-24
septillionths [[Orders of magnitude (numbers)#1024|septillionths]] 1e-24
sextilliard [[Orders of magnitude (numbers)#1039|sextilliard]] 1e39
sextillion [[Orders of magnitude (numbers)#1021|sextillion]] 1e21
sextillionth [[Orders of magnitude (numbers)#1021|sextillionth]] 1e-21
sextillionths [[Orders of magnitude (numbers)#1021|sextillionths]] 1e-21
trilliard [[Orders of magnitude (numbers)#1021|trilliard]] 1e21
trillion [[Orders of magnitude (numbers)#1012|trillion]] 1e12
trillionth [[Orders of magnitude (numbers)#1012|trillionth]] 1e-12
trillionths [[Orders of magnitude (numbers)#1012|trillionths]] 1e-12
== Angles ==
% % Percent ANGLE 0.01
percent % Percent ANGLE 0.01
per cent % Percent ANGLE 0.01
‰ ‰ Per mil ANGLE 1e-3
per mil ‰ Per mil ANGLE 1e-3
per mill ‰ Per mil ANGLE 1e-3
per mille ‰ Per mil ANGLE 1e-3
permil ‰ Per mil ANGLE 1e-3
permill ‰ Per mil ANGLE 1e-3
permille ‰ Per mil ANGLE 1e-3
° ° Degree (angle) ANGLE pi/180
deg ° Degree (angle) ANGLE pi/180
degree ° Degree (angle) NOSPACE pi/180 -- for a degree symbol that does not repeat
' ′ Minute of arc ANGLE pi/10800
′ ′ Minute of arc ANGLE pi/10800
arcmin ′ Minute of arc ANGLE pi/10800
arcminute ′ Minute of arc ANGLE pi/10800
" ″ Second of arc ANGLE pi/648000
″ ″ Second of arc ANGLE pi/648000
arcsec ″ Second of arc ANGLE pi/648000
arcsecond ″ Second of arc ANGLE pi/648000
mas [[Milliarcsecond|mas]] pi/648000000
]=]
-- If val has "|long scale=on" the following definitions are used
-- (then, if not found here, the normal definitions are used).
-- Unit code [[Link|Symbol]] Flags/Scale
local builtin_units_long_scale = [=[
== Long scale numbers and phrases ==
billion [[Orders of magnitude (numbers)#1012|billion]] 1e12
billionth [[Orders of magnitude (numbers)#1012|billionth]] 1e-12
billionths [[Orders of magnitude (numbers)#1012|billionths]] 1e-12
decillion [[Orders of magnitude (numbers)#1060|decillion]] 1e60
decillionth [[Orders of magnitude (numbers)#1060|decillionth]] 1e-60
decillionths [[Orders of magnitude (numbers)#1060|decillionths]] 1e-60
nonillion [[Orders of magnitude (numbers)#1054|nonillion]] 1e54
nonillionth [[Orders of magnitude (numbers)#1054|nonillionth]] 1e-54
nonillionths [[Orders of magnitude (numbers)#1054|nonillionths]] 1e-54
octillion [[Orders of magnitude (numbers)#1048|octillion]] 1e48
octillionth [[Orders of magnitude (numbers)#1048|octillionth]] 1e-48
octillionths [[Orders of magnitude (numbers)#1048|octillionths]] 1e-48
quadrillion [[Orders of magnitude (numbers)#1024|quadrillion]] 1e24
quadrillionth [[Orders of magnitude (numbers)#1024|quadrillionth]] 1e-24
quadrillionths [[Orders of magnitude (numbers)#1024|quadrillionths]] 1e-24
quintillion [[Orders of magnitude (numbers)#1030|quintillion]] 1e30
quintillionth [[Orders of magnitude (numbers)#1030|quintillionth]] 1e-30
quintillionths [[Orders of magnitude (numbers)#1030|quintillionths]] 1e-30
septillion [[Orders of magnitude (numbers)#1042|septillion]] 1e42
septillionth [[Orders of magnitude (numbers)#1042|septillionth]] 1e-42
septillionths [[Orders of magnitude (numbers)#1042|septillionths]] 1e-42
sextillion [[Orders of magnitude (numbers)#1036|sextillion]] 1e36
sextillionth [[Orders of magnitude (numbers)#1036|sextillionth]] 1e-36
sextillionths [[Orders of magnitude (numbers)#1036|sextillionths]] 1e-36
trillion [[Orders of magnitude (numbers)#1018|trillion]] 1e18
trillionth [[Orders of magnitude (numbers)#1018|trillionth]] 1e-18
trillionths [[Orders of magnitude (numbers)#1018|trillionths]] 1e-18
]=]
return { builtin_units = builtin_units, builtin_units_long_scale = builtin_units_long_scale }
2307ae0d1410328f2d5ace7ab494855c5cb9c9e9
Module:Convert
828
720
1104
1103
2025-08-22T00:55:50Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- Convert a value from one unit of measurement to another.
-- Example: {{convert|123|lb|kg}} --> 123 pounds (56 kg)
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
local MINUS = '−' -- Unicode U+2212 MINUS SIGN (UTF-8: e2 88 92)
local abs = math.abs
local floor = math.floor
local format = string.format
local log10 = math.log10
local ustring = mw.ustring
local ulen = ustring.len
local usub = ustring.sub
-- Configuration options to keep magic values in one location.
-- Conversion data and message text are defined in separate modules.
local config, maxsigfig
local numdot -- must be '.' or ',' or a character which works in a regex
local numsep, numsep_remove, numsep_remove2
local data_code, all_units
local text_code
local varname -- can be a code to use variable names that depend on value
local from_en_table -- to translate an output string of en digits to local language
local to_en_table -- to translate an input string of digits in local language to en
-- Use translation_table in convert/text to change the following.
local en_default -- true uses lang=en unless convert has lang=local or local digits
local group_method = 3 -- code for how many digits are in a group
local per_word = 'per' -- for units like "liters per kilometer"
local plural_suffix = 's' -- only other useful value is probably '' to disable plural unit names
local omitsep -- true to omit separator before local symbol/name
-- All units should be defined in the data module. However, to cater for quick changes
-- and experiments, any unknown unit is looked up in an extra data module, if it exists.
-- That module would be transcluded in only a small number of pages, so there should be
-- little server overhead from making changes, and changes should propagate quickly.
local extra_module -- name of module with extra units
local extra_units -- nil or table of extra units from extra_module
-- Some options in the invoking template can set variables used later in the module.
local currency_text -- for a user-defined currency symbol: {{convert|12|$/ha|$=€}} (euro replaces dollar)
local function from_en(text)
-- Input is a string representing a number in en digits with '.' decimal mark,
-- without digit grouping (which is done just after calling this).
-- Return the translation of the string with numdot and digits in local language.
if numdot ~= '.' then
text = text:gsub('%.', numdot)
end
if from_en_table then
text = text:gsub('%d', from_en_table)
end
return text
end
local function to_en(text)
-- Input is a string representing a number in the local language with
-- an optional numdot decimal mark and numsep digit grouping.
-- Return the translation of the string with '.' mark and en digits,
-- and no separators (they have to be removed here to handle cases like
-- numsep = '.' and numdot = ',' with input "1.234.567,8").
if to_en_table then
text = ustring.gsub(text, '%d', to_en_table)
end
if numsep_remove then
text = text:gsub(numsep_remove, '')
end
if numsep_remove2 then
text = text:gsub(numsep_remove2, '')
end
if numdot ~= '.' then
text = text:gsub(numdot, '.')
end
return text
end
local function decimal_mark(text)
-- Return ',' if text probably is using comma for decimal mark, or has no decimal mark.
-- Return '.' if text probably is using dot for decimal mark.
-- Otherwise return nothing (decimal mark not known).
if not text:find('[.,]') then return ',' end
text = text:gsub('^%-', ''):gsub('%+%d+/%d+$', ''):gsub('[Ee]%-?%d+$', '')
local decimal =
text:match('^0?([.,])%d+$') or
text:match('%d([.,])%d?%d?$') or
text:match('%d([.,])%d%d%d%d+$')
if decimal then return decimal end
if text:match('%.%d+%.') then return ',' end
if text:match('%,%d+,') then return '.' end
end
local add_warning, with_separator -- forward declarations
local function to_en_with_check(text, parms)
-- Version of to_en() for a wiki using numdot = ',' and numsep = '.' to check
-- text (an input number as a string) which might have been copied from enwiki.
-- For example, in '1.234' the '.' could be a decimal mark or a group separator.
-- From viwiki.
if to_en_table then
text = ustring.gsub(text, '%d', to_en_table)
end
if decimal_mark(text) == '.' then
local original = text
text = text:gsub(',', '') -- for example, interpret "1,234.5" as an enwiki value
if parms then
add_warning(parms, 0, 'cvt_enwiki_num', original, with_separator({}, text))
end
else
if numsep_remove then
text = text:gsub(numsep_remove, '')
end
if numsep_remove2 then
text = text:gsub(numsep_remove2, '')
end
if numdot ~= '.' then
text = text:gsub(numdot, '.')
end
end
return text
end
local function omit_separator(id)
-- Return true if there should be no separator before id (a unit symbol or name).
-- For zhwiki, there should be no separator if id uses local characters.
-- The following kludge should be a sufficient test.
if omitsep then
if id:sub(1, 2) == '-{' then -- for "-{...}-" content language variant
return true
end
if id:byte() > 127 then
local first = usub(id, 1, 1)
if first ~= 'Å' and first ~= '°' and first ~= 'µ' then
return true
end
end
end
return id:sub(1, 1) == '/' -- no separator before units like "/ha"
end
local spell_module -- name of module that can spell numbers
local speller -- function from that module to handle spelling (set if needed)
local wikidata_module, wikidata_data_module -- names of Wikidata modules
local wikidata_code, wikidata_data -- exported tables from those modules (set if needed)
local function set_config(args)
-- Set configuration options from template #invoke or defaults.
config = args
maxsigfig = config.maxsigfig or 14 -- maximum number of significant figures
local data_module, text_module
local sandbox = config.sandbox and ('/' .. config.sandbox) or ''
data_module = "Module:Convert/data" .. sandbox
text_module = "Module:Convert/text" .. sandbox
extra_module = "Module:Convert/extra" .. sandbox
wikidata_module = "Module:Convert/wikidata" .. sandbox
wikidata_data_module = "Module:Convert/wikidata/data" .. sandbox
spell_module = "Module:ConvertNumeric"
data_code = mw.loadData(data_module)
text_code = mw.loadData(text_module)
all_units = data_code.all_units
local translation = text_code.translation_table
if translation then
numdot = translation.numdot
numsep = translation.numsep
if numdot == ',' and numsep == '.' then
if text_code.all_messages.cvt_enwiki_num then
to_en = to_en_with_check
end
end
if translation.group then
group_method = translation.group
end
if translation.per_word then
per_word = translation.per_word
end
if translation.plural_suffix then
plural_suffix = translation.plural_suffix
end
varname = translation.varname
from_en_table = translation.from_en
local use_workaround = true
if use_workaround then
-- 2013-07-05 workaround bug by making a copy of the required table.
-- mw.ustring.gsub fails with a table (to_en_table) as the replacement,
-- if the table is accessed via mw.loadData.
local source = translation.to_en
if source then
to_en_table = {}
for k, v in pairs(source) do
to_en_table[k] = v
end
end
else
to_en_table = translation.to_en
end
if translation.lang == 'en default' then
en_default = true -- for hiwiki
end
omitsep = translation.omitsep -- for zhwiki
end
numdot = config.numdot or numdot or '.' -- decimal mark before fractional digits
numsep = config.numsep or numsep or ',' -- group separator for numbers
-- numsep should be ',' or '.' or '' or ' ' or a Unicode character.
-- numsep_remove must work in a regex to identify separators to be removed.
if numsep ~= '' then
numsep_remove = (numsep == '.') and '%.' or numsep
end
if numsep ~= ',' and numdot ~= ',' then
numsep_remove2 = ',' -- so numbers copied from enwiki will work
end
end
local function collection()
-- Return a table to hold items.
return {
n = 0,
add = function (self, item)
self.n = self.n + 1
self[self.n] = item
end,
}
end
local function divide(numerator, denominator)
-- Return integers quotient, remainder resulting from dividing the two
-- given numbers, which should be unsigned integers.
local quotient, remainder = floor(numerator / denominator), numerator % denominator
if not (0 <= remainder and remainder < denominator) then
-- Floating point limits may need this, as in {{convert|160.02|Ym|ydftin}}.
remainder = 0
end
return quotient, remainder
end
local function split(text, delimiter)
-- Return a numbered table with fields from splitting text.
-- The delimiter is used in a regex without escaping (for example, '.' would fail).
-- Each field has any leading/trailing whitespace removed.
local t = {}
text = text .. delimiter -- to get last item
for item in text:gmatch('%s*(.-)%s*' .. delimiter) do
table.insert(t, item)
end
return t
end
local function strip(text)
-- If text is a string, return its content with no leading/trailing
-- whitespace. Otherwise return nil (a nil argument gives a nil result).
if type(text) == 'string' then
return text:match("^%s*(.-)%s*$")
end
end
local function table_len(t)
-- Return length (<100) of a numbered table to replace #t which is
-- documented to not work if t is accessed via mw.loadData().
for i = 1, 100 do
if t[i] == nil then
return i - 1
end
end
end
local function wanted_category(catkey, catsort, want_warning)
-- Return message category if it is wanted in current namespace,
-- otherwise return ''.
local cat
local title = mw.title.getCurrentTitle()
if title then
local nsdefault = '0' -- default namespace: '0' = article; '0,10' = article and template
local namespace = title.namespace
for _, v in ipairs(split(config.nscat or nsdefault, ',')) do
if namespace == tonumber(v) then
cat = text_code.all_categories[want_warning and 'warning' or catkey]
if catsort and catsort ~= '' and cat:sub(-2) == ']]' then
cat = cat:sub(1, -3) .. '|' .. mw.text.nowiki(usub(catsort, 1, 20)) .. ']]'
end
break
end
end
end
return cat or ''
end
local function message(parms, mcode, is_warning)
-- Return wikitext for an error message, including category if specified
-- for the message type.
-- mcode = numbered table specifying the message:
-- mcode[1] = 'cvt_xxx' (string used as a key to get message info)
-- mcode[2] = 'parm1' (string to replace '$1' if any in message)
-- mcode[3] = 'parm2' (string to replace '$2' if any in message)
-- mcode[4] = 'parm3' (string to replace '$3' if any in message)
local msg
if type(mcode) == 'table' then
if mcode[1] == 'cvt_no_output' then
-- Some errors should cause convert to output an empty string,
-- for example, for an optional field in an infobox.
return ''
end
msg = text_code.all_messages[mcode[1]]
end
parms.have_problem = true
local function subparm(fmt, ...)
local rep = {}
for i, v in ipairs({...}) do
rep['$' .. i] = v
end
return (fmt:gsub('$%d+', rep))
end
if msg then
local parts = {}
local regex, replace = msg.regex, msg.replace
for i = 1, 3 do
local limit = 40
local s = mcode[i + 1]
if s then
if regex and replace then
s = s:gsub(regex, replace)
limit = nil -- allow long "should be" messages
end
-- Escape user input so it does not break the message.
-- To avoid tags (like {{convert|1<math>23</math>|m}}) breaking
-- the mouseover title, any strip marker starting with char(127) is
-- replaced with '...' (text not needing i18n).
local append
local pos = s:find(string.char(127), 1, true)
if pos then
append = '...'
s = s:sub(1, pos - 1)
end
if limit and ulen(s) > limit then
s = usub(s, 1, limit)
append = '...'
end
s = mw.text.nowiki(s) .. (append or '')
else
s = '?'
end
parts['$' .. i] = s
end
local function ispreview()
-- Return true if a prominent message should be shown.
if parms.test == 'preview' or parms.test == 'nopreview' then
-- For testing, can preview a real message or simulate a preview
-- when running automated tests.
return parms.test == 'preview'
end
local success, revid = pcall(function ()
return (parms.frame):preprocess('{{REVISIONID}}') end)
return success and (revid == '')
end
local want_warning = is_warning and
not config.warnings and -- show unobtrusive warnings if config.warnings not configured
not msg.nowarn -- but use msg settings, not standard warning, if specified
local title = string.gsub(msg[1] or 'Missing message', '$%d+', parts)
local text = want_warning and '*' or msg[2] or 'Missing message'
local cat = wanted_category(msg[3], mcode[2], want_warning)
local anchor = msg[4] or ''
local fmtkey = ispreview() and 'cvt_format_preview' or
(want_warning and 'cvt_format2' or msg.format or 'cvt_format')
local fmt = text_code.all_messages[fmtkey] or 'convert: bug'
return subparm(fmt, title:gsub('"', '"'), text, cat, anchor)
end
return 'Convert internal error: unknown message'
end
function add_warning(parms, level, key, text1, text2) -- for forward declaration above
-- If enabled, add a warning that will be displayed after the convert result.
-- A higher level is more verbose: more kinds of warnings are displayed.
-- To reduce output noise, only the first warning is displayed.
if level <= (tonumber(config.warnings) or 1) then
if parms.warnings == nil then
parms.warnings = message(parms, { key, text1, text2 }, true)
end
end
end
local function spell_number(parms, inout, number, numerator, denominator)
-- Return result of spelling (number, numerator, denominator), or
-- return nil if spelling is not available or not supported for given text.
-- Examples (each value must be a string or nil):
-- number numerator denominator output
-- ------ --------- ----------- -------------------
-- "1.23" nil nil one point two three
-- "1" "2" "3" one and two thirds
-- nil "2" "3" two thirds
if not speller then
local function get_speller(module)
return require(module).spell_number
end
local success
success, speller = pcall(get_speller, spell_module)
if not success or type(speller) ~= 'function' then
add_warning(parms, 1, 'cvt_no_spell', 'spell')
return nil
end
end
local case
if parms.spell_upper == inout then
case = true
parms.spell_upper = nil -- only uppercase first word in a multiple unit
end
local sp = not parms.opt_sp_us
local adj = parms.opt_adjectival
return speller(number, numerator, denominator, case, sp, adj)
end
------------------------------------------------------------------------
-- BEGIN: Code required only for built-in units.
-- LATER: If need much more code, move to another module to simplify this module.
local function speed_of_sound(altitude)
-- This is for the Mach built-in unit of speed.
-- Return speed of sound in metres per second at given altitude in feet.
-- If no altitude given, use default (zero altitude = sea level).
-- Table gives speed of sound in miles per hour at various altitudes:
-- altitude = -17,499 to 402,499 feet
-- mach_table[a + 4] = s where
-- a = (altitude / 5000) rounded to nearest integer (-3 to 80)
-- s = speed of sound (mph) at that altitude
-- LATER: Should calculate result from an interpolation between the next
-- lower and higher altitudes in table, rather than rounding to nearest.
-- From: http://www.aerospaceweb.org/question/atmosphere/q0112.shtml
local mach_table = { -- a =
799.5, 787.0, 774.2, 761.207051, -- -3 to 0
748.0, 734.6, 721.0, 707.0, 692.8, 678.3, 663.5, 660.1, 660.1, 660.1, -- 1 to 10
660.1, 660.1, 660.1, 662.0, 664.3, 666.5, 668.9, 671.1, 673.4, 675.6, -- 11 to 20
677.9, 683.7, 689.9, 696.0, 702.1, 708.1, 714.0, 719.9, 725.8, 731.6, -- 21 to 30
737.3, 737.7, 737.7, 736.2, 730.5, 724.6, 718.8, 712.9, 707.0, 701.0, -- 31 to 40
695.0, 688.9, 682.8, 676.6, 670.4, 664.1, 657.8, 652.9, 648.3, 643.7, -- 41 to 50
639.1, 634.4, 629.6, 624.8, 620.0, 615.2, 613.2, 613.2, 613.2, 613.5, -- 51 to 60
614.4, 615.3, 616.7, 619.8, 623.4, 629.7, 635.0, 641.1, 650.6, 660.0, -- 61 to 70
672.5, 674.3, 676.1, 677.9, 679.7, 681.5, 683.3, 685.1, 686.8, 688.6, -- 71 to 80
}
altitude = altitude or 0
local a = (altitude < 0) and -altitude or altitude
a = floor(a / 5000 + 0.5)
if altitude < 0 then
a = -a
end
if a < -3 then
a = -3
elseif a > 80 then
a = 80
end
return mach_table[a + 4] * 0.44704 -- mph converted to m/s
end
-- END: Code required only for built-in units.
------------------------------------------------------------------------
local function add_style(parms, class)
-- Add selected template style to parms if not already present.
parms.templatestyles = parms.templatestyles or {}
if not parms.templatestyles[class] then
parms.templatestyles[class] = parms.frame:extensionTag({
name = 'templatestyles', args = { src = text_code.titles[class] }
})
end
end
local function get_styles(parms)
-- Return string of required template styles, empty if none.
if parms.templatestyles then
local t = {}
for _, v in pairs(parms.templatestyles) do
table.insert(t, v)
end
return table.concat(t)
end
return ''
end
local function get_range(word)
-- Return a range (string or table) corresponding to word (like "to"),
-- or return nil if not a range word.
local ranges = text_code.ranges
return ranges.types[word] or ranges.types[ranges.aliases[word]]
end
local function check_mismatch(unit1, unit2)
-- If unit1 cannot be converted to unit2, return an error message table.
-- This allows conversion between units of the same type, and between
-- Nm (normally torque) and ftlb (energy), as in gun-related articles.
-- This works because Nm is the base unit (scale = 1) for both the
-- primary type (torque), and the alternate type (energy, where Nm = J).
-- A match occurs if the primary types are the same, or if unit1 matches
-- the alternate type of unit2, and vice versa. That provides a whitelist
-- of which conversions are permitted between normally incompatible types.
if unit1.utype == unit2.utype or
(unit1.utype == unit2.alttype and unit1.alttype == unit2.utype) then
return nil
end
return { 'cvt_mismatch', unit1.utype, unit2.utype }
end
local function override_from(out_table, in_table, fields)
-- Copy the specified fields from in_table to out_table, but do not
-- copy nil fields (keep any corresponding field in out_table).
for _, field in ipairs(fields) do
if in_table[field] then
out_table[field] = in_table[field]
end
end
end
local function shallow_copy(t)
-- Return a shallow copy of table t.
-- Do not need the features and overhead of the Scribunto mw.clone().
local result = {}
for k, v in pairs(t) do
result[k] = v
end
return result
end
local unit_mt = {
-- Metatable to get missing values for a unit that does not accept SI prefixes.
-- Warning: The boolean value 'false' is returned for any missing field
-- so __index is not called twice for the same field in a given unit.
__index = function (self, key)
local value
if key == 'name1' or key == 'sym_us' then
value = self.symbol
elseif key == 'name2' then
value = self.name1 .. plural_suffix
elseif key == 'name1_us' then
value = self.name1
if not rawget(self, 'name2_us') then
-- If name1_us is 'foot', do not make name2_us by appending plural_suffix.
self.name2_us = self.name2
end
elseif key == 'name2_us' then
local raw1_us = rawget(self, 'name1_us')
if raw1_us then
value = raw1_us .. plural_suffix
else
value = self.name2
end
elseif key == 'link' then
value = self.name1
else
value = false
end
rawset(self, key, value)
return value
end
}
local function prefixed_name(unit, name, index)
-- Return unit name with SI prefix inserted at correct position.
-- index = 1 (name1), 2 (name2), 3 (name1_us), 4 (name2_us).
-- The position is a byte (not character) index, so use Lua's sub().
local pos = rawget(unit, 'prefix_position')
if type(pos) == 'string' then
pos = tonumber(split(pos, ',')[index])
end
if pos then
return name:sub(1, pos - 1) .. unit.si_name .. name:sub(pos)
end
return unit.si_name .. name
end
local unit_prefixed_mt = {
-- Metatable to get missing values for a unit that accepts SI prefixes.
-- Before use, fields si_name, si_prefix must be defined.
-- The unit must define _symbol, _name1 and
-- may define _sym_us, _name1_us, _name2_us
-- (_sym_us, _name2_us may be defined for a language using sp=us
-- to refer to a variant unrelated to U.S. units).
__index = function (self, key)
local value
if key == 'symbol' then
value = self.si_prefix .. self._symbol
if value == 'l' then value = 'L' end
elseif key == 'sym_us' then
value = rawget(self, '_sym_us')
if value then
value = self.si_prefix .. value
else
value = self.symbol
end
elseif key == 'name1' then
value = prefixed_name(self, self._name1, 1)
elseif key == 'name2' then
value = rawget(self, '_name2')
if value then
value = prefixed_name(self, value, 2)
else
value = self.name1 .. plural_suffix
end
elseif key == 'name1_us' then
value = rawget(self, '_name1_us')
if value then
value = prefixed_name(self, value, 3)
else
value = self.name1
end
elseif key == 'name2_us' then
value = rawget(self, '_name2_us')
if value then
value = prefixed_name(self, value, 4)
elseif rawget(self, '_name1_us') then
value = self.name1_us .. plural_suffix
else
value = self.name2
end
elseif key == 'link' then
value = self.name1
else
value = false
end
rawset(self, key, value)
return value
end
}
local unit_per_mt = {
-- Metatable to get values for a per unit of form "x/y".
-- This is never called to determine a unit name or link because per units
-- are handled as a special case.
-- Similarly, the default output is handled elsewhere, and for a symbol
-- this is only called from get_default() for default_exceptions.
__index = function (self, key)
local value
if key == 'symbol' then
local per = self.per
local unit1, unit2 = per[1], per[2]
if unit1 then
value = unit1[key] .. '/' .. unit2[key]
else
value = '/' .. unit2[key]
end
elseif key == 'sym_us' then
value = self.symbol
elseif key == 'scale' then
local per = self.per
local unit1, unit2 = per[1], per[2]
value = (unit1 and unit1.scale or 1) * self.scalemultiplier / unit2.scale
else
value = false
end
rawset(self, key, value)
return value
end
}
local function make_per(unitcode, unit_table, ulookup)
-- Return true, t where t is a per unit with unit codes expanded to unit tables,
-- or return false, t where t is an error message table.
local result = {
unitcode = unitcode,
utype = unit_table.utype,
per = {}
}
override_from(result, unit_table, { 'invert', 'iscomplex', 'default', 'link', 'symbol', 'symlink' })
result.symbol_raw = (result.symbol or false) -- to distinguish between a defined exception and a metatable calculation
local prefix
for i, v in ipairs(unit_table.per) do
if i == 1 and v == '' then
-- First unit symbol can be empty; that gives a nil first unit table.
elseif i == 1 and text_code.currency[v] then
prefix = currency_text or v
else
local success, t = ulookup(v)
if not success then return false, t end
result.per[i] = t
end
end
local multiplier = unit_table.multiplier
if not result.utype then
-- Creating an automatic per unit.
local unit1 = result.per[1]
local utype = (unit1 and unit1.utype or prefix or '') .. '/' .. result.per[2].utype
local t = data_code.per_unit_fixups[utype]
if t then
if type(t) == 'table' then
utype = t.utype or utype
result.link = result.link or t.link
multiplier = multiplier or t.multiplier
else
utype = t
end
end
result.utype = utype
end
result.scalemultiplier = multiplier or 1
result.vprefix = prefix or false -- set to non-nil to avoid calling __index
return true, setmetatable(result, unit_per_mt)
end
local function lookup(parms, unitcode, what, utable, fails, depth)
-- Return true, t where t is a copy of the unit's converter table,
-- or return false, t where t is an error message table.
-- Parameter 'what' determines whether combination units are accepted:
-- 'no_combination' : single unit only
-- 'any_combination' : single unit or combination or output multiple
-- 'only_multiple' : single unit or output multiple only
-- Parameter unitcode is a symbol (like 'g'), with an optional SI prefix (like 'kg').
-- If, for example, 'kg' is in this table, that entry is used;
-- otherwise the prefix ('k') is applied to the base unit ('g').
-- If unitcode is a known combination code (and if allowed by what),
-- a table of output multiple unit tables is included in the result.
-- For compatibility with the old template, an underscore in a unitcode is
-- replaced with a space so usage like {{convert|350|board_feet}} works.
-- Wikignomes may also put two spaces or " " in combinations, so
-- replace underscore, " ", and multiple spaces with a single space.
utable = utable or parms.unittable or all_units
fails = fails or {}
depth = depth and depth + 1 or 1
if depth > 9 then
-- There are ways to mistakenly define units which result in infinite
-- recursion when lookup() is called. That gives a long delay and very
-- confusing error messages, so the depth parameter is used as a guard.
return false, { 'cvt_lookup', unitcode }
end
if unitcode == nil or unitcode == '' then
return false, { 'cvt_no_unit' }
end
unitcode = unitcode:gsub('_', ' '):gsub(' ', ' '):gsub(' +', ' ')
local function call_make_per(t)
return make_per(unitcode, t,
function (ucode) return lookup(parms, ucode, 'no_combination', utable, fails, depth) end
)
end
local t = utable[unitcode]
if t then
if t.shouldbe then
return false, { 'cvt_should_be', t.shouldbe }
end
if t.sp_us then
parms.opt_sp_us = true
end
local target = t.target -- nil, or unitcode is an alias for this target
if target then
local success, result = lookup(parms, target, what, utable, fails, depth)
if not success then return false, result end
override_from(result, t, { 'customary', 'default', 'link', 'symbol', 'symlink', 'usename' })
local multiplier = t.multiplier
if multiplier then
result.multiplier = tostring(multiplier)
result.scale = result.scale * multiplier
end
return true, result
end
if t.per then
return call_make_per(t)
end
local combo = t.combination -- nil or a table of unitcodes
if combo then
local multiple = t.multiple
if what == 'no_combination' or (what == 'only_multiple' and not multiple) then
return false, { 'cvt_bad_unit', unitcode }
end
-- Recursively create a combination table containing the
-- converter table of each unitcode.
local result = { utype = t.utype, multiple = multiple, combination = {} }
local cvt = result.combination
for i, v in ipairs(combo) do
local success, t = lookup(parms, v, multiple and 'no_combination' or 'only_multiple', utable, fails, depth)
if not success then return false, t end
cvt[i] = t
end
return true, result
end
local result = shallow_copy(t)
result.unitcode = unitcode
if result.prefixes then
result.si_name = ''
result.si_prefix = ''
return true, setmetatable(result, unit_prefixed_mt)
end
return true, setmetatable(result, unit_mt)
end
local SIprefixes = text_code.SIprefixes
for plen = SIprefixes[1] or 2, 1, -1 do
-- Look for an SI prefix; should never occur with an alias.
-- Check for longer prefix first ('dam' is decametre).
-- SIprefixes[1] = prefix maximum #characters (as seen by mw.ustring.sub).
local prefix = usub(unitcode, 1, plen)
local si = SIprefixes[prefix]
if si then
local t = utable[usub(unitcode, plen+1)]
if t and t.prefixes then
local result = shallow_copy(t)
result.unitcode = unitcode
result.si_name = parms.opt_sp_us and si.name_us or si.name
result.si_prefix = si.prefix or prefix
result.scale = t.scale * 10 ^ (si.exponent * t.prefixes)
return true, setmetatable(result, unit_prefixed_mt)
end
end
end
-- Accept user-defined combinations like "acre+m2+ha" or "acre m2 ha" for output.
-- If '+' is used, each unit code can include a space, and any error is fatal.
-- If ' ' is used and if each space-separated word is a unit code, it is a combo,
-- but errors are not fatal so the unit code can be looked up as an extra unit.
local err_is_fatal
local combo = collection()
if unitcode:find('+', 1, true) then
err_is_fatal = true
for item in (unitcode .. '+'):gmatch('%s*(.-)%s*%+') do
if item ~= '' then
combo:add(item)
end
end
elseif unitcode:find('%s') then
for item in unitcode:gmatch('%S+') do
combo:add(item)
end
end
if combo.n > 1 then
local function lookup_combo()
if what == 'no_combination' or what == 'only_multiple' then
return false, { 'cvt_bad_unit', unitcode }
end
local result = { combination = {} }
local cvt = result.combination
for i, v in ipairs(combo) do
local success, t = lookup(parms, v, 'only_multiple', utable, fails, depth)
if not success then return false, t end
if i == 1 then
result.utype = t.utype
else
local mismatch = check_mismatch(result, t)
if mismatch then
return false, mismatch
end
end
cvt[i] = t
end
return true, result
end
local success, result = lookup_combo()
if success or err_is_fatal then
return success, result
end
end
-- Accept any unit with an engineering notation prefix like "e6cuft"
-- (million cubic feet), but not chained prefixes like "e3e6cuft",
-- and not if the unit is a combination or multiple,
-- and not if the unit has an offset or is a built-in.
-- Only en digits are accepted.
local e, exponent, baseunit = unitcode:match('^([Ee])(%d+)(.*)')
if exponent then
local engscale = text_code.eng_scales[exponent]
if engscale then
local success, result = lookup(parms, baseunit, 'no_combination', utable, fails, depth)
if success and not (result.offset or result.builtin or result.engscale) then
if e == 'E' then
result.this_number_word = true
unitcode = 'e' .. unitcode:sub(2)
end
result.unitcode = unitcode -- 'e6cuft' not 'cuft'
result.defkey = unitcode -- key to lookup default exception
result.engscale = engscale
result.scale = result.scale * 10 ^ tonumber(exponent)
return true, result
end
end
end
-- Look for x/y; split on right-most slash to get scale correct (x/y/z is x/y per z).
local top, bottom = unitcode:match('^(.-)/([^/]+)$')
if top and not unitcode:find('e%d') then
-- If valid, create an automatic per unit for an "x/y" unit code.
-- The unitcode must not include extraneous spaces.
-- Engineering notation (apart from at start and which has been stripped before here),
-- is not supported so do not make a per unit if find text like 'e3' in unitcode.
local success, result = call_make_per({ per = {top, bottom} })
if success then
return true, result
end
end
if not parms.opt_ignore_error and not get_range(unitcode) then
-- Want the "what links here" list for the extra_module to show only cases
-- where an extra unit is used, so do not require it if invoked from {{val}}
-- or if looking up a range word which cannot be a unit.
if not extra_units then
local success, extra = pcall(function () return require(extra_module).extra_units end)
if success and type(extra) == 'table' then
extra_units = extra
end
end
if extra_units then
-- A unit in one data table might refer to a unit in the other table, so
-- switch between them, relying on fails or depth to terminate loops.
if not fails[unitcode] then
fails[unitcode] = true
local other = (utable == all_units) and extra_units or all_units
local success, result = lookup(parms, unitcode, what, other, fails, depth)
if success then
return true, result
end
end
end
end
if to_en_table then
-- At fawiki it is common to translate all digits so a unit like "km2" becomes "km۲".
local en_code = ustring.gsub(unitcode, '%d', to_en_table)
if en_code ~= unitcode then
return lookup(parms, en_code, what, utable, fails, depth)
end
end
return false, { 'cvt_unknown', unitcode }
end
local function valid_number(num)
-- Return true if num is a valid number.
-- In Scribunto (different from some standard Lua), when expressed as a string,
-- overflow or other problems are indicated with text like "inf" or "nan"
-- which are regarded as invalid here (each contains "n").
if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then
return true
end
end
local function hyphenated(name, parts)
-- Return a hyphenated form of given name (for adjectival usage).
-- The name may be linked and the target of the link must not be changed.
-- Hypothetical examples:
-- [[long ton|ton]] → [[long ton|ton]] (no change)
-- [[tonne|long ton]] → [[tonne|long-ton]]
-- [[metric ton|long ton]] → [[metric ton|long-ton]]
-- [[long ton]] → [[long ton|long-ton]]
-- Input can also have multiple links in a single name like:
-- [[United States customary units|U.S.]] [[US gallon|gallon]]
-- [[mile]]s per [[United States customary units|U.S.]] [[quart]]
-- [[long ton]]s per [[short ton]]
-- Assume that links cannot be nested (never like "[[abc[[def]]ghi]]").
-- This uses a simple and efficient procedure that works for most cases.
-- Some units (if used) would require more, and can later think about
-- adding a method to handle exceptions.
-- The procedure is to replace each space with a hyphen, but
-- not a space after ')' [for "(pre-1954 US) nautical mile"], and
-- not spaces immediately before '(' or in '(...)' [for cases like
-- "British thermal unit (ISO)" and "Calorie (International Steam Table)"].
if name:find(' ', 1, true) then
if parts then
local pos
if name:sub(1, 1) == '(' then
pos = name:find(')', 1, true)
if pos then
return name:sub(1, pos+1) .. name:sub(pos+2):gsub(' ', '-')
end
elseif name:sub(-1) == ')' then
pos = name:find('(', 1, true)
if pos then
return name:sub(1, pos-2):gsub(' ', '-') .. name:sub(pos-1)
end
end
return name:gsub(' ', '-')
end
parts = collection()
for before, item, after in name:gmatch('([^[]*)(%[%[[^[]*%]%])([^[]*)') do
if item:find(' ', 1, true) then
local prefix
local plen = item:find('|', 1, true)
if plen then
prefix = item:sub(1, plen)
item = item:sub(plen + 1, -3)
else
prefix = item:sub(1, -3) .. '|'
item = item:sub(3, -3)
end
item = prefix .. hyphenated(item, parts) .. ']]'
end
parts:add(before:gsub(' ', '-') .. item .. after:gsub(' ', '-'))
end
if parts.n == 0 then
-- No link like "[[...]]" was found in the original name.
parts:add(hyphenated(name, parts))
end
return table.concat(parts)
end
return name
end
local function hyphenated_maybe(parms, want_name, sep, id, inout)
-- Return s, f where
-- s = id, possibly modified
-- f = true if hyphenated
-- Possible modifications: hyphenate; prepend '-'; append mid text.
if id == nil or id == '' then
return ''
end
local mid = (inout == (parms.opt_flip and 'out' or 'in')) and parms.mid or ''
if want_name then
if parms.opt_adjectival then
return '-' .. hyphenated(id) .. mid, true
end
if parms.opt_add_s and id:sub(-1) ~= 's' then
id = id .. 's' -- for nowiki
end
end
return sep .. id .. mid
end
local function use_minus(text)
-- Return text with Unicode minus instead of '-', if present.
if text:sub(1, 1) == '-' then
return MINUS .. text:sub(2)
end
return text
end
local function digit_groups(parms, text, method)
-- Return a numbered table of groups of digits (left-to-right, in local language).
-- Parameter method is a number or nil:
-- 3 for 3-digit grouping (default), or
-- 2 for 3-then-2 grouping (only for digits before decimal mark).
local len_right
local len_left = text:find('.', 1, true)
if len_left then
len_right = #text - len_left
len_left = len_left - 1
else
len_left = #text
end
local twos = method == 2 and len_left > 5
local groups = collection()
local run = len_left
local n
if run < 4 or (run == 4 and parms.opt_comma5) then
if parms.opt_gaps then
n = run
else
n = #text
end
elseif twos then
n = run % 2 == 0 and 1 or 2
else
n = run % 3 == 0 and 3 or run % 3
end
while run > 0 do
groups:add(n)
run = run - n
n = (twos and run > 3) and 2 or 3
end
if len_right then
if groups.n == 0 then
groups:add(0)
end
if parms.opt_gaps and len_right > 3 then
local want4 = not parms.opt_gaps3 -- true gives no gap before trailing single digit
local isfirst = true
run = len_right
while run > 0 do
n = (want4 and run == 4) and 4 or (run > 3 and 3 or run)
if isfirst then
isfirst = false
groups[groups.n] = groups[groups.n] + 1 + n
else
groups:add(n)
end
run = run - n
end
else
groups[groups.n] = groups[groups.n] + 1 + len_right
end
end
local pos = 1
for i, length in ipairs(groups) do
groups[i] = from_en(text:sub(pos, pos + length - 1))
pos = pos + length
end
return groups
end
function with_separator(parms, text) -- for forward declaration above
-- Input text is a number in en digits with optional '.' decimal mark.
-- Return an equivalent, formatted for display:
-- with a custom decimal mark instead of '.', if wanted
-- with thousand separators inserted, if wanted
-- digits in local language
-- The given text is like '123' or '123.' or '12345.6789'.
-- The text has no sign (caller inserts that later, if necessary).
-- When using gaps, they are inserted before and after the decimal mark.
-- Separators are inserted only before the decimal mark.
-- A trailing dot (as in '123.') is removed because their use appears to
-- be accidental, and such a number should be shown as '123' or '123.0'.
-- It is useful for convert to suppress the dot so, for example, '4000.'
-- is a simple way of indicating that all the digits are significant.
if text:sub(-1) == '.' then
text = text:sub(1, -2)
end
if #text < 4 or parms.opt_nocomma or numsep == '' then
return from_en(text)
end
local groups = digit_groups(parms, text, group_method)
if parms.opt_gaps then
if groups.n <= 1 then
return groups[1] or ''
end
local nowrap = '<span style="white-space: nowrap">'
local gap = '<span style="margin-left: 0.25em">'
local close = '</span>'
return nowrap .. groups[1] .. gap .. table.concat(groups, close .. gap, 2, groups.n) .. close .. close
end
return table.concat(groups, numsep)
end
-- An input value like 1.23e12 is displayed using scientific notation (1.23×10¹²).
-- That also makes the output use scientific notation, except for small values.
-- In addition, very small or very large output values use scientific notation.
-- Use format(fmtpower, significand, '10', exponent) where each argument is a string.
local fmtpower = '%s<span style="margin:0 .15em 0 .25em">×</span>%s<sup>%s</sup>'
local function with_exponent(parms, show, exponent)
-- Return wikitext to display the implied value in scientific notation.
-- Input uses en digits; output uses digits in local language.
return format(fmtpower, with_separator(parms, show), from_en('10'), use_minus(from_en(tostring(exponent))))
end
local function make_sigfig(value, sigfig)
-- Return show, exponent that are equivalent to the result of
-- converting the number 'value' (where value >= 0) to a string,
-- rounded to 'sigfig' significant figures.
-- The returned items are:
-- show: a string of digits; no sign and no dot;
-- there is an implied dot before show.
-- exponent: a number (an integer) to shift the implied dot.
-- Resulting value = tonumber('.' .. show) * 10^exponent.
-- Examples:
-- make_sigfig(23.456, 3) returns '235', 2 (.235 * 10^2).
-- make_sigfig(0.0023456, 3) returns '235', -2 (.235 * 10^-2).
-- make_sigfig(0, 3) returns '000', 1 (.000 * 10^1).
if sigfig <= 0 then
sigfig = 1
elseif sigfig > maxsigfig then
sigfig = maxsigfig
end
if value == 0 then
return string.rep('0', sigfig), 1
end
local exp, fracpart = math.modf(log10(value))
if fracpart >= 0 then
fracpart = fracpart - 1
exp = exp + 1
end
local digits = format('%.0f', 10^(fracpart + sigfig))
if #digits > sigfig then
-- Overflow (for sigfig=3: like 0.9999 rounding to "1000"; need "100").
digits = digits:sub(1, sigfig)
exp = exp + 1
end
assert(#digits == sigfig, 'Bug: rounded number has wrong length')
return digits, exp
end
-- Fraction output format.
local fracfmt = {
{ -- Like {{frac}} (fraction slash).
'<span class="frac">{SIGN}<span class="num">{NUM}</span>⁄<span class="den">{DEN}</span></span>', -- 1/2
'<span class="frac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="num">{NUM}</span>⁄<span class="den">{DEN}</span></span>', -- 1+2/3
style = 'frac',
},
{ -- Like {{sfrac}} (stacked fraction, that is, horizontal bar).
'<span class="sfrac tion">{SIGN}<span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span>', -- 1//2
'<span class="sfrac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="tion"><span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span></span>', -- 1+2//3
style = 'sfrac',
},
}
local function format_fraction(parms, inout, negative, wholestr, numstr, denstr, do_spell, style)
-- Return wikitext for a fraction, possibly spelled.
-- Inputs use en digits and have no sign; output uses digits in local language.
local wikitext
if not style then
style = parms.opt_fraction_horizontal and 2 or 1
end
if wholestr == '' then
wholestr = nil
end
local substitute = {
SIGN = negative and MINUS or '',
WHOLE = wholestr and with_separator(parms, wholestr),
NUM = from_en(numstr),
DEN = from_en(denstr),
}
wikitext = fracfmt[style][wholestr and 2 or 1]:gsub('{(%u+)}', substitute)
if do_spell then
if negative then
if wholestr then
wholestr = '-' .. wholestr
else
numstr = '-' .. numstr
end
end
local s = spell_number(parms, inout, wholestr, numstr, denstr)
if s then
return s
end
end
add_style(parms, fracfmt[style].style)
return wikitext
end
local function format_number(parms, show, exponent, isnegative)
-- Parameter show is a string or a table containing strings.
-- Each string is a formatted number in en digits and optional '.' decimal mark.
-- A table represents a fraction: integer, numerator, denominator;
-- if a table is given, exponent must be nil.
-- Return t where t is a table with fields:
-- show = wikitext formatted to display implied value
-- (digits in local language)
-- is_scientific = true if show uses scientific notation
-- clean = unformatted show (possibly adjusted and with inserted '.')
-- (en digits)
-- sign = '' or MINUS
-- exponent = exponent (possibly adjusted)
-- The clean and exponent fields can be used to calculate the
-- rounded absolute value, if needed.
--
-- The value implied by the arguments is found from:
-- exponent is nil; and
-- show is a string of digits (no sign), with an optional dot;
-- show = '123.4' is value 123.4, '1234' is value 1234.0;
-- or:
-- exponent is an integer indicating where dot should be;
-- show is a string of digits (no sign and no dot);
-- there is an implied dot before show;
-- show does not start with '0';
-- show = '1234', exponent = 3 is value 0.1234*10^3 = 123.4.
--
-- The formatted result:
-- * Is for an output value and is spelled if wanted and possible.
-- * Includes a Unicode minus if isnegative and not spelled.
-- * Uses a custom decimal mark, if wanted.
-- * Has digits grouped where necessary, if wanted.
-- * Uses scientific notation if requested, or for very small or large values
-- (which forces result to not be spelled).
-- * Has no more than maxsigfig significant digits
-- (same as old template and {{#expr}}).
local xhi, xlo -- these control when scientific notation (exponent) is used
if parms.opt_scientific then
xhi, xlo = 4, 2 -- default for output if input uses e-notation
elseif parms.opt_scientific_always then
xhi, xlo = 0, 0 -- always use scientific notation (experimental)
else
xhi, xlo = 10, 4 -- default
end
local sign = isnegative and MINUS or ''
local maxlen = maxsigfig
local tfrac
if type(show) == 'table' then
tfrac = show
show = tfrac.wholestr
assert(exponent == nil, 'Bug: exponent given with fraction')
end
if not tfrac and not exponent then
local integer, dot, decimals = show:match('^(%d*)(%.?)(.*)')
if integer == '0' or integer == '' then
local zeros, figs = decimals:match('^(0*)([^0]?.*)')
if #figs == 0 then
if #zeros > maxlen then
show = '0.' .. zeros:sub(1, maxlen)
end
elseif #zeros >= xlo then
show = figs
exponent = -#zeros
elseif #figs > maxlen then
show = '0.' .. zeros .. figs:sub(1, maxlen)
end
elseif #integer >= xhi then
show = integer .. decimals
exponent = #integer
else
maxlen = maxlen + #dot
if #show > maxlen then
show = show:sub(1, maxlen)
end
end
end
if exponent then
local function zeros(n)
return string.rep('0', n)
end
if #show > maxlen then
show = show:sub(1, maxlen)
end
if exponent > xhi or exponent <= -xlo or (exponent == xhi and show ~= '1' .. zeros(xhi - 1)) then
-- When xhi, xlo = 10, 4 (the default), scientific notation is used if the
-- rounded value satisfies: value >= 1e9 or value < 1e-4 (1e9 = 0.1e10),
-- except if show is '1000000000' (1e9), for example:
-- {{convert|1000000000|m|m|sigfig=10}} → 1,000,000,000 metres (1,000,000,000 m)
local significand
if #show > 1 then
significand = show:sub(1, 1) .. '.' .. show:sub(2)
else
significand = show
end
return {
clean = '.' .. show,
exponent = exponent,
sign = sign,
show = sign .. with_exponent(parms, significand, exponent-1),
is_scientific = true,
}
end
if exponent >= #show then
show = show .. zeros(exponent - #show) -- result has no dot
elseif exponent <= 0 then
show = '0.' .. zeros(-exponent) .. show
else
show = show:sub(1, exponent) .. '.' .. show:sub(exponent+1)
end
end
local formatted_show
if tfrac then
show = tostring(tfrac.value) -- to set clean in returned table
formatted_show = format_fraction(parms, 'out', isnegative, tfrac.wholestr, tfrac.numstr, tfrac.denstr, parms.opt_spell_out)
else
if isnegative and show:match('^0.?0*$') then
sign = '' -- don't show minus if result is negative but rounds to zero
end
formatted_show = sign .. with_separator(parms, show)
if parms.opt_spell_out then
formatted_show = spell_number(parms, 'out', sign .. show) or formatted_show
end
end
return {
clean = show,
sign = sign,
show = formatted_show,
is_scientific = false, -- to avoid calling __index
}
end
local function extract_fraction(parms, text, negative)
-- If text represents a fraction, return
-- value, altvalue, show, denominator
-- where
-- value is a number (value of the fraction in argument text)
-- altvalue is an alternate interpretation of any fraction for the hands
-- unit where "12.1+3/4" means 12 hands 1.75 inches
-- show is a string (formatted text for display of an input value,
-- and is spelled if wanted and possible)
-- denominator is value of the denominator in the fraction
-- Otherwise, return nil.
-- Input uses en digits and '.' decimal mark (input has been translated).
-- Output uses digits in local language and local decimal mark, if any.
------------------------------------------------------------------------
-- Originally this function accepted x+y/z where x, y, z were any valid
-- numbers, possibly with a sign. For example '1.23e+2+1.2/2.4' = 123.5,
-- and '2-3/8' = 1.625. However, such usages were found to be errors or
-- misunderstandings, so since August 2014 the following restrictions apply:
-- x (if present) is an integer or has a single digit after decimal mark
-- y and z are unsigned integers
-- e-notation is not accepted
-- The overall number can start with '+' or '-' (so '12+3/4' and '+12+3/4'
-- and '-12-3/4' are valid).
-- Any leading negative sign is removed by the caller, so only inputs
-- like the following are accepted here (may have whitespace):
-- negative = false false true (there was a leading '-')
-- text = '2/3' '+2/3' '2/3'
-- text = '1+2/3' '+1+2/3' '1-2/3'
-- text = '12.3+1/2' '+12.3+1/2' '12.3-1/2'
-- Values like '12.3+1/2' are accepted, but are intended only for use
-- with the hands unit (not worth adding code to enforce that).
------------------------------------------------------------------------
local leading_plus, prefix, numstr, slashes, denstr =
text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*(/+)%s*(%d+)%s*$')
if not leading_plus then
-- Accept a single U+2044 fraction slash because that may be pasted.
leading_plus, prefix, numstr, denstr =
text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*⁄%s*(%d+)%s*$')
slashes = '/'
end
local numerator = tonumber(numstr)
local denominator = tonumber(denstr)
if numerator == nil or denominator == nil or (negative and leading_plus ~= '') then
return nil
end
local whole, wholestr
if prefix == '' then
wholestr = ''
whole = 0
else
-- Any prefix must be like '12+' or '12-' (whole number and fraction sign);
-- '12.3+' and '12.3-' are also accepted (single digit after decimal point)
-- because '12.3+1/2 hands' is valid (12 hands 3½ inches).
local num1, num2, frac_sign = prefix:match('^(%d+)(%.?%d?)%s*([+%-])$')
if num1 == nil then return nil end
if num2 == '' then -- num2 must be '' or like '.1' but not '.' or '.12'
wholestr = num1
else
if #num2 ~= 2 then return nil end
wholestr = num1 .. num2
end
if frac_sign ~= (negative and '-' or '+') then return nil end
whole = tonumber(wholestr)
if whole == nil then return nil end
end
local value = whole + numerator / denominator
if not valid_number(value) then return nil end
local altvalue = whole + numerator / (denominator * 10)
local style = #slashes -- kludge: 1 or 2 slashes can be used to select style
if style > 2 then style = 2 end
local wikitext = format_fraction(parms, 'in', negative, leading_plus .. wholestr, numstr, denstr, parms.opt_spell_in, style)
return value, altvalue, wikitext, denominator
end
local function extract_number(parms, text, another, no_fraction)
-- Return true, info if can extract a number from text,
-- where info is a table with the result,
-- or return false, t where t is an error message table.
-- Input can use en digits or digits in local language and can
-- have references at the end. Accepting references is intended
-- for use in infoboxes with a field for a value passed to convert.
-- Parameter another = true if the expected value is not the first.
-- Before processing, the input text is cleaned:
-- * Any thousand separators (valid or not) are removed.
-- * Any sign is replaced with '-' (if negative) or '' (otherwise).
-- That replaces Unicode minus with '-'.
-- If successful, the returned info table contains named fields:
-- value = a valid number
-- altvalue = a valid number, usually same as value but different
-- if fraction used (for hands unit)
-- singular = true if value is 1 or -1 (to use singular form of units)
-- clean = cleaned text with any separators and sign removed
-- (en digits and '.' decimal mark)
-- show = text formatted for output, possibly with ref strip markers
-- (digits in local language and custom decimal mark)
-- The resulting show:
-- * Is for an input value and is spelled if wanted and possible.
-- * Has a rounded value, if wanted.
-- * Has digits grouped where necessary, if wanted.
-- * If negative, a Unicode minus is used; otherwise the sign is
-- '+' (if the input text used '+'), or is '' (if no sign in input).
text = strip(text or '')
local reference
local pos = text:find('\127', 1, true)
if pos then
local before = text:sub(1, pos - 1)
local remainder = text:sub(pos)
local refs = {}
while #remainder > 0 do
local ref, spaces
ref, spaces, remainder = remainder:match('^(\127[^\127]*UNIQ[^\127]*%-ref[^\127]*\127)(%s*)(.*)')
if ref then
table.insert(refs, ref)
else
refs = {}
break
end
end
if #refs > 0 then
text = strip(before)
reference = table.concat(refs)
end
end
local clean = to_en(text, parms)
if clean == '' then
return false, { another and 'cvt_no_num2' or 'cvt_no_num' }
end
local isnegative, propersign = false, '' -- most common case
local singular, show, denominator
local value = tonumber(clean)
local altvalue
if value then
local sign = clean:sub(1, 1)
if sign == '+' or sign == '-' then
propersign = (sign == '+') and '+' or MINUS
clean = clean:sub(2)
end
if value < 0 then
isnegative = true
value = -value
end
else
local valstr
for _, prefix in ipairs({ '-', MINUS, '−' }) do
-- Including '-' sets isnegative in case input is a fraction like '-2-3/4'.
local plen = #prefix
if clean:sub(1, plen) == prefix then
valstr = clean:sub(plen + 1)
if valstr:match('^%s') then -- "- 1" is invalid but "-1 - 1/2" is ok
return false, { 'cvt_bad_num', text }
end
break
end
end
if valstr then
isnegative = true
propersign = MINUS
clean = valstr
value = tonumber(clean)
end
if value == nil then
if not no_fraction then
value, altvalue, show, denominator = extract_fraction(parms, clean, isnegative)
end
if value == nil then
return false, { 'cvt_bad_num', text }
end
if value <= 1 then
singular = true -- for example, "½ mile" or "one half mile" (singular unit)
end
end
end
if not valid_number(value) then -- for example, "1e310" may overflow
return false, { 'cvt_invalid_num' }
end
if show == nil then
-- clean is a non-empty string with no spaces, and does not represent a fraction,
-- and value = tonumber(clean) is a number >= 0.
-- If the input uses e-notation, show will be displayed using a power of ten, but
-- we use the number as given so it might not be normalized scientific notation.
-- The input value is spelled if specified so any e-notation is ignored;
-- that allows input like 2e6 to be spelled as "two million" which works
-- because the spell module converts '2e6' to '2000000' before spelling.
local function rounded(value, default, exponent)
local precision = parms.opt_ri
if precision then
local fmt = '%.' .. format('%d', precision) .. 'f'
local result = fmt:format(tonumber(value) + 2e-14) -- fudge for some common cases of bad rounding
if not exponent then
singular = (tonumber(result) == 1)
end
return result
end
return default
end
singular = (value == 1)
local scientific
local significand, exponent = clean:match('^([%d.]+)[Ee]([+%-]?%d+)')
if significand then
show = with_exponent(parms, rounded(significand, significand, exponent), exponent)
scientific = true
else
show = with_separator(parms, rounded(value, clean))
end
show = propersign .. show
if parms.opt_spell_in then
show = spell_number(parms, 'in', propersign .. rounded(value, clean)) or show
scientific = false
end
if scientific then
parms.opt_scientific = true
end
end
if isnegative and (value ~= 0) then
value = -value
altvalue = -(altvalue or value)
end
return true, {
value = value,
altvalue = altvalue or value,
singular = singular,
clean = clean,
show = show .. (reference or ''),
denominator = denominator,
}
end
local function get_number(text)
-- Return v, f where:
-- v = nil (text is not a number)
-- or
-- v = value of text (text is a number)
-- f = true if value is an integer
-- Input can use en digits or digits in local language or separators,
-- but no Unicode minus, and no fraction.
if text then
local number = tonumber(to_en(text))
if number then
local _, fracpart = math.modf(number)
return number, (fracpart == 0)
end
end
end
local function gcd(a, b)
-- Return the greatest common denominator for the given values,
-- which are known to be positive integers.
if a > b then
a, b = b, a
end
if a <= 0 then
return b
end
local r = b % a
if r <= 0 then
return a
end
if r == 1 then
return 1
end
return gcd(r, a)
end
local function fraction_table(value, denominator)
-- Return value as a string or a table:
-- * If result is a string, there is no fraction, and the result
-- is value formatted as a string of en digits.
-- * If result is a table, it represents a fraction with named fields:
-- wholestr, numstr, denstr (strings of en digits for integer, numerator, denominator).
-- The result is rounded to the nearest multiple of (1/denominator).
-- If the multiple is zero, no fraction is included.
-- No fraction is included if value is very large as the fraction would
-- be unhelpful, particularly if scientific notation is required.
-- Input value is a non-negative number.
-- Input denominator is a positive integer for the desired fraction.
if value <= 0 then
return '0'
end
if denominator <= 0 or value > 1e8 then
return format('%.2f', value)
end
local integer, decimals = math.modf(value)
local numerator = floor((decimals * denominator) +
0.5 + 2e-14) -- add fudge for some common cases of bad rounding
if numerator >= denominator then
integer = integer + 1
numerator = 0
end
local wholestr = tostring(integer)
if numerator > 0 then
local div = gcd(numerator, denominator)
if div > 1 then
numerator = numerator / div
denominator = denominator / div
end
return {
wholestr = (integer > 0) and wholestr or '',
numstr = tostring(numerator),
denstr = tostring(denominator),
value = value,
}
end
return wholestr
end
local function preunits(count, preunit1, preunit2)
-- If count is 1:
-- ignore preunit2
-- return p1
-- else:
-- preunit1 is used for preunit2 if the latter is empty
-- return p1, p2
-- where:
-- p1 is text to insert before the input unit
-- p2 is text to insert before the output unit
-- p1 or p2 may be nil to mean "no preunit"
-- Using '+' gives output like "5+ feet" (no space before, but space after).
local function withspace(text, wantboth)
-- Return text with space before and, if wantboth, after.
-- However, no space is added if there is a space or ' ' or '-'
-- at that position ('-' is for adjectival text).
-- There is also no space if text starts with '&'
-- (e.g. '°' would display a degree symbol with no preceding space).
local char = text:sub(1, 1)
if char == '&' then
return text -- an html entity can be used to specify the exact display
end
if not (char == ' ' or char == '-' or char == '+') then
text = ' ' .. text
end
if wantboth then
char = text:sub(-1, -1)
if not (char == ' ' or char == '-' or text:sub(-6, -1) == ' ') then
text = text .. ' '
end
end
return text
end
local PLUS = '+ '
preunit1 = preunit1 or ''
local trim1 = strip(preunit1)
if count == 1 then
if trim1 == '' then
return nil
end
if trim1 == '+' then
return PLUS
end
return withspace(preunit1, true)
end
preunit1 = withspace(preunit1)
preunit2 = preunit2 or ''
local trim2 = strip(preunit2)
if trim1 == '+' then
if trim2 == '' or trim2 == '+' then
return PLUS, PLUS
end
preunit1 = PLUS
end
if trim2 == '' then
if trim1 == '' then
return nil, nil
end
preunit2 = preunit1
elseif trim2 == '+' then
preunit2 = PLUS
elseif trim2 == ' ' then -- trick to make preunit2 empty
preunit2 = nil
else
preunit2 = withspace(preunit2)
end
return preunit1, preunit2
end
local function range_text(range, want_name, parms, before, after, inout, options)
-- Return before .. rtext .. after
-- where rtext is the text that separates two values in a range.
local rtext, adj_text, exception
options = options or {}
if type(range) == 'table' then
-- Table must specify range text for ('off' and 'on') or ('input' and 'output'),
-- and may specify range text for 'adj=on',
-- and may specify exception = true.
rtext = range[want_name and 'off' or 'on'] or
range[((inout == 'in') == (parms.opt_flip == true)) and 'output' or 'input']
adj_text = range['adj']
exception = range['exception']
else
rtext = range
end
if parms.opt_adjectival then
if want_name or (exception and parms.abbr_org == 'on') then
rtext = adj_text or rtext:gsub(' ', '-'):gsub(' ', '-')
end
end
if rtext == '–' and (options.spaced or after:sub(1, #MINUS) == MINUS) then
rtext = ' – '
end
return before .. rtext .. after
end
local function get_composite(parms, iparm, in_unit_table)
-- Look for a composite input unit. For example, {{convert|1|yd|2|ft|3|in}}
-- would result in a call to this function with
-- iparm = 3 (parms[iparm] = "2", just after the first unit)
-- in_unit_table = (unit table for "yd"; contains value 1 for number of yards)
-- Return true, iparm, unit where
-- iparm = index just after the composite units (7 in above example)
-- unit = composite unit table holding all input units,
-- or return true if no composite unit is present in parms,
-- or return false, t where t is an error message table.
local default, subinfo
local composite_units, count = { in_unit_table }, 1
local fixups = {}
local total = in_unit_table.valinfo[1].value
local subunit = in_unit_table
while subunit.subdivs do -- subdivs is nil or a table of allowed subdivisions
local subcode = strip(parms[iparm+1])
local subdiv = subunit.subdivs[subcode] or subunit.subdivs[(all_units[subcode] or {}).target]
if not subdiv then
break
end
local success
success, subunit = lookup(parms, subcode, 'no_combination')
if not success then return false, subunit end -- should never occur
success, subinfo = extract_number(parms, parms[iparm])
if not success then return false, subinfo end
iparm = iparm + 2
subunit.inout = 'in'
subunit.valinfo = { subinfo }
-- Recalculate total as a number of subdivisions.
-- subdiv[1] = number of subdivisions per previous unit (integer > 1).
total = total * subdiv[1] + subinfo.value
if not default then -- set by the first subdiv with a default defined
default = subdiv.default
end
count = count + 1
composite_units[count] = subunit
if subdiv.unit or subdiv.name then
fixups[count] = { unit = subdiv.unit, name = subdiv.name, valinfo = subunit.valinfo }
end
end
if count == 1 then
return true -- no error and no composite unit
end
for i, fixup in pairs(fixups) do
local unit = fixup.unit
local name = fixup.name
if not unit or (count > 2 and name) then
composite_units[i].fixed_name = name
else
local success, alternate = lookup(parms, unit, 'no_combination')
if not success then return false, alternate end -- should never occur
alternate.inout = 'in'
alternate.valinfo = fixup.valinfo
composite_units[i] = alternate
end
end
return true, iparm, {
utype = in_unit_table.utype,
scale = subunit.scale, -- scale of last (least significant) unit
valinfo = { { value = total, clean = subinfo.clean, denominator = subinfo.denominator } },
composite = composite_units,
default = default or in_unit_table.default
}
end
local function translate_parms(parms, kv_pairs)
-- Update fields in parms by translating each key:value in kv_pairs to terms
-- used by this module (may involve translating from local language to English).
-- Also, checks are performed which may display warnings, if enabled.
-- Return true if successful or return false, t where t is an error message table.
currency_text = nil -- local testing can hold module in memory; must clear globals
if kv_pairs.adj and kv_pairs.sing then
-- For enwiki (before translation), warn if attempt to use adj and sing
-- as the latter is a deprecated alias for the former.
if kv_pairs.adj ~= kv_pairs.sing and kv_pairs.sing ~= '' then
add_warning(parms, 1, 'cvt_unknown_option', 'sing=' .. kv_pairs.sing)
end
kv_pairs.sing = nil
end
kv_pairs.comma = kv_pairs.comma or config.comma -- for plwiki who want default comma=5
for loc_name, loc_value in pairs(kv_pairs) do
local en_name = text_code.en_option_name[loc_name]
if en_name then
local en_value = text_code.en_option_value[en_name]
if en_value == 'INTEGER' then -- altitude_ft, altitude_m, frac, sigfig
en_value = nil
if loc_value == '' then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
else
local minimum
local number, is_integer = get_number(loc_value)
if en_name == 'sigfig' then
minimum = 1
elseif en_name == 'frac' then
minimum = 2
if number and number < 0 then
parms.opt_fraction_horizontal = true
number = -number
end
else
minimum = -1e6
end
if number and is_integer and number >= minimum then
en_value = number
else
local m
if en_name == 'frac' then
m = 'cvt_bad_frac'
elseif en_name == 'sigfig' then
m = 'cvt_bad_sigfig'
else
m = 'cvt_bad_altitude'
end
add_warning(parms, 1, m, loc_name .. '=' .. loc_value)
end
end
elseif en_value == 'TEXT' then -- $, input, qid, qual, stylein, styleout, tracking
en_value = loc_value ~= '' and loc_value or nil -- accept non-empty user text with no validation
if not en_value and (en_name == '$' or en_name == 'qid' or en_name == 'qual') then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
elseif en_name == '$' then
-- Value should be a single character like "€" for the euro currency symbol, but anything is accepted.
currency_text = (loc_value == 'euro') and '€' or loc_value
elseif en_name == 'input' then
-- May have something like {{convert|input=}} (empty input) if source is an infobox
-- with optional fields. In that case, want to output nothing rather than an error.
parms.input_text = loc_value -- keep input because parms.input is nil if loc_value == ''
end
else
en_value = en_value[loc_value]
if en_value and en_value:sub(-1) == '?' then
en_value = en_value:sub(1, -2)
add_warning(parms, -1, 'cvt_deprecated', loc_name .. '=' .. loc_value)
end
if en_value == nil then
if loc_value == '' then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
else
add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value)
end
elseif en_value == '' then
en_value = nil -- an ignored option like adj=off
elseif type(en_value) == 'string' and en_value:sub(1, 4) == 'opt_' then
for _, v in ipairs(split(en_value, ',')) do
local lhs, rhs = v:match('^(.-)=(.+)$')
if rhs then
parms[lhs] = tonumber(rhs) or rhs
else
parms[v] = true
end
end
en_value = nil
end
end
parms[en_name] = en_value
else
add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value)
end
end
local abbr_entered = parms.abbr
local cfg_abbr = config.abbr
if cfg_abbr then
-- Don't warn if invalid because every convert would show that warning.
if cfg_abbr == 'on always' then
parms.abbr = 'on'
elseif cfg_abbr == 'off always' then
parms.abbr = 'off'
elseif parms.abbr == nil then
if cfg_abbr == 'on default' then
parms.abbr = 'on'
elseif cfg_abbr == 'off default' then
parms.abbr = 'off'
end
end
end
if parms.abbr then
if parms.abbr == 'unit' then
parms.abbr = 'on'
parms.number_word = true
end
parms.abbr_org = parms.abbr -- original abbr, before any flip
elseif parms.opt_hand_hh then
parms.abbr_org = 'on'
parms.abbr = 'on'
else
parms.abbr = 'out' -- default is to abbreviate output only (use symbol, not name)
end
if parms.opt_order_out then
-- Disable options that do not work in a useful way with order=out.
parms.opt_flip = nil -- override adj=flip
parms.opt_spell_in = nil
parms.opt_spell_out = nil
parms.opt_spell_upper = nil
end
if parms.opt_spell_out and not abbr_entered then
parms.abbr = 'off' -- should show unit name when spelling the output value
end
if parms.opt_flip then
local function swap_in_out(option)
local value = parms[option]
if value == 'in' then
parms[option] = 'out'
elseif value == 'out' then
parms[option] = 'in'
end
end
swap_in_out('abbr')
swap_in_out('lk')
if parms.opt_spell_in and not parms.opt_spell_out then
-- For simplicity, and because it does not appear to be needed,
-- user cannot set an option to spell the output only.
parms.opt_spell_in = nil
parms.opt_spell_out = true
end
end
if parms.opt_spell_upper then
parms.spell_upper = parms.opt_flip and 'out' or 'in'
end
if parms.opt_table or parms.opt_tablecen then
if abbr_entered == nil and parms.lk == nil then
parms.opt_values = true
end
parms.table_align = parms.opt_table and 'right' or 'center'
end
if parms.table_align or parms.opt_sortable_on then
parms.need_table_or_sort = true
end
local disp_joins = text_code.disp_joins
local default_joins = disp_joins['b']
parms.join_between = default_joins[3] or '; '
local disp = parms.disp
if disp == nil then -- special case for the most common setting
parms.joins = default_joins
elseif disp == 'x' then
-- Later, parms.joins is set from the input parameters.
else
-- Old template does this.
local abbr = parms.abbr
if disp == 'slash' then
if abbr_entered == nil then
disp = 'slash-nbsp'
elseif abbr == 'in' or abbr == 'out' then
disp = 'slash-sp'
else
disp = 'slash-nosp'
end
elseif disp == 'sqbr' then
if abbr == 'on' then
disp = 'sqbr-nbsp'
else
disp = 'sqbr-sp'
end
end
parms.joins = disp_joins[disp] or default_joins
parms.join_between = parms.joins[3] or parms.join_between
parms.wantname = parms.joins.wantname
end
if (en_default and not parms.opt_lang_local and (parms[1] or ''):find('%d')) or parms.opt_lang_en then
from_en_table = nil
end
if en_default and from_en_table then
-- For hiwiki: localized symbol/name is defined with the US symbol/name field,
-- and is used if output uses localized numbers.
parms.opt_sp_us = true
end
return true
end
local function get_values(parms)
-- If successful, update parms and return true, v, i where
-- v = table of input values
-- i = index to next entry in parms after those processed here
-- or return false, t where t is an error message table.
local valinfo = collection() -- numbered table of input values
local range = collection() -- numbered table of range items (having, for example, 2 range items requires 3 input values)
local had_nocomma -- true if removed "nocomma" kludge from second parameter (like "tonocomma")
local parm2 = strip(parms[2])
if parm2 and parm2:sub(-7, -1) == 'nocomma' then
parms[2] = strip(parm2:sub(1, -8))
parms.opt_nocomma = true
had_nocomma = true
end
local function extractor(i)
-- If the parameter is not a value, try unpacking it as a range ("1-23" for "1 to 23").
-- However, "-1-2/3" is a negative fraction (-1⅔), so it must be extracted first.
-- Do not unpack a parameter if it is like "3-1/2" which is sometimes incorrectly
-- used instead of "3+1/2" (and which should not be interpreted as "3 to ½").
-- Unpacked items are inserted into the parms table.
-- The tail recursion allows combinations like "1x2 to 3x4".
local valstr = strip(parms[i]) -- trim so any '-' as a negative sign will be at start
local success, result = extract_number(parms, valstr, i > 1)
if not success and valstr and i < 20 then -- check i to limit abuse
local lhs, sep, rhs = valstr:match('^(%S+)%s+(%S+)%s+(%S.*)')
if lhs and not (sep == '-' and rhs:match('/')) then
if sep:find('%d') then
return success, result -- to reject {{convert|1 234 567|m}} with a decent message (en only)
end
parms[i] = rhs
table.insert(parms, i, sep)
table.insert(parms, i, lhs)
return extractor(i)
end
if not valstr:match('%-.*/') then
for _, sep in ipairs(text_code.ranges.words) do
local start, stop = valstr:find(sep, 2, true) -- start at 2 to skip any negative sign for range '-'
if start then
parms[i] = valstr:sub(stop + 1)
table.insert(parms, i, sep)
table.insert(parms, i, valstr:sub(1, start - 1))
return extractor(i)
end
end
end
end
return success, result
end
local i = 1
local is_change
while true do
local success, info = extractor(i) -- need to set parms.opt_nocomma before calling this
if not success then return false, info end
i = i + 1
if is_change then
info.is_change = true -- value is after "±" and so is a change (significant for range like {{convert|5|±|5|°C}})
is_change = nil
end
valinfo:add(info)
local range_item = get_range(strip(parms[i]))
if not range_item then
break
end
i = i + 1
range:add(range_item)
if type(range_item) == 'table' then
-- For range "x", if append unit to some values, append it to all.
parms.in_range_x = parms.in_range_x or range_item.in_range_x
parms.out_range_x = parms.out_range_x or range_item.out_range_x
parms.abbr_range_x = parms.abbr_range_x or range_item.abbr_range_x
is_change = range_item.is_range_change
end
end
if range.n > 0 then
if range.n > 30 then -- limit abuse, although 4 is a more likely upper limit
return false, { 'cvt_invalid_num' } -- misleading message but it will do
end
parms.range = range
elseif had_nocomma then
return false, { 'cvt_unknown', parm2 }
end
return true, valinfo, i
end
local function simple_get_values(parms)
-- If input is like "{{convert|valid_value|valid_unit|...}}",
-- return true, i, in_unit, in_unit_table
-- i = index in parms of what follows valid_unit, if anything.
-- The valid_value is not negative and does not use a fraction, and
-- no options requiring further processing of the input are used.
-- Otherwise, return nothing or return false, parm1 for caller to interpret.
-- Testing shows this function is successful for 96% of converts in articles,
-- and that on average it speeds up converts by 8%.
local clean = to_en(strip(parms[1] or ''), parms)
if parms.opt_ri or parms.opt_spell_in or #clean > 10 or not clean:match('^[0-9.]+$') then
return false, clean
end
local value = tonumber(clean)
if not value then return end
local info = {
value = value,
altvalue = value,
singular = (value == 1),
clean = clean,
show = with_separator(parms, clean),
}
local in_unit = strip(parms[2])
local success, in_unit_table = lookup(parms, in_unit, 'no_combination')
if not success then return end
in_unit_table.valinfo = { info }
return true, 3, in_unit, in_unit_table
end
local function wikidata_call(parms, operation, ...)
-- Return true, s where s is the result of a Wikidata operation,
-- or return false, t where t is an error message table.
local function worker(...)
wikidata_code = wikidata_code or require(wikidata_module)
wikidata_data = wikidata_data or mw.loadData(wikidata_data_module)
return wikidata_code[operation](wikidata_data, ...)
end
local success, status, result = pcall(worker, ...)
if success then
return status, result
end
if parms.opt_sortable_debug then
-- Use debug=yes to crash if an error while accessing Wikidata.
error('Error accessing Wikidata: ' .. status, 0)
end
return false, { 'cvt_wd_fail' }
end
local function get_parms(parms, args)
-- If successful, update parms and return true, unit where
-- parms is a table of all arguments passed to the template
-- converted to named arguments, and
-- unit is the input unit table;
-- or return false, t where t is an error message table.
-- For special processing (not a convert), can also return
-- true, wikitext where wikitext is the final result.
-- The returned input unit table may be for a fake unit using the specified
-- unit code as the symbol and name, and with bad_mcode = message code table.
-- MediaWiki removes leading and trailing whitespace from the values of
-- named arguments. However, the values of numbered arguments include any
-- whitespace entered in the template, and whitespace is used by some
-- parameters (example: the numbered parameters associated with "disp=x").
local kv_pairs = {} -- table of input key:value pairs where key is a name; needed because cannot iterate parms and add new fields to it
for k, v in pairs(args) do
if type(k) == 'number' or k == 'test' then -- parameter "test" is reserved for testing and is not translated
parms[k] = v
else
kv_pairs[k] = v
end
end
if parms.test == 'wikidata' then
local ulookup = function (ucode)
-- Use empty table for parms so it does not accumulate results when used repeatedly.
return lookup({}, ucode, 'no_combination')
end
return wikidata_call(parms, '_listunits', ulookup)
end
local success, msg = translate_parms(parms, kv_pairs)
if not success then return false, msg end
if parms.input then
success, msg = wikidata_call(parms, '_adjustparameters', parms, 1)
if not success then return false, msg end
end
local success, i, in_unit, in_unit_table = simple_get_values(parms)
if not success then
if type(i) == 'string' and i:match('^NNN+$') then
-- Some infoboxes have examples like {{convert|NNN|m}} (3 or more "N").
-- Output an empty string for these.
return false, { 'cvt_no_output' }
end
local valinfo
success, valinfo, i = get_values(parms)
if not success then return false, valinfo end
in_unit = strip(parms[i])
i = i + 1
success, in_unit_table = lookup(parms, in_unit, 'no_combination')
if not success then
in_unit = in_unit or ''
if parms.opt_ignore_error then -- display given unit code with no error (for use with {{val}})
in_unit_table = '' -- suppress error message and prevent processing of output unit
end
in_unit_table = setmetatable({
symbol = in_unit, name2 = in_unit, utype = in_unit,
scale = 1, default = '', defkey = '', linkey = '',
bad_mcode = in_unit_table }, unit_mt)
end
in_unit_table.valinfo = valinfo
end
if parms.test == 'msg' then
-- Am testing the messages produced when no output unit is specified, and
-- the input unit has a missing or invalid default.
-- Set two units for testing that.
-- LATER: Remove this code.
if in_unit == 'chain' then
in_unit_table.default = nil -- no default
elseif in_unit == 'rd' then
in_unit_table.default = "ft!X!m" -- an invalid expression
end
end
in_unit_table.inout = 'in' -- this is an input unit
if not parms.range then
local success, inext, composite_unit = get_composite(parms, i, in_unit_table)
if not success then return false, inext end
if composite_unit then
in_unit_table = composite_unit
i = inext
end
end
if in_unit_table.builtin == 'mach' then
-- As with old template, a number following Mach as the input unit is the altitude.
-- That is deprecated: should use altitude_ft=NUMBER or altitude_m=NUMBER.
local success, info
success = tonumber(parms[i]) -- this will often work and will give correct result for values like 2e4 without forcing output scientific notation
if success then
info = { value = success }
else
success, info = extract_number(parms, parms[i], false, true)
end
if success then
i = i + 1
in_unit_table.altitude = info.value
end
end
local word = strip(parms[i])
i = i + 1
local precision, is_bad_precision
local function set_precision(text)
local number, is_integer = get_number(text)
if number then
if is_integer then
precision = number
else
precision = text
is_bad_precision = true
end
return true -- text was used for precision, good or bad
end
end
if word and not set_precision(word) then
parms.out_unit = parms.out_unit or word
if set_precision(strip(parms[i])) then
i = i + 1
end
end
if parms.opt_adj_mid then
word = parms[i]
i = i + 1
if word then -- mid-text words
if word:sub(1, 1) == '-' then
parms.mid = word
else
parms.mid = ' ' .. word
end
end
end
if parms.opt_one_preunit then
parms[parms.opt_flip and 'preunit2' or 'preunit1'] = preunits(1, parms[i])
i = i + 1
end
if parms.disp == 'x' then
-- Following is reasonably compatible with the old template.
local first = parms[i] or ''
local second = parms[i+1] or ''
i = i + 2
if strip(first) == '' then -- user can enter ' ' rather than ' ' to avoid the default
first = ' [ ' .. first
second = ' ]' .. second
end
parms.joins = { first, second }
elseif parms.opt_two_preunits then
local p1, p2 = preunits(2, parms[i], parms[i+1])
i = i + 2
if parms.preunit1 then
-- To simplify documentation, allow unlikely use of adj=pre with disp=preunit
-- (however, an output unit must be specified with adj=pre and with disp=preunit).
parms.preunit1 = parms.preunit1 .. p1
parms.preunit2 = p2
else
parms.preunit1, parms.preunit2 = p1, p2
end
end
if precision == nil then
if set_precision(strip(parms[i])) then
i = i + 1
end
end
if is_bad_precision then
add_warning(parms, 1, 'cvt_bad_prec', precision)
else
parms.precision = precision
end
for j = i, i + 3 do
local parm = parms[j] -- warn if find a non-empty extraneous parameter
if parm and parm:match('%S') then
add_warning(parms, 1, 'cvt_unknown_option', parm)
break
end
end
return true, in_unit_table
end
local function record_default_precision(parms, out_current, precision)
-- If necessary, adjust parameters and return a possibly adjusted precision.
-- When converting a range of values where a default precision is required,
-- that default is calculated for each value because the result sometimes
-- depends on the precise input and output values. This function may cause
-- the entire convert process to be repeated in order to ensure that the
-- same default precision is used for each individual convert.
-- If that were not done, a range like 1000 to 1000.4 may give poor results
-- because the first output could be heavily rounded, while the second is not.
-- For range 1000.4 to 1000, this function can give the second convert the
-- same default precision that was used for the first.
if not parms.opt_round_each then
local maxdef = out_current.max_default_precision
if maxdef then
if maxdef < precision then
parms.do_convert_again = true
out_current.max_default_precision = precision
else
precision = out_current.max_default_precision
end
else
out_current.max_default_precision = precision
end
end
return precision
end
local function default_precision(parms, invalue, inclean, denominator, outvalue, in_current, out_current, extra)
-- Return a default value for precision (an integer like 2, 0, -2).
-- If denominator is not nil, it is the value of the denominator in inclean.
-- Code follows procedures used in old template.
local fudge = 1e-14 -- {{Order of magnitude}} adds this, so we do too
local prec, minprec, adjust
local subunit_ignore_trailing_zero
local subunit_more_precision -- kludge for "in" used in input like "|2|ft|6|in"
local composite = in_current.composite
if composite then
subunit_ignore_trailing_zero = true -- input "|2|st|10|lb" has precision 0, not -1
if composite[#composite].exception == 'subunit_more_precision' then
subunit_more_precision = true -- do not use standard precision with input like "|2|ft|6|in"
end
end
if denominator and denominator > 0 then
prec = math.max(log10(denominator), 1)
else
-- Count digits after decimal mark, handling cases like '12.345e6'.
local exponent
local integer, dot, decimals, expstr = inclean:match('^(%d*)(%.?)(%d*)(.*)')
local e = expstr:sub(1, 1)
if e == 'e' or e == 'E' then
exponent = tonumber(expstr:sub(2))
end
if dot == '' then
prec = subunit_ignore_trailing_zero and 0 or -integer:match('0*$'):len()
else
prec = #decimals
end
if exponent then
-- So '1230' and '1.23e3' both give prec = -1, and '0.00123' and '1.23e-3' give 5.
prec = prec - exponent
end
end
if in_current.istemperature and out_current.istemperature then
-- Converting between common temperatures (°C, °F, °R, K); not keVT.
-- Kelvin value can be almost zero, or small but negative due to precision problems.
-- Also, an input value like -300 C (below absolute zero) gives negative kelvins.
-- Calculate minimum precision from absolute value.
adjust = 0
local kelvin = abs((invalue - in_current.offset) * in_current.scale)
if kelvin < 1e-8 then -- assume nonzero due to input or calculation precision problem
minprec = 2
else
minprec = 2 - floor(log10(kelvin) + fudge) -- 3 sigfigs in kelvin
end
else
if invalue == 0 or outvalue <= 0 then
-- We are never called with a negative outvalue, but it might be zero.
-- This is special-cased to avoid calculation exceptions.
return record_default_precision(parms, out_current, 0)
end
if out_current.exception == 'integer_more_precision' and floor(invalue) == invalue then
-- With certain output units that sometimes give poor results
-- with default rounding, use more precision when the input
-- value is equal to an integer. An example of a poor result
-- is when input 50 gives a smaller output than input 49.5.
-- Experiment shows this helps, but it does not eliminate all
-- surprises because it is not clear whether "50" should be
-- interpreted as "from 45 to 55" or "from 49.5 to 50.5".
adjust = -log10(in_current.scale)
elseif subunit_more_precision then
-- Conversion like "{{convert|6|ft|1|in|cm}}" (where subunit is "in")
-- has a non-standard adjust value, to give more output precision.
adjust = log10(out_current.scale) + 2
else
adjust = log10(abs(invalue / outvalue))
end
adjust = adjust + log10(2)
-- Ensure that the output has at least two significant figures.
minprec = 1 - floor(log10(outvalue) + fudge)
end
if extra then
adjust = extra.adjust or adjust
minprec = extra.minprec or minprec
end
return record_default_precision(parms, out_current, math.max(floor(prec + adjust), minprec))
end
local function convert(parms, invalue, info, in_current, out_current)
-- Convert given input value from one unit to another.
-- Return output_value (a number) if a simple convert, or
-- return f, t where
-- f = true, t = table of information with results, or
-- f = false, t = error message table.
local inscale = in_current.scale
local outscale = out_current.scale
if not in_current.iscomplex and not out_current.iscomplex then
return invalue * (inscale / outscale) -- minimize overhead for most common case
end
if in_current.invert or out_current.invert then
-- Inverted units, such as inverse length, inverse time, or
-- fuel efficiency. Built-in units do not have invert set.
if (in_current.invert or 1) * (out_current.invert or 1) < 0 then
return 1 / (invalue * inscale * outscale)
end
return invalue * (inscale / outscale)
elseif in_current.offset then
-- Temperature (there are no built-ins for this type of unit).
if info.is_change then
return invalue * (inscale / outscale)
end
return (invalue - in_current.offset) * (inscale / outscale) + out_current.offset
else
-- Built-in unit.
local in_builtin = in_current.builtin
local out_builtin = out_current.builtin
if in_builtin and out_builtin then
if in_builtin == out_builtin then
return invalue
end
-- There are no cases (yet) where need to convert from one
-- built-in unit to another, so this should never occur.
return false, { 'cvt_bug_convert' }
end
if in_builtin == 'mach' or out_builtin == 'mach' then
-- Should check that only one altitude is given but am planning to remove
-- in_current.altitude (which can only occur when Mach is the input unit),
-- and out_current.altitude cannot occur.
local alt = parms.altitude_ft or in_current.altitude
if not alt and parms.altitude_m then
alt = parms.altitude_m / 0.3048 -- 1 ft = 0.3048 m
end
local spd = speed_of_sound(alt)
if in_builtin == 'mach' then
inscale = spd
return invalue * (inscale / outscale)
end
outscale = spd
local adjust = 0.1 / inscale
return true, {
outvalue = invalue * (inscale / outscale),
adjust = log10(adjust) + log10(2),
}
elseif in_builtin == 'hand' then
-- 1 hand = 4 inches; 1.2 hands = 6 inches.
-- Decimals of a hand are only defined for the first digit, and
-- the first fractional digit should be a number of inches (1, 2 or 3).
-- However, this code interprets the entire fractional part as the number
-- of inches / 10 (so 1.75 inches would be 0.175 hands).
-- A value like 12.3 hands is exactly 12*4 + 3 inches; base default precision on that.
local integer, fracpart = math.modf(invalue)
local inch_value = 4 * integer + 10 * fracpart -- equivalent number of inches
local factor = inscale / outscale
if factor == 4 then
-- Am converting to inches: show exact result, and use "inches" not "in" by default.
if parms.abbr_org == nil then
out_current.usename = true
end
local show = format('%g', abs(inch_value)) -- show and clean are unsigned
if not show:find('e', 1, true) then
return true, {
invalue = inch_value,
outvalue = inch_value,
clean = show,
show = show,
}
end
end
local outvalue = (integer + 2.5 * fracpart) * factor
local fracstr = info.clean:match('%.(.*)') or ''
local fmt
if fracstr == '' then
fmt = '%.0f'
else
fmt = '%.' .. format('%d', #fracstr - 1) .. 'f'
end
return true, {
invalue = inch_value,
clean = format(fmt, inch_value),
outvalue = outvalue,
minprec = 0,
}
end
end
return false, { 'cvt_bug_convert' } -- should never occur
end
local function user_style(parms, i)
-- Return text for a user-specified style for a table cell, or '' if none,
-- given i = 1 (input style) or 2 (output style).
local style = parms[(i == 1) and 'stylein' or 'styleout']
if style then
style = style:gsub('"', '')
if style ~= '' then
if style:sub(-1) ~= ';' then
style = style .. ';'
end
return style
end
end
return ''
end
local function make_table_or_sort(parms, invalue, info, in_current, scaled_top)
-- Set options to handle output for a table or a sort key, or both.
-- The text sort key is based on the value resulting from converting
-- the input to a fake base unit with scale = 1, and other properties
-- required for a conversion derived from the input unit.
-- For other modules, return the sort key in a hidden span element, and
-- the scaled value used to generate the sort key.
-- If scaled_top is set, it is the scaled value of the numerator of a per unit
-- to be combined with this unit (the denominator) to make the sort key.
-- Scaling only works with units that convert with a factor (not temperature).
local sortkey, scaled_value
if parms.opt_sortable_on then
local base = { -- a fake unit with enough fields for a valid convert
scale = 1,
invert = in_current.invert and 1,
iscomplex = in_current.iscomplex,
offset = in_current.offset and 0,
}
local outvalue, extra = convert(parms, invalue, info, in_current, base)
if extra then
outvalue = extra.outvalue
end
if in_current.istemperature then
-- Have converted to kelvin; assume numbers close to zero have a
-- rounding error and should be zero.
if abs(outvalue) < 1e-12 then
outvalue = 0
end
end
if scaled_top and outvalue ~= 0 then
outvalue = scaled_top / outvalue
end
scaled_value = outvalue
if not valid_number(outvalue) then
if outvalue < 0 then
sortkey = '1000000000000000000'
else
sortkey = '9000000000000000000'
end
elseif outvalue == 0 then
sortkey = '5000000000000000000'
else
local mag = floor(log10(abs(outvalue)) + 1e-14)
local prefix
if outvalue > 0 then
prefix = 7000 + mag
else
prefix = 2999 - mag
outvalue = outvalue + 10^(mag+1)
end
sortkey = format('%d', prefix) .. format('%015.0f', floor(outvalue * 10^(14-mag)))
end
end
local sortspan
if sortkey and not parms.table_align then
sortspan = parms.opt_sortable_debug and
'<span data-sort-value="' .. sortkey .. '♠"><span style="border:1px solid">' .. sortkey .. '♠</span></span>' or
'<span data-sort-value="' .. sortkey .. '♠"></span>'
parms.join_before = sortspan
end
if parms.table_align then
local sort
if sortkey then
sort = ' data-sort-value="' .. sortkey .. '"'
if parms.opt_sortable_debug then
parms.join_before = '<span style="border:1px solid">' .. sortkey .. '</span>'
end
else
sort = ''
end
local style = 'style="text-align:' .. parms.table_align .. ';'
local joins = {}
for i = 1, 2 do
joins[i] = (i == 1 and '' or '\n|') .. style .. user_style(parms, i) .. '"' .. sort .. '|'
end
parms.table_joins = joins
end
return sortspan, scaled_value
end
local cvt_to_hand
local function cvtround(parms, info, in_current, out_current)
-- Return true, t where t is a table with the conversion results; fields:
-- show = rounded, formatted string with the result of converting value in info,
-- using the rounding specified in parms.
-- singular = true if result (after rounding and ignoring any negative sign)
-- is "1", or like "1.00", or is a fraction with value < 1;
-- (and more fields shown below, and a calculated 'absvalue' field).
-- or return false, t where t is an error message table.
-- Input info.clean uses en digits (it has been translated, if necessary).
-- Output show uses en or non-en digits as appropriate, or can be spelled.
if out_current.builtin == 'hand' then
return cvt_to_hand(parms, info, in_current, out_current)
end
local invalue = in_current.builtin == 'hand' and info.altvalue or info.value
local outvalue, extra = convert(parms, invalue, info, in_current, out_current)
if parms.need_table_or_sort then
parms.need_table_or_sort = nil -- process using first input value only
make_table_or_sort(parms, invalue, info, in_current)
end
if extra then
if not outvalue then return false, extra end
invalue = extra.invalue or invalue
outvalue = extra.outvalue
end
if not valid_number(outvalue) then
return false, { 'cvt_invalid_num' }
end
local isnegative
if outvalue < 0 then
isnegative = true
outvalue = -outvalue
end
local precision, show, exponent
local denominator = out_current.frac
if denominator then
show = fraction_table(outvalue, denominator)
else
precision = parms.precision
if not precision then
if parms.sigfig then
show, exponent = make_sigfig(outvalue, parms.sigfig)
elseif parms.opt_round then
local n = parms.opt_round
if n == 0.5 then
local integer, fracpart = math.modf(floor(2 * outvalue + 0.5) / 2)
if fracpart == 0 then
show = format('%.0f', integer)
else
show = format('%.1f', integer + fracpart)
end
else
show = format('%.0f', floor((outvalue / n) + 0.5) * n)
end
elseif in_current.builtin == 'mach' then
local sigfig = info.clean:gsub('^[0.]+', ''):gsub('%.', ''):len() + 1
show, exponent = make_sigfig(outvalue, sigfig)
else
local inclean = info.clean
if extra then
inclean = extra.clean or inclean
show = extra.show
end
if not show then
precision = default_precision(parms, invalue, inclean, info.denominator, outvalue, in_current, out_current, extra)
end
end
end
end
if precision then
if precision >= 0 then
local fudge
if precision <= 8 then
-- Add a fudge to handle common cases of bad rounding due to inability
-- to precisely represent some values. This makes the following work:
-- {{convert|-100.1|C|K}} and {{convert|5555000|um|m|2}}.
-- Old template uses #expr round, which invokes PHP round().
-- LATER: Investigate how PHP round() works.
fudge = 2e-14
else
fudge = 0
end
local fmt = '%.' .. format('%d', precision) .. 'f'
local success
success, show = pcall(format, fmt, outvalue + fudge)
if not success then
return false, { 'cvt_big_prec', tostring(precision) }
end
else
precision = -precision -- #digits to zero (in addition to any digits after dot)
local shift = 10 ^ precision
show = format('%.0f', outvalue/shift)
if show ~= '0' then
exponent = #show + precision
end
end
end
local t = format_number(parms, show, exponent, isnegative)
if type(show) == 'string' then
-- Set singular using match because on some systems 0.99999999999999999 is 1.0.
if exponent then
t.singular = (exponent == 1 and show:match('^10*$'))
else
t.singular = (show == '1' or show:match('^1%.0*$'))
end
else
t.fraction_table = show
t.singular = (outvalue <= 1) -- cannot have 'fraction == 1', but if it were possible it would be singular
end
t.raw_absvalue = outvalue -- absolute value before rounding
return true, setmetatable(t, {
__index = function (self, key)
if key == 'absvalue' then
-- Calculate absolute value after rounding, if needed.
local clean, exponent = rawget(self, 'clean'), rawget(self, 'exponent')
local value = tonumber(clean) -- absolute value (any negative sign has been ignored)
if exponent then
value = value * 10^exponent
end
rawset(self, key, value)
return value
end
end })
end
function cvt_to_hand(parms, info, in_current, out_current)
-- Convert input to hands, inches.
-- Return true, t where t is a table with the conversion results;
-- or return false, t where t is an error message table.
if parms.abbr_org == nil then
out_current.usename = true -- default is to show name not symbol
end
local precision = parms.precision
local frac = out_current.frac
if not frac and precision and precision > 1 then
frac = (precision == 2) and 2 or 4
end
local out_next = out_current.out_next
if out_next then
-- Use magic knowledge to determine whether the next unit is inches without requiring i18n.
-- The following ensures that when the output combination "hand in" is used, the inches
-- value is rounded to match the hands value. Also, displaying say "61½" instead of 61.5
-- is better as 61.5 implies the value is not 61.4.
if out_next.exception == 'subunit_more_precision' then
out_next.frac = frac
end
end
-- Convert to inches; calculate hands from that.
local dummy_unit_table = { scale = out_current.scale / 4, frac = frac }
local success, outinfo = cvtround(parms, info, in_current, dummy_unit_table)
if not success then return false, outinfo end
local tfrac = outinfo.fraction_table
local inches = outinfo.raw_absvalue
if tfrac then
inches = floor(inches) -- integer part only; fraction added later
else
inches = floor(inches + 0.5) -- a hands measurement never shows decimals of an inch
end
local hands, inches = divide(inches, 4)
outinfo.absvalue = hands + inches/4 -- supposed to be the absolute rounded value, but this is close enough
local inchstr = tostring(inches) -- '0', '1', '2' or '3'
if precision and precision <= 0 then -- using negative or 0 for precision rounds to nearest hand
hands = floor(outinfo.raw_absvalue/4 + 0.5)
inchstr = ''
elseif tfrac then
-- Always show an integer before fraction (like "15.0½") because "15½" means 15-and-a-half hands.
inchstr = numdot .. format_fraction(parms, 'out', false, inchstr, tfrac.numstr, tfrac.denstr)
else
inchstr = numdot .. from_en(inchstr)
end
outinfo.show = outinfo.sign .. with_separator(parms, format('%.0f', hands)) .. inchstr
return true, outinfo
end
local function evaluate_condition(value, condition)
-- Return true or false from applying a conditional expression to value,
-- or throw an error if invalid.
-- A very limited set of expressions is supported:
-- v < 9
-- v * 9 < 9
-- where
-- 'v' is replaced with value
-- 9 is any number (as defined by Lua tonumber)
-- only en digits are accepted
-- '<' can also be '<=' or '>' or '>='
-- In addition, the following form is supported:
-- LHS and RHS
-- where
-- LHS, RHS = any of above expressions.
local function compare(value, text)
local arithop, factor, compop, limit = text:match('^%s*v%s*([*]?)(.-)([<>]=?)(.*)$')
if arithop == nil then
error('Invalid default expression', 0)
elseif arithop == '*' then
factor = tonumber(factor)
if factor == nil then
error('Invalid default expression', 0)
end
value = value * factor
end
limit = tonumber(limit)
if limit == nil then
error('Invalid default expression', 0)
end
if compop == '<' then
return value < limit
elseif compop == '<=' then
return value <= limit
elseif compop == '>' then
return value > limit
elseif compop == '>=' then
return value >= limit
end
error('Invalid default expression', 0) -- should not occur
end
local lhs, rhs = condition:match('^(.-%W)and(%W.*)')
if lhs == nil then
return compare(value, condition)
end
return compare(value, lhs) and compare(value, rhs)
end
local function get_default(value, unit_table)
-- Return true, s where s = name of unit's default output unit,
-- or return false, t where t is an error message table.
-- Some units have a default that depends on the input value
-- (the first value if a range of values is used).
-- If '!' is in the default, the first bang-delimited field is an
-- expression that uses 'v' to represent the input value.
-- Example: 'v < 120 ! small ! big ! suffix' (suffix is optional)
-- evaluates 'v < 120' as a boolean with result
-- 'smallsuffix' if (value < 120), or 'bigsuffix' otherwise.
-- Input must use en digits and '.' decimal mark.
local default = data_code.default_exceptions[unit_table.defkey or unit_table.symbol] or unit_table.default
if not default then
local per = unit_table.per
if per then
local function a_default(v, u)
local success, ucode = get_default(v, u)
if not success then
return '?' -- an unlikely error has occurred; will cause lookup of default to fail
end
-- Attempt to use only the first unit if a combination or output multiple.
-- This is not bulletproof but should work for most cases.
-- Where it does not work, the convert will need to specify the wanted output unit.
local t = all_units[ucode]
if t then
local combo = t.combination
if combo then
-- For a multiple like ftin, the "first" unit (ft) is last in the combination.
local i = t.multiple and table_len(combo) or 1
ucode = combo[i]
end
else
-- Try for an automatically generated combination.
local item = ucode:match('^(.-)%+') or ucode:match('^(%S+)%s')
if all_units[item] then
return item
end
end
return ucode
end
local unit1, unit2 = per[1], per[2]
local def1 = (unit1 and a_default(value, unit1) or unit_table.vprefix or '')
local def2 = a_default(1, unit2) -- 1 because per unit of denominator
return true, def1 .. '/' .. def2
end
return false, { 'cvt_no_default', unit_table.symbol }
end
if default:find('!', 1, true) == nil then
return true, default
end
local t = split(default, '!')
if #t == 3 or #t == 4 then
local success, result = pcall(evaluate_condition, value, t[1])
if success then
default = result and t[2] or t[3]
if #t == 4 then
default = default .. t[4]
end
return true, default
end
end
return false, { 'cvt_bad_default', unit_table.symbol }
end
local linked_pages -- to record linked pages so will not link to the same page more than once
local function unlink(unit_table)
-- Forget that the given unit has previously been linked (if it has).
-- That is needed when processing a range of inputs or outputs when an id
-- for the first range value may have been evaluated, but only an id for
-- the last value is displayed, and that id may need to be linked.
linked_pages[unit_table.unitcode or unit_table] = nil
end
local function make_link(link, id, unit_table)
-- Return wikilink "[[link|id]]", possibly abbreviated as in examples:
-- [[Mile|mile]] --> [[mile]]
-- [[Mile|miles]] --> [[mile]]s
-- However, just id is returned if:
-- * no link given (so caller does not need to check if a link was defined); or
-- * link has previously been used during the current convert (to avoid overlinking).
local link_key
if unit_table then
link_key = unit_table.unitcode or unit_table
else
link_key = link
end
if not link or link == '' or linked_pages[link_key] then
return id
end
linked_pages[link_key] = true
-- Following only works for language en, but it should be safe on other wikis,
-- and overhead of doing it generally does not seem worthwhile.
local l = link:sub(1, 1):lower() .. link:sub(2)
if link == id or l == id then
return '[[' .. id .. ']]'
elseif link .. 's' == id or l .. 's' == id then
return '[[' .. id:sub(1, -2) .. ']]s'
else
return '[[' .. link .. '|' .. id .. ']]'
end
end
local function variable_name(clean, unit_table, exp_multiplier, key_id)
-- A unit name may depend on the value in some languages.
-- Parameter clean is the unsigned value in en digits, as a string.
-- It may represent a number ("1.0") or a fraction ("1+2/3").
-- In varname, fields are separated with "!" and are not empty.
-- A field for a unit using an SI prefix has the prefix name inserted,
-- replacing '#' if found, or before the field otherwise.
if clean:match('[./]') then -- float or fraction
if exp_multiplier then
clean = exp_multiplier -- force selection of name for a large integer
else
clean = 34.5 -- force selection of name for a float value
end
else
clean = tonumber(clean) * (exp_multiplier or 1)
end
local name1, vname
if key_id == 'pername' and unit_table.pername then
vname = unit_table.pername
elseif unit_table.varname then
local splitvname = split(unit_table.varname, '!')
name1 = unit_table.name1
vname = mw.language.getContentLanguage():convertPlural(clean, name1, unpack(splitvname))
else
return clean == 1 and unit_table.name1 or unit_table.name2
end
if vname == name1 then
-- SI prefix (if any) has been inserted by unit_prefixed_mt.
else
local si_name = rawget(unit_table, 'si_name') or ''
local pos = vname:find('#', 1, true)
if pos then
vname = vname:sub(1, pos - 1) .. si_name .. vname:sub(pos + 1)
else
vname = si_name .. vname
end
end
return vname
end
local function linked_id(parms, unit_table, key_id, want_link, clean, exp_multiplier)
-- Return final unit id (symbol or name), optionally with a wikilink,
-- and update unit_table.sep if required.
-- key_id is one of: 'symbol', 'sym_us', 'name1', 'name1_us', 'name2', 'name2_us', 'pername'.
local abbr_on = (key_id == 'symbol' or key_id == 'sym_us')
if abbr_on and want_link then
local symlink = rawget(unit_table, 'symlink')
if symlink then
return symlink -- for exceptions that have the linked symbol built-in
end
end
local multiplier = rawget(unit_table, 'multiplier')
local per = unit_table.per
if per then
local paren1, paren2 = '', '' -- possible parentheses around bottom unit
local unit1 = per[1] -- top unit_table, or nil
local unit2 = per[2] -- bottom unit_table
if abbr_on then
if not unit1 then
unit_table.sep = '' -- no separator in "$2/acre"
end
if not want_link then
local symbol = unit_table.symbol_raw
if symbol then
return symbol -- for exceptions that have the symbol built-in
end
end
if (unit2.symbol):find('⋅', 1, true) then
paren1, paren2 = '(', ')'
end
end
local key_id2 -- unit2 is always singular
if key_id == 'name2' then
key_id2 = 'name1'
elseif key_id == 'name2_us' then
key_id2 = 'name1_us'
else
key_id2 = key_id
end
if key_id2 == 'name1' or key_id2 == 'name1_us' then
key_id2 = unit2.pername and 'pername' or key_id2 -- ukwiki has some units with a different name in "per unitname"
end
local result
if abbr_on then
result = '/'
elseif omitsep then
result = per_word
elseif unit1 then
result = ' ' .. per_word .. ' '
else
result = per_word .. ' '
end
if want_link and unit_table.link then
if varname and not abbr_on then
result = (unit1 and variable_name(clean, unit1, exp_multiplier) or '') .. result .. variable_name('1', unit2, exp_multiplier, key_id2)
else
result = (unit1 and linked_id(parms, unit1, key_id, false, clean) or '') .. result .. linked_id(parms, unit2, key_id2, false, '1')
end
if omit_separator(result) then
unit_table.sep = ''
end
return make_link(unit_table.link, result, unit_table)
end
if unit1 then
result = linked_id(parms, unit1, key_id, want_link, clean) .. result
if unit1.sep then
unit_table.sep = unit1.sep
end
elseif omitsep then
unit_table.sep = ''
end
return result .. paren1 .. linked_id(parms, unit2, key_id2, want_link, '1') .. paren2
end
if multiplier then
-- A multiplier (like "100" in "100km") forces the unit to be plural.
multiplier = from_en(multiplier)
if not omitsep then
multiplier = multiplier .. (abbr_on and ' ' or ' ')
end
if not abbr_on then
if key_id == 'name1' then
key_id = 'name2'
elseif key_id == 'name1_us' then
key_id = 'name2_us'
end
end
else
multiplier = ''
end
local id = unit_table.fixed_name or ((varname and not abbr_on) and variable_name(clean, unit_table, exp_multiplier, key_id) or unit_table[key_id])
if omit_separator(id) then
unit_table.sep = ''
end
if want_link then
local link = data_code.link_exceptions[unit_table.linkey or unit_table.symbol] or unit_table.link
if link then
local before = ''
local i = unit_table.customary
if i == 1 and parms.opt_sp_us then
i = 2 -- show "U.S." not "US"
end
if i == 3 and abbr_on then
i = 4 -- abbreviate "imperial" to "imp"
end
local customary = text_code.customary_units[i]
if customary then
-- LATER: This works for language en only, but it's esoteric so ignore for now.
local pertext
if id:sub(1, 1) == '/' then
-- Want unit "/USgal" to display as "/U.S. gal", not "U.S. /gal".
pertext = '/'
id = id:sub(2)
elseif id:sub(1, 4) == 'per ' then
-- Similarly want "per U.S. gallon", not "U.S. per gallon" (but in practice this is unlikely to be used).
pertext = 'per '
id = id:sub(5)
else
pertext = ''
end
-- Omit any "US"/"U.S."/"imp"/"imperial" from start of id since that will be inserted.
local removes = (i < 3) and { 'US ', 'US ', 'U.S. ', 'U.S. ' } or { 'imp ', 'imp ', 'imperial ' }
for _, prefix in ipairs(removes) do
local plen = #prefix
if id:sub(1, plen) == prefix then
id = id:sub(plen + 1)
break
end
end
before = pertext .. make_link(customary.link, customary[1]) .. ' '
end
id = before .. make_link(link, id, unit_table)
end
end
return multiplier .. id
end
local function make_id(parms, which, unit_table)
-- Return id, f where
-- id = unit name or symbol, possibly modified
-- f = true if id is a name, or false if id is a symbol
-- using the value for index 'which', and for 'in' or 'out' (unit_table.inout).
-- Result is '' if no symbol/name is to be used.
-- In addition, set unit_table.sep = ' ' or ' ' or ''
-- (the separator that caller will normally insert before the id).
if parms.opt_values then
unit_table.sep = ''
return ''
end
local inout = unit_table.inout
local info = unit_table.valinfo[which]
local lk = parms.lk
local want_link = (lk == 'on' or lk == inout)
local singular = info.singular
local want_name
local exp_multiplier
if unit_table.usename then
want_name = true
else
if parms.abbr_org == nil then
if parms.wantname then
want_name = true
end
if unit_table.usesymbol then
want_name = false
end
end
if want_name == nil then
local abbr = parms.abbr
if abbr == 'on' or abbr == inout or (abbr == 'mos' and inout == 'out') then
want_name = false
else
want_name = true
end
end
end
local key
if want_name then
if lk == nil and unit_table.builtin == 'hand' then
want_link = true
end
if parms.opt_use_nbsp then
unit_table.sep = ' '
else
unit_table.sep = ' '
end
if parms.opt_singular then
local value
if inout == 'in' then
value = info.value
else
value = info.absvalue
end
if value then -- some unusual units do not always set value field
value = abs(value)
singular = (0 < value and value < 1.0001)
end
end
if unit_table.engscale then
-- engscale: so "|1|e3kg" gives "1 thousand kilograms" (plural)
singular = false
exp_multiplier = 10^unit_table.engscale.exponent -- '1 gram' and '1 thousand grams', for example, may use different names for the unit in some languages
end
key = (parms.opt_adjectival or singular) and 'name1' or 'name2'
if parms.opt_sp_us then
key = key .. '_us'
end
else
if unit_table.builtin == 'hand' then
if parms.opt_hand_hh then
unit_table.symbol = 'hh' -- LATER: might want i18n applied to this
end
end
unit_table.sep = ' '
key = parms.opt_sp_us and 'sym_us' or 'symbol'
end
return linked_id(parms, unit_table, key, want_link, info.clean, exp_multiplier), want_name
end
local function decorate_value(parms, unit_table, which, enable_number_word)
-- If needed, update unit_table so values will be shown with extra information.
-- For consistency with the old template (but different from fmtpower),
-- the style to display powers of 10 includes "display:none" to allow some
-- browsers to copy, for example, "10³" as "10^3", rather than as "103".
-- The engscale table may have entries such as either of the following:
-- ["3"] = { "thousand", exponent = 3 },
-- ["3"] = { name1 = "A", varname = "B!C!D", exponent = 3 },
-- The first option always uses "thousand" as the exponent name.
-- The second option uses one of A, B, C, D as the exponent name, depending on the value.
local info
local engscale = unit_table.engscale
local prefix = unit_table.vprefix
if engscale or prefix then
info = unit_table.valinfo[which]
if info.decorated then
return -- do not redecorate if repeating convert
end
info.decorated = true
if engscale then
-- Range |10|-|20|e3km| gives '10×10³–20×10³' or '10–20 thousand'.
local inout = unit_table.inout
local abbr = parms.abbr
if (abbr == 'on' or abbr == inout) and not (unit_table.this_number_word or parms.number_word) then
info.show = info.show ..
'<span style="margin-left:0.2em">×<span style="margin-left:0.1em">' ..
from_en('10') ..
'</span></span><s style="display:none">^</s><sup>' ..
from_en(tostring(engscale.exponent)) .. '</sup>'
elseif enable_number_word then
local number_id
local name = engscale.varname and variable_name(info.clean, engscale) or engscale[1]
if parms.lk == 'on' or parms.lk == inout then
number_id = make_link(engscale.link, name)
else
number_id = name
end
-- WP:NUMERAL recommends " " in values like "12 million".
info.show = info.show .. (parms.opt_adjectival and '-' or ' ') .. number_id
end
end
if prefix then
info.show = prefix .. info.show
end
end
end
local function process_input(parms, in_current)
-- Processing required once per conversion.
-- Return block of text to represent input (value/unit).
if parms.opt_output_only or parms.opt_output_number_only or parms.opt_output_unit_only then
parms.joins = { '', '' }
return ''
end
local first_unit
local composite = in_current.composite -- nil or table of units
if composite then
first_unit = composite[1]
else
first_unit = in_current
end
local id1, want_name = make_id(parms, 1, first_unit)
local sep = first_unit.sep -- separator between value and unit, set by make_id
local preunit = parms.preunit1
if preunit then
sep = '' -- any separator is included in preunit
else
preunit = ''
end
if parms.opt_input_unit_only then
parms.joins = { '', '' }
if composite then
local parts = { id1 }
for i, unit in ipairs(composite) do
if i > 1 then
table.insert(parts, (make_id(parms, 1, unit)))
end
end
id1 = table.concat(parts, ' ')
end
if want_name and parms.opt_adjectival then
return preunit .. hyphenated(id1)
end
return preunit .. id1
end
if parms.opt_also_symbol and not composite and not parms.opt_flip then
local join1 = parms.joins[1]
if join1 == ' (' or join1 == ' [' then
parms.joins = { ' [' .. first_unit[parms.opt_sp_us and 'sym_us' or 'symbol'] .. ']' .. join1 , parms.joins[2] }
end
end
if in_current.builtin == 'mach' and first_unit.sep ~= '' then -- '' means omitsep with non-enwiki name
local prefix = id1 .. ' '
local range = parms.range
local valinfo = first_unit.valinfo
local result = prefix .. valinfo[1].show
if range then
-- For simplicity and because more not needed, handle one range item only.
local prefix2 = make_id(parms, 2, first_unit) .. ' '
result = range_text(range[1], want_name, parms, result, prefix2 .. valinfo[2].show, 'in', {spaced=true})
end
return preunit .. result
end
if composite then
-- Simplify: assume there is no range, and no decoration.
local mid = (not parms.opt_flip) and parms.mid or ''
local sep1 = ' '
local sep2 = ' '
if parms.opt_adjectival and want_name then
sep1 = '-'
sep2 = '-'
end
if omitsep and sep == '' then
-- Testing the id of the most significant unit should be sufficient.
sep1 = ''
sep2 = ''
end
local parts = { first_unit.valinfo[1].show .. sep1 .. id1 }
for i, unit in ipairs(composite) do
if i > 1 then
table.insert(parts, unit.valinfo[1].show .. sep1 .. (make_id(parms, 1, unit)))
end
end
return table.concat(parts, sep2) .. mid
end
local add_unit = (parms.abbr == 'mos') or
parms[parms.opt_flip and 'out_range_x' or 'in_range_x'] or
(not want_name and parms.abbr_range_x)
local range = parms.range
if range and not add_unit then
unlink(first_unit)
end
local id = range and make_id(parms, range.n + 1, first_unit) or id1
local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, 'in')
if was_hyphenated then
add_unit = false
end
local result
local valinfo = first_unit.valinfo
if range then
for i = 0, range.n do
local enable_number_word
if i == range.n then
add_unit = false
enable_number_word = true
end
decorate_value(parms, first_unit, i+1, enable_number_word)
local show = valinfo[i+1].show
if add_unit then
show = show .. first_unit.sep .. (i == 0 and id1 or make_id(parms, i+1, first_unit))
end
if i == 0 then
result = show
else
result = range_text(range[i], want_name, parms, result, show, 'in')
end
end
else
decorate_value(parms, first_unit, 1, true)
result = valinfo[1].show
end
return result .. preunit .. extra
end
local function process_one_output(parms, out_current)
-- Processing required for each output unit.
-- Return block of text to represent output (value/unit).
local inout = out_current.inout -- normally 'out' but can be 'in' for order=out
local id1, want_name = make_id(parms, 1, out_current)
local sep = out_current.sep -- set by make_id
local preunit = parms.preunit2
if preunit then
sep = '' -- any separator is included in preunit
else
preunit = ''
end
if parms.opt_output_unit_only then
if want_name and parms.opt_adjectival then
return preunit .. hyphenated(id1)
end
return preunit .. id1
end
if out_current.builtin == 'mach' and out_current.sep ~= '' then -- '' means omitsep with non-enwiki name
local prefix = id1 .. ' '
local range = parms.range
local valinfo = out_current.valinfo
local result = prefix .. valinfo[1].show
if range then
-- For simplicity and because more not needed, handle one range item only.
result = range_text(range[1], want_name, parms, result, prefix .. valinfo[2].show, inout, {spaced=true})
end
return preunit .. result
end
local add_unit = (parms[parms.opt_flip and 'in_range_x' or 'out_range_x'] or
(not want_name and parms.abbr_range_x)) and
not parms.opt_output_number_only
local range = parms.range
if range and not add_unit then
unlink(out_current)
end
local id = range and make_id(parms, range.n + 1, out_current) or id1
local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, inout)
if was_hyphenated then
add_unit = false
end
local result
local valinfo = out_current.valinfo
if range then
for i = 0, range.n do
local enable_number_word
if i == range.n then
add_unit = false
enable_number_word = true
end
decorate_value(parms, out_current, i+1, enable_number_word)
local show = valinfo[i+1].show
if add_unit then
show = show .. out_current.sep .. (i == 0 and id1 or make_id(parms, i+1, out_current))
end
if i == 0 then
result = show
else
result = range_text(range[i], want_name, parms, result, show, inout)
end
end
else
decorate_value(parms, out_current, 1, true)
result = valinfo[1].show
end
if parms.opt_output_number_only then
return result
end
return result .. preunit .. extra
end
local function make_output_single(parms, in_unit_table, out_unit_table)
-- Return true, item where item = wikitext of the conversion result
-- for a single output (which is not a combination or a multiple);
-- or return false, t where t is an error message table.
if parms.opt_order_out and in_unit_table.unitcode == out_unit_table.unitcode then
out_unit_table.valinfo = in_unit_table.valinfo
else
out_unit_table.valinfo = collection()
for _, v in ipairs(in_unit_table.valinfo) do
local success, info = cvtround(parms, v, in_unit_table, out_unit_table)
if not success then return false, info end
out_unit_table.valinfo:add(info)
end
end
return true, process_one_output(parms, out_unit_table)
end
local function make_output_multiple(parms, in_unit_table, out_unit_table)
-- Return true, item where item = wikitext of the conversion result
-- for an output which is a multiple (like 'ftin');
-- or return false, t where t is an error message table.
local inout = out_unit_table.inout -- normally 'out' but can be 'in' for order=out
local multiple = out_unit_table.multiple -- table of scaling factors (will not be nil)
local combos = out_unit_table.combination -- table of unit tables (will not be nil)
local abbr = parms.abbr
local abbr_org = parms.abbr_org
local disp = parms.disp
local want_name = (abbr_org == nil and (disp == 'or' or disp == 'slash')) or
not (abbr == 'on' or abbr == inout or abbr == 'mos')
local want_link = (parms.lk == 'on' or parms.lk == inout)
local mid = parms.opt_flip and parms.mid or ''
local sep1 = ' '
local sep2 = ' '
if parms.opt_adjectival and want_name then
sep1 = '-'
sep2 = '-'
end
local do_spell = parms.opt_spell_out
parms.opt_spell_out = nil -- so the call to cvtround does not spell the value
local function make_result(info, isfirst)
local fmt, outvalue, sign
local results = {}
for i = 1, #combos do
local tfrac, thisvalue, strforce
local out_current = combos[i]
out_current.inout = inout
local scale = multiple[i]
if i == 1 then -- least significant unit ('in' from 'ftin')
local decimals
out_current.frac = out_unit_table.frac
local success, outinfo = cvtround(parms, info, in_unit_table, out_current)
if not success then return false, outinfo end
if isfirst then
out_unit_table.valinfo = { outinfo } -- in case output value of first least significant unit is needed
end
sign = outinfo.sign
tfrac = outinfo.fraction_table
if outinfo.is_scientific then
strforce = outinfo.show
decimals = ''
elseif tfrac then
decimals = ''
else
local show = outinfo.show -- number as a string in local language
local p1, p2 = show:find(numdot, 1, true)
decimals = p1 and show:sub(p2 + 1) or '' -- text after numdot, if any
end
fmt = '%.' .. ulen(decimals) .. 'f' -- to reproduce precision
if decimals == '' then
if tfrac then
outvalue = floor(outinfo.raw_absvalue) -- integer part only; fraction added later
else
outvalue = floor(outinfo.raw_absvalue + 0.5) -- keep all integer digits of least significant unit
end
else
outvalue = outinfo.absvalue
end
end
if scale then
outvalue, thisvalue = divide(outvalue, scale)
else
thisvalue = outvalue
end
local id
if want_name then
if varname then
local clean
if strforce or tfrac then
clean = '.1' -- dummy value to force name for floating point
else
clean = format(fmt, thisvalue)
end
id = variable_name(clean, out_current)
else
local key = 'name2'
if parms.opt_adjectival then
key = 'name1'
elseif tfrac then
if thisvalue == 0 then
key = 'name1'
end
elseif parms.opt_singular then
if 0 < thisvalue and thisvalue < 1.0001 then
key = 'name1'
end
else
if thisvalue == 1 then
key = 'name1'
end
end
id = out_current[key]
end
else
id = out_current['symbol']
end
if i == 1 and omit_separator(id) then
-- Testing the id of the least significant unit should be sufficient.
sep1 = ''
sep2 = ''
end
if want_link then
local link = out_current.link
if link then
id = make_link(link, id, out_current)
end
end
local strval
local spell_inout = (i == #combos or outvalue == 0) and inout or '' -- trick so the last value processed (first displayed) has uppercase, if requested
if strforce and outvalue == 0 then
sign = '' -- any sign is in strforce
strval = strforce -- show small values in scientific notation; will only use least significant unit
elseif tfrac then
local wholestr = (thisvalue > 0) and tostring(thisvalue) or nil
strval = format_fraction(parms, spell_inout, false, wholestr, tfrac.numstr, tfrac.denstr, do_spell)
else
strval = (thisvalue == 0) and from_en('0') or with_separator(parms, format(fmt, thisvalue))
if do_spell then
strval = spell_number(parms, spell_inout, strval) or strval
end
end
table.insert(results, strval .. sep1 .. id)
if outvalue == 0 then
break
end
fmt = '%.0f' -- only least significant unit can have a non-integral value
end
local reversed, count = {}, #results
for i = 1, count do
reversed[i] = results[count + 1 - i]
end
return true, sign .. table.concat(reversed, sep2)
end
local valinfo = in_unit_table.valinfo
local success, result = make_result(valinfo[1], true)
if not success then return false, result end
local range = parms.range
if range then
for i = 1, range.n do
local success, result2 = make_result(valinfo[i+1])
if not success then return false, result2 end
result = range_text(range[i], want_name, parms, result, result2, inout, {spaced=true})
end
end
return true, result .. mid
end
local function process(parms, in_unit_table, out_unit_table)
-- Return true, s, outunit where s = final wikitext result,
-- or return false, t where t is an error message table.
linked_pages = {}
local success, bad_output
local bad_input_mcode = in_unit_table.bad_mcode -- nil if input unit is a valid convert unit
local out_unit = parms.out_unit
if out_unit == nil or out_unit == '' or type(out_unit) == 'function' then
-- out_unit can be set to a function by adjustparameters in Module:Convert/wikidata.
if bad_input_mcode or parms.opt_input_unit_only then
bad_output = ''
else
local getdef = type(out_unit) == 'function' and out_unit or get_default
success, out_unit = getdef(in_unit_table.valinfo[1].value, in_unit_table)
parms.out_unit = out_unit
if not success then
bad_output = out_unit
end
end
end
if not bad_output and not out_unit_table then
success, out_unit_table = lookup(parms, out_unit, 'any_combination')
if success then
local mismatch = check_mismatch(in_unit_table, out_unit_table)
if mismatch then
bad_output = mismatch
end
else
bad_output = out_unit_table
end
end
local lhs, rhs
local flipped = parms.opt_flip and not bad_input_mcode
if bad_output then
rhs = (bad_output == '') and '' or message(parms, bad_output)
elseif parms.opt_input_unit_only then
rhs = ''
else
local combos -- nil (for 'ft' or 'ftin'), or table of unit tables (for 'm ft')
if not out_unit_table.multiple then -- nil/false ('ft' or 'm ft'), or table of factors ('ftin')
combos = out_unit_table.combination
end
local frac = parms.frac -- nil or denominator of fraction for output values
if frac then
-- Apply fraction to the unit (if only one), or to non-SI units (if a combination),
-- except that if a precision is also specified, the fraction only applies to
-- the hand unit; that allows the following result:
-- {{convert|156|cm|in hand|1|frac=2}} → 156 centimetres (61.4 in; 15.1½ hands)
-- However, the following is handled elsewhere as a special case:
-- {{convert|156|cm|hand in|1|frac=2}} → 156 centimetres (15.1½ hands; 61½ in)
if combos then
local precision = parms.precision
for _, unit in ipairs(combos) do
if unit.builtin == 'hand' or (not precision and not unit.prefixes) then
unit.frac = frac
end
end
else
out_unit_table.frac = frac
end
end
local outputs = {}
local imax = combos and #combos or 1 -- 1 (single unit) or number of unit tables
if imax == 1 then
parms.opt_order_out = nil -- only useful with an output combination
end
if not flipped and not parms.opt_order_out then
-- Process left side first so any duplicate links (from lk=on) are suppressed
-- on right. Example: {{convert|28|e9pc|e9ly|abbr=off|lk=on}}
lhs = process_input(parms, in_unit_table)
end
for i = 1, imax do
local success, item
local out_current = combos and combos[i] or out_unit_table
out_current.inout = 'out'
if i == 1 then
if imax > 1 and out_current.builtin == 'hand' then
out_current.out_next = combos[2] -- built-in hand can influence next unit in a combination
end
if parms.opt_order_out then
out_current.inout = 'in'
end
end
if out_current.multiple then
success, item = make_output_multiple(parms, in_unit_table, out_current)
else
success, item = make_output_single(parms, in_unit_table, out_current)
end
if not success then return false, item end
outputs[i] = item
end
if parms.opt_order_out then
lhs = outputs[1]
table.remove(outputs, 1)
end
local sep = parms.table_joins and parms.table_joins[2] or parms.join_between
rhs = table.concat(outputs, sep)
end
if flipped or not lhs then
local input = process_input(parms, in_unit_table)
if flipped then
lhs = rhs
rhs = input
else
lhs = input
end
end
if parms.join_before then
lhs = parms.join_before .. lhs
end
local wikitext
if bad_input_mcode then
if bad_input_mcode == '' then
wikitext = lhs
else
wikitext = lhs .. message(parms, bad_input_mcode)
end
elseif parms.table_joins then
wikitext = parms.table_joins[1] .. lhs .. parms.table_joins[2] .. rhs
else
wikitext = lhs .. parms.joins[1] .. rhs .. parms.joins[2]
end
if parms.warnings and not bad_input_mcode then
wikitext = wikitext .. parms.warnings
end
return true, get_styles(parms) .. wikitext, out_unit_table
end
local function _main_convert(confArgs, parmsArgs, frame)
-- Do convert, and if needed, do it again with higher default precision.
local parms = { frame = frame or mw.getCurrentFrame() } -- will hold template arguments, after translation
set_config(confArgs)
local success, result = get_parms(parms, parmsArgs)
if success then
if type(result) ~= 'table' then
return tostring(result)
end
local in_unit_table = result
local out_unit_table
for _ = 1, 2 do -- use counter so cannot get stuck repeating convert
success, result, out_unit_table = process(parms, in_unit_table, out_unit_table)
if success and parms.do_convert_again then
parms.do_convert_again = false
else
break
end
end
end
-- If input=x gives a problem, the result should be just the user input
-- (if x is a property like P123 it has been replaced with '').
-- An unknown input unit would display the input and an error message
-- with success == true at this point.
-- Also, can have success == false with a message that outputs an empty string.
if parms.input_text then
if success and not parms.have_problem then
return result
end
local cat
if parms.tracking then
-- Add a tracking category using the given text as the category sort key.
-- There is currently only one type of tracking, but in principle multiple
-- items could be tracked, using different sort keys for convenience.
cat = wanted_category('tracking', parms.tracking)
end
return parms.input_text .. (cat or '')
end
return success and result or message(parms, result)
end
local function main_convert(frame)
return _main_convert(frame.args, frame:getParent().args, frame)
end
local function _unit(unitcode, options)
-- Helper function for Module:Val to look up a unit.
-- Parameter unitcode must be a string to identify the wanted unit.
-- Parameter options must be nil or a table with optional fields:
-- value = number (for sort key; default value is 1)
-- scaled_top = nil for a normal unit, or a number for a unit which is
-- the denominator of a per unit (for sort key)
-- si = { 'symbol', 'link' }
-- (a table with two strings) to make an SI unit
-- that will be used for the look up
-- link = true if result should be [[linked]]
-- sort = 'on' or 'debug' if result should include a sort key in a
-- span element ('debug' makes the key visible)
-- name = true for the name of the unit instead of the symbol
-- us = true for the US spelling of the unit, if any
-- Return nil if unitcode is not a non-empty string.
-- Otherwise return a table with fields:
-- text = requested symbol or name of unit, optionally linked
-- scaled_value = input value adjusted by unit scale; used for sort key
-- sortspan = span element with sort key like that provided by {{ntsh}},
-- calculated from the result of converting value
-- to a base unit with scale 1.
-- unknown = true if the unitcode was not known
unitcode = strip(unitcode)
if unitcode == nil or unitcode == '' then
return nil
end
set_config({})
linked_pages = {}
options = options or {}
local parms = {
abbr = options.name and 'off' or 'on',
lk = options.link and 'on' or nil,
opt_sp_us = options.us and true or nil,
opt_ignore_error = true, -- do not add pages using this function to 'what links here' for Module:Convert/extra
opt_sortable_on = options.sort == 'on' or options.sort == 'debug',
opt_sortable_debug = options.sort == 'debug',
}
if options.si then
-- Make a dummy table of units (just one unit) for lookup to use.
-- This makes lookup recognize any SI prefix in the unitcode.
local symbol = options.si[1] or '?'
parms.unittable = { [symbol] = {
_name1 = symbol,
_name2 = symbol,
_symbol = symbol,
utype = symbol,
scale = symbol == 'g' and 0.001 or 1,
prefixes = 1,
default = symbol,
link = options.si[2],
}}
end
local success, unit_table = lookup(parms, unitcode, 'no_combination')
if not success then
unit_table = setmetatable({
symbol = unitcode, name2 = unitcode, utype = unitcode,
scale = 1, default = '', defkey = '', linkey = '' }, unit_mt)
end
local value = tonumber(options.value) or 1
local clean = tostring(abs(value))
local info = {
value = value,
altvalue = value,
singular = (clean == '1'),
clean = clean,
show = clean,
}
unit_table.inout = 'in'
unit_table.valinfo = { info }
local sortspan, scaled_value
if options.sort then
sortspan, scaled_value = make_table_or_sort(parms, value, info, unit_table, options.scaled_top)
end
return {
text = make_id(parms, 1, unit_table),
sortspan = sortspan,
scaled_value = scaled_value,
unknown = not success and true or nil,
}
end
return { convert = main_convert, _convert = _main_convert, _unit = _unit }
84ef1800df9ddbc24da3d295d74282d1c59ec2b5
Module:Convert/data
828
721
1106
1105
2025-08-22T00:55:51Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- Conversion data used by [[Module:Convert]] which uses mw.loadData() for
-- read-only access to this module so that it is loaded only once per page.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
--
-- These data tables follow:
-- all_units all properties for a unit, including default output
-- default_exceptions exceptions for default output ('kg' and 'g' have different defaults)
-- link_exceptions exceptions for links ('kg' and 'g' have different links)
--
-- These tables are generated by a script which reads the wikitext of a page that
-- documents the required properties of each unit; see [[:en:Module:Convert/doc]].
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local all_units = {
["Gy"] = {
_name1 = "gray",
_symbol = "Gy",
utype = "absorbed radiation dose",
scale = 1,
prefixes = 1,
default = "rad",
link = "Gray (unit)",
},
["rad"] = {
_name1 = "rad",
_symbol = "rad",
utype = "absorbed radiation dose",
scale = 0.01,
prefixes = 1,
default = "Gy",
link = "Rad (unit)",
},
["cm/s2"] = {
name1 = "centimetre per second squared",
name1_us = "centimeter per second squared",
name2 = "centimetres per second squared",
name2_us = "centimeters per second squared",
symbol = "cm/s<sup>2</sup>",
utype = "acceleration",
scale = 0.01,
default = "ft/s2",
link = "Gal (unit)",
},
["ft/s2"] = {
name1 = "foot per second squared",
name2 = "feet per second squared",
symbol = "ft/s<sup>2</sup>",
utype = "acceleration",
scale = 0.3048,
default = "m/s2",
},
["g0"] = {
name1 = "standard gravity",
name2 = "standard gravities",
symbol = "''g''<sub>0</sub>",
utype = "acceleration",
scale = 9.80665,
default = "m/s2",
},
["g-force"] = {
name2 = "''g''",
symbol = "''g''",
utype = "acceleration",
scale = 9.80665,
default = "m/s2",
link = "g-force",
},
["km/hs"] = {
name1 = "kilometre per hour per second",
name1_us = "kilometer per hour per second",
name2 = "kilometres per hour per second",
name2_us = "kilometers per hour per second",
symbol = "km/(h⋅s)",
utype = "acceleration",
scale = 0.27777777777777779,
default = "mph/s",
link = "Acceleration",
},
["km/s2"] = {
name1 = "kilometre per second squared",
name1_us = "kilometer per second squared",
name2 = "kilometres per second squared",
name2_us = "kilometers per second squared",
symbol = "km/s<sup>2</sup>",
utype = "acceleration",
scale = 1000,
default = "mph/s",
link = "Acceleration",
},
["m/s2"] = {
name1 = "metre per second squared",
name1_us = "meter per second squared",
name2 = "metres per second squared",
name2_us = "meters per second squared",
symbol = "m/s<sup>2</sup>",
utype = "acceleration",
scale = 1,
default = "ft/s2",
},
["mph/s"] = {
name1 = "mile per hour per second",
name2 = "miles per hour per second",
symbol = "mph/s",
utype = "acceleration",
scale = 0.44704,
default = "km/hs",
link = "Acceleration",
},
["km/h/s"] = {
target = "km/hs",
},
["standard gravity"] = {
target = "g0",
},
["1000sqft"] = {
name1 = "thousand square feet",
name2 = "thousand square feet",
symbol = "1000 sq ft",
utype = "area",
scale = 92.90304,
default = "m2",
link = "Square foot",
},
["a"] = {
_name1 = "are",
_symbol = "a",
utype = "area",
scale = 100,
prefixes = 1,
default = "sqft",
link = "Hectare#Are",
},
["acre"] = {
symbol = "acre",
usename = 1,
utype = "area",
scale = 4046.8564224,
default = "ha",
subdivs = { ["rood"] = { 4, default = "ha" }, ["sqperch"] = { 160, default = "ha" } },
},
["acre-sing"] = {
target = "acre",
},
["arpent"] = {
symbol = "arpent",
usename = 1,
utype = "area",
scale = 3418.89,
default = "ha",
},
["cda"] = {
name1 = "cuerda",
symbol = "cda",
utype = "area",
scale = 3930.395625,
default = "ha acre",
},
["daa"] = {
name1 = "decare",
symbol = "daa",
utype = "area",
scale = 1000,
default = "km2 sqmi",
},
["dunam"] = {
symbol = "dunam",
usename = 1,
utype = "area",
scale = 1000,
default = "km2 sqmi",
},
["dunum"] = {
symbol = "dunum",
usename = 1,
utype = "area",
scale = 1000,
default = "km2 sqmi",
link = "Dunam",
},
["ha"] = {
name1 = "hectare",
symbol = "ha",
utype = "area",
scale = 10000,
default = "acre",
},
["hectare"] = {
name1 = "hectare",
symbol = "ha",
usename = 1,
utype = "area",
scale = 10000,
default = "acre",
},
["Irish acre"] = {
name1 = "Irish acre",
symbol = "Irish acres",
utype = "area",
scale = 6555.2385024,
default = "ha",
link = "Acre (Irish)",
},
["m2"] = {
_name1 = "square metre",
_name1_us= "square meter",
_symbol = "m<sup>2</sup>",
prefix_position= 8,
utype = "area",
scale = 1,
prefixes = 2,
default = "sqft",
link = "Square metre",
},
["pondemaat"] = {
name1 = "pondemaat",
name2 = "pondemaat",
symbol = "pond",
utype = "area",
scale = 3674.363358816,
default = "m2",
link = ":nl:pondemaat",
},
["pyeong"] = {
name2 = "pyeong",
symbol = "pyeong",
usename = 1,
utype = "area",
scale = 3.3057851239669422,
default = "m2",
},
["rai"] = {
name2 = "rai",
symbol = "rai",
utype = "area",
scale = 1600,
default = "m2",
link = "Rai (unit)",
},
["rood"] = {
symbol = "rood",
usename = 1,
utype = "area",
scale = 1011.7141056,
default = "sqft m2",
subdivs = { ["sqperch"] = { 40, default = "m2" } },
link = "Rood (unit)",
},
["sqfoot"] = {
name1 = "square foot",
name2 = "square foot",
symbol = "sq ft",
utype = "area",
scale = 0.09290304,
default = "m2",
},
["sqft"] = {
name1 = "square foot",
name2 = "square feet",
symbol = "sq ft",
utype = "area",
scale = 0.09290304,
default = "m2",
},
["sqin"] = {
name1 = "square inch",
name2 = "square inches",
symbol = "sq in",
utype = "area",
scale = 0.00064516,
default = "cm2",
},
["sqmi"] = {
name1 = "square mile",
symbol = "sq mi",
utype = "area",
scale = 2589988.110336,
default = "km2",
},
["sqnmi"] = {
name1 = "square nautical mile",
symbol = "sq nmi",
utype = "area",
scale = 3429904,
default = "km2 sqmi",
link = "Nautical mile",
},
["sqperch"] = {
name2 = "perches",
symbol = "perch",
usename = 1,
utype = "area",
scale = 25.29285264,
default = "m2",
link = "Rod (unit)#Area and volume",
},
["sqverst"] = {
symbol = "square verst",
usename = 1,
utype = "area",
scale = 1138062.24,
default = "km2 sqmi",
link = "Verst",
},
["sqyd"] = {
name1 = "square yard",
symbol = "sq yd",
utype = "area",
scale = 0.83612736,
default = "m2",
},
["tsubo"] = {
name2 = "tsubo",
symbol = "tsubo",
usename = 1,
utype = "area",
scale = 3.3057851239669422,
default = "m2",
link = "Japanese units of measurement#Area",
},
["acres"] = {
target = "acre",
},
["are"] = {
target = "a",
},
["decare"] = {
target = "daa",
},
["foot2"] = {
target = "sqfoot",
},
["ft2"] = {
target = "sqft",
},
["in2"] = {
target = "sqin",
symbol = "in<sup>2</sup>",
},
["km²"] = {
target = "km2",
},
["mi2"] = {
target = "sqmi",
},
["million acre"] = {
target = "e6acre",
},
["million acres"] = {
target = "e6acre",
},
["million hectares"] = {
target = "e6ha",
},
["m²"] = {
target = "m2",
},
["nmi2"] = {
target = "sqnmi",
},
["pond"] = {
target = "pondemaat",
},
["sq arp"] = {
target = "arpent",
},
["sqkm"] = {
target = "km2",
},
["sqm"] = {
target = "m2",
},
["square verst"] = {
target = "sqverst",
},
["verst2"] = {
target = "sqverst",
},
["yd2"] = {
target = "sqyd",
},
["m2/ha"] = {
name1 = "square metre per hectare",
name1_us = "square meter per hectare",
name2 = "square metres per hectare",
name2_us = "square meters per hectare",
symbol = "m<sup>2</sup>/ha",
utype = "area per unit area",
scale = 0.0001,
default = "sqft/acre",
link = "Basal area",
},
["sqft/acre"] = {
name1 = "square foot per acre",
name2 = "square feet per acre",
symbol = "sq ft/acre",
utype = "area per unit area",
scale = 2.295684113865932e-5,
default = "m2/ha",
link = "Basal area",
},
["cent"] = {
name1 = "cent",
symbol = "¢",
utype = "cent",
scale = 1,
default = "cent",
link = "Cent (currency)",
},
["¢"] = {
target = "cent",
},
["A.h"] = {
name1 = "ampere hour",
symbol = "A⋅h",
utype = "charge",
scale = 3600,
default = "coulomb",
},
["coulomb"] = {
_name1 = "coulomb",
_symbol = "C",
utype = "charge",
scale = 1,
prefixes = 1,
default = "e",
link = "Coulomb",
},
["e"] = {
name1 = "elementary charge",
symbol = "''e''",
utype = "charge",
scale = 1.602176487e-19,
default = "coulomb",
},
["g-mol"] = {
name1 = "gram-mole",
symbol = "g‑mol",
utype = "chemical amount",
scale = 1,
default = "lbmol",
link = "Mole (unit)",
},
["gmol"] = {
name1 = "gram-mole",
symbol = "gmol",
utype = "chemical amount",
scale = 1,
default = "lbmol",
link = "Mole (unit)",
},
["kmol"] = {
name1 = "kilomole",
symbol = "kmol",
utype = "chemical amount",
scale = 1000,
default = "lbmol",
link = "Mole (unit)",
},
["lb-mol"] = {
name1 = "pound-mole",
symbol = "lb‑mol",
utype = "chemical amount",
scale = 453.59237,
default = "mol",
},
["lbmol"] = {
name1 = "pound-mole",
symbol = "lbmol",
utype = "chemical amount",
scale = 453.59237,
default = "mol",
},
["mol"] = {
name1 = "mole",
symbol = "mol",
utype = "chemical amount",
scale = 1,
default = "lbmol",
link = "Mole (unit)",
},
["kgCO2/L"] = {
name1 = "kilogram per litre",
name1_us = "kilogram per liter",
name2 = "kilograms per litre",
name2_us = "kilograms per liter",
symbol = "kg(CO<sub>2</sub>)/L",
utype = "co2 per unit volume",
scale = 1000,
default = "lbCO2/USgal",
link = "Exhaust gas",
},
["lbCO2/USgal"] = {
name1 = "pound per US gallon",
name2 = "pounds per US gallon",
symbol = "lbCO2/US gal",
utype = "co2 per unit volume",
scale = 119.82642731689663,
default = "kgCO2/L",
link = "Exhaust gas",
},
["oz/lb"] = {
per = { "oz", "lb" },
utype = "concentration",
default = "mg/kg",
},
["mg/kg"] = {
per = { "mg", "kg" },
utype = "concentration",
default = "oz/lb",
},
["g/dm3"] = {
name1 = "gram per cubic decimetre",
name1_us = "gram per cubic decimeter",
name2 = "grams per cubic decimetre",
name2_us = "grams per cubic decimeter",
symbol = "g/dm<sup>3</sup>",
utype = "density",
scale = 1,
default = "kg/m3",
link = "Density",
},
["g/L"] = {
name1 = "gram per litre",
name1_us = "gram per liter",
name2 = "grams per litre",
name2_us = "grams per liter",
symbol = "g/L",
utype = "density",
scale = 1,
default = "lb/cuin",
link = "Density",
},
["g/mL"] = {
name1 = "gram per millilitre",
name1_us = "gram per milliliter",
name2 = "grams per millilitre",
name2_us = "grams per milliliter",
symbol = "g/mL",
utype = "density",
scale = 1000,
default = "lb/cuin",
link = "Density",
},
["g/ml"] = {
name1 = "gram per millilitre",
name1_us = "gram per milliliter",
name2 = "grams per millilitre",
name2_us = "grams per milliliter",
symbol = "g/ml",
utype = "density",
scale = 1000,
default = "lb/cuin",
link = "Density",
},
["kg/dm3"] = {
name1 = "kilogram per cubic decimetre",
name1_us = "kilogram per cubic decimeter",
name2 = "kilograms per cubic decimetre",
name2_us = "kilograms per cubic decimeter",
symbol = "kg/dm<sup>3</sup>",
utype = "density",
scale = 1000,
default = "lb/cuft",
link = "Density",
},
["kg/L"] = {
name1 = "kilogram per litre",
name1_us = "kilogram per liter",
name2 = "kilograms per litre",
name2_us = "kilograms per liter",
symbol = "kg/L",
utype = "density",
scale = 1000,
default = "lb/USgal",
link = "Density",
},
["kg/l"] = {
name1 = "kilogram per litre",
name1_us = "kilogram per liter",
name2 = "kilograms per litre",
name2_us = "kilograms per liter",
symbol = "kg/l",
utype = "density",
scale = 1000,
default = "lb/USgal",
link = "Density",
},
["kg/m3"] = {
name1 = "kilogram per cubic metre",
name1_us = "kilogram per cubic meter",
name2 = "kilograms per cubic metre",
name2_us = "kilograms per cubic meter",
symbol = "kg/m<sup>3</sup>",
utype = "density",
scale = 1,
default = "lb/cuyd",
link = "Density",
},
["lb/cuft"] = {
name1 = "pound per cubic foot",
name2 = "pounds per cubic foot",
symbol = "lb/cu ft",
utype = "density",
scale = 16.018463373960142,
default = "g/cm3",
link = "Density",
},
["lb/cuin"] = {
name1 = "pound per cubic inch",
name2 = "pounds per cubic inch",
symbol = "lb/cu in",
utype = "density",
scale = 27679.904710203122,
default = "g/cm3",
link = "Density",
},
["lb/cuyd"] = {
name1 = "pound per cubic yard",
name2 = "pounds per cubic yard",
symbol = "lb/cu yd",
utype = "density",
scale = 0.5932764212577829,
default = "kg/m3",
link = "Density",
},
["lb/impgal"] = {
name1 = "pound per imperial gallon",
name2 = "pounds per imperial gallon",
symbol = "lb/imp gal",
utype = "density",
scale = 99.776372663101697,
default = "kg/L",
link = "Density",
},
["lb/in3"] = {
name1 = "pound per cubic inch",
name2 = "pounds per cubic inch",
symbol = "lb/cu in",
utype = "density",
scale = 27679.904710203122,
default = "g/cm3",
link = "Density",
},
["lb/U.S.gal"] = {
name1 = "pound per U.S. gallon",
name2 = "pounds per U.S. gallon",
symbol = "lb/U.S. gal",
utype = "density",
scale = 119.82642731689663,
default = "kg/L",
link = "Density",
},
["lb/USbu"] = {
name1 = "pound per US bushel",
name2 = "pounds per US bushel",
symbol = "lb/US bu",
utype = "density",
scale = 12.871859780974471,
default = "kg/m3",
link = "Bushel",
},
["lb/USgal"] = {
name1 = "pound per US gallon",
name2 = "pounds per US gallon",
symbol = "lb/US gal",
utype = "density",
scale = 119.82642731689663,
default = "kg/L",
link = "Density",
},
["lbm/cuin"] = {
name1 = "pound mass per cubic inch",
name2 = "pounds mass per cubic inch",
symbol = "lbm/cu in",
utype = "density",
scale = 27679.904710203122,
default = "g/cm3",
link = "Density",
},
["mg/L"] = {
name1 = "milligram per litre",
name1_us = "milligram per liter",
name2 = "milligrams per litre",
name2_us = "milligrams per liter",
symbol = "mg/L",
utype = "density",
scale = 0.001,
default = "lb/cuin",
link = "Density",
},
["oz/cuin"] = {
name1 = "ounce per cubic inch",
name2 = "ounces per cubic inch",
symbol = "oz/cu in",
utype = "density",
scale = 1729.9940443876951,
default = "g/cm3",
link = "Density",
},
["g/cm3"] = {
per = { "g", "cm3" },
utype = "density",
default = "lb/cuin",
},
["g/m3"] = {
per = { "g", "m3" },
utype = "density",
default = "lb/cuyd",
link = "Density",
},
["Mg/m3"] = {
per = { "Mg", "m3" },
utype = "density",
default = "lb/cuft",
},
["mg/l"] = {
per = { "mg", "ll" },
utype = "density",
default = "oz/cuin",
},
["μg/dL"] = {
per = { "μg", "dL" },
utype = "density",
default = "lb/cuin",
},
["μg/l"] = {
per = { "μg", "ll" },
utype = "density",
default = "oz/cuin",
},
["lb/ft3"] = {
target = "lb/cuft",
},
["lb/yd3"] = {
target = "lb/cuyd",
},
["lbm/in3"] = {
target = "lbm/cuin",
},
["mcg/dL"] = {
target = "μg/dL",
},
["oz/in3"] = {
target = "oz/cuin",
},
["ug/dL"] = {
target = "μg/dL",
},
["ug/l"] = {
target = "μg/l",
},
["B.O.T.U."] = {
name1 = "Board of Trade Unit",
symbol = "B.O.T.U.",
utype = "energy",
scale = 3600000,
default = "MJ",
link = "Kilowatt-hour",
},
["bboe"] = {
name1 = "barrel of oil equivalent",
name2 = "barrels of oil equivalent",
symbol = "bboe",
utype = "energy",
scale = 6117863200,
default = "GJ",
},
["BOE"] = {
name1 = "barrel of oil equivalent",
name2 = "barrels of oil equivalent",
symbol = "BOE",
utype = "energy",
scale = 6117863200,
default = "GJ",
},
["BTU"] = {
name1 = "British thermal unit",
symbol = "BTU",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
},
["Btu"] = {
name1 = "British thermal unit",
symbol = "Btu",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
},
["BTU-39F"] = {
name1 = "British thermal unit (39°F)",
name2 = "British thermal units (39°F)",
symbol = "BTU<sub>39°F</sub>",
utype = "energy",
scale = 1059.67,
default = "kJ",
link = "British thermal unit",
},
["Btu-39F"] = {
name1 = "British thermal unit (39°F)",
name2 = "British thermal units (39°F)",
symbol = "Btu<sub>39°F</sub>",
utype = "energy",
scale = 1059.67,
default = "kJ",
link = "British thermal unit",
},
["BTU-59F"] = {
name1 = "British thermal unit (59°F)",
name2 = "British thermal units (59°F)",
symbol = "BTU<sub>59°F</sub>",
utype = "energy",
scale = 1054.804,
default = "kJ",
link = "British thermal unit",
},
["Btu-59F"] = {
name1 = "British thermal unit (59°F)",
name2 = "British thermal units (59°F)",
symbol = "Btu<sub>59°F</sub>",
utype = "energy",
scale = 1054.804,
default = "kJ",
link = "British thermal unit",
},
["BTU-60F"] = {
name1 = "British thermal unit (60°F)",
name2 = "British thermal units (60°F)",
symbol = "BTU<sub>60°F</sub>",
utype = "energy",
scale = 1054.68,
default = "kJ",
link = "British thermal unit",
},
["Btu-60F"] = {
name1 = "British thermal unit (60°F)",
name2 = "British thermal units (60°F)",
symbol = "Btu<sub>60°F</sub>",
utype = "energy",
scale = 1054.68,
default = "kJ",
link = "British thermal unit",
},
["BTU-63F"] = {
name1 = "British thermal unit (63°F)",
name2 = "British thermal units (63°F)",
symbol = "BTU<sub>63°F</sub>",
utype = "energy",
scale = 1054.6,
default = "kJ",
link = "British thermal unit",
},
["Btu-63F"] = {
name1 = "British thermal unit (63°F)",
name2 = "British thermal units (63°F)",
symbol = "Btu<sub>63°F</sub>",
utype = "energy",
scale = 1054.6,
default = "kJ",
link = "British thermal unit",
},
["BTU-ISO"] = {
name1 = "British thermal unit (ISO)",
name2 = "British thermal units (ISO)",
symbol = "BTU<sub>ISO</sub>",
utype = "energy",
scale = 1055.056,
default = "kJ",
link = "British thermal unit",
},
["Btu-ISO"] = {
target = "BTU-ISO",
},
["BTU-IT"] = {
name1 = "British thermal unit (IT)",
name2 = "British thermal units (IT)",
symbol = "BTU<sub>IT</sub>",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
link = "British thermal unit",
},
["Btu-IT"] = {
name1 = "British thermal unit (IT)",
name2 = "British thermal units (IT)",
symbol = "Btu<sub>IT</sub>",
utype = "energy",
scale = 1055.05585262,
default = "kJ",
link = "British thermal unit",
},
["BTU-mean"] = {
name1 = "British thermal unit (mean)",
name2 = "British thermal units (mean)",
symbol = "BTU<sub>mean</sub>",
utype = "energy",
scale = 1055.87,
default = "kJ",
link = "British thermal unit",
},
["Btu-mean"] = {
name1 = "British thermal unit (mean)",
name2 = "British thermal units (mean)",
symbol = "Btu<sub>mean</sub>",
utype = "energy",
scale = 1055.87,
default = "kJ",
link = "British thermal unit",
},
["BTU-th"] = {
name1 = "British thermal unit (thermochemical)",
name2 = "British thermal units (thermochemical)",
symbol = "BTU<sub>th</sub>",
utype = "energy",
scale = 1054.35026444,
default = "kJ",
link = "British thermal unit",
},
["Btu-th"] = {
name1 = "British thermal unit (thermochemical)",
name2 = "British thermal units (thermochemical)",
symbol = "Btu<sub>th</sub>",
utype = "energy",
scale = 1054.35026444,
default = "kJ",
link = "British thermal unit",
},
["Cal"] = {
name1 = "calorie",
symbol = "Cal",
utype = "energy",
scale = 4184,
default = "kJ",
},
["cal"] = {
name1 = "calorie",
symbol = "cal",
utype = "energy",
scale = 4.184,
default = "J",
},
["Cal-15"] = {
name1 = "Calorie (15°C)",
name2 = "Calories (15°C)",
symbol = "Cal<sub>15</sub>",
utype = "energy",
scale = 4185.8,
default = "kJ",
link = "Calorie",
},
["cal-15"] = {
name1 = "calorie (15°C)",
name2 = "calories (15°C)",
symbol = "cal<sub>15</sub>",
utype = "energy",
scale = 4.1858,
default = "J",
link = "Calorie",
},
["Cal-IT"] = {
name1 = "Calorie (International Steam Table)",
name2 = "Calories (International Steam Table)",
symbol = "Cal<sub>IT</sub>",
utype = "energy",
scale = 4186.8,
default = "kJ",
link = "Calorie",
},
["cal-IT"] = {
name1 = "calorie (International Steam Table)",
name2 = "calories (International Steam Table)",
symbol = "cal<sub>IT</sub>",
utype = "energy",
scale = 4.1868,
default = "J",
link = "Calorie",
},
["Cal-th"] = {
name1 = "Calorie (thermochemical)",
name2 = "Calories (thermochemical)",
symbol = "Cal<sub>th</sub>",
utype = "energy",
scale = 4184,
default = "kJ",
link = "Calorie",
},
["cal-th"] = {
name1 = "calorie (thermochemical)",
name2 = "calories (thermochemical)",
symbol = "cal<sub>th</sub>",
utype = "energy",
scale = 4.184,
default = "J",
link = "Calorie",
},
["CHU-IT"] = {
name1 = "Celsius heat unit (International Table)",
name2 = "Celsius heat units (International Table)",
symbol = "CHU<sub>IT</sub>",
utype = "energy",
scale = 1899.100534716,
default = "kJ",
link = "Conversion of units#Energy",
},
["cufootnaturalgas"] = {
name1 = "cubic foot of natural gas",
name2 = "cubic foot of natural gas",
symbol = "cuftnaturalgas",
usename = 1,
utype = "energy",
scale = 1055055.85262,
default = "MJ",
link = "Conversion of units#Energy",
},
["cuftnaturalgas"] = {
name1 = "cubic foot of natural gas",
name2 = "cubic feet of natural gas",
symbol = "cuftnaturalgas",
usename = 1,
utype = "energy",
scale = 1055055.85262,
default = "MJ",
link = "Conversion of units#Energy",
},
["Eh"] = {
name1 = "Hartree",
symbol = "''E''<sub>h</sub>",
utype = "energy",
scale = 4.35974417e-18,
default = "eV",
},
["erg"] = {
symbol = "erg",
utype = "energy",
scale = 0.0000001,
default = "μJ",
},
["eV"] = {
name1 = "electronvolt",
symbol = "eV",
utype = "energy",
scale = 1.602176487e-19,
default = "aJ",
},
["feV"] = {
name1 = "femtoelectronvolt",
symbol = "feV",
utype = "energy",
scale = 1.602176487e-34,
default = "yJ",
link = "Electronvolt",
},
["foe"] = {
symbol = "foe",
utype = "energy",
scale = 1e44,
default = "YJ",
link = "Foe (unit)",
},
["ftlb"] = {
name1 = "foot-pound",
symbol = "ft⋅lb",
utype = "energy",
alttype = "torque",
scale = 1.3558179483314004,
default = "J",
link = "Foot-pound (energy)",
},
["ftlb-f"] = {
name1 = "foot-pound force",
name2 = "foot-pounds force",
symbol = "ft⋅lb<sub>f</sub>",
utype = "energy",
alttype = "torque",
scale = 1.3558179483314004,
default = "J",
link = "Foot-pound (energy)",
},
["ftlbf"] = {
name1 = "foot-pound force",
name2 = "foot-pounds force",
symbol = "ft⋅lbf",
utype = "energy",
alttype = "torque",
scale = 1.3558179483314004,
default = "J",
link = "Foot-pound (energy)",
},
["ftpdl"] = {
name1 = "foot-poundal",
symbol = "ft⋅pdl",
utype = "energy",
scale = 0.0421401100938048,
default = "J",
},
["GeV"] = {
name1 = "gigaelectronvolt",
symbol = "GeV",
utype = "energy",
scale = 1.602176487e-10,
default = "nJ",
link = "Electronvolt",
},
["gTNT"] = {
name2 = "grams of TNT",
symbol = "gram of TNT",
usename = 1,
utype = "energy",
scale = 4184,
default = "kJ",
link = "TNT equivalent",
},
["Gtoe"] = {
name1 = "gigatonne of oil equivalent",
name2 = "gigatonnes of oil equivalent",
symbol = "Gtoe",
utype = "energy",
scale = 4.1868e19,
default = "EJ",
link = "Tonne of oil equivalent",
},
["GtonTNT"] = {
name2 = "gigatons of TNT",
symbol = "gigaton of TNT",
usename = 1,
utype = "energy",
scale = 4.184e18,
default = "EJ",
link = "TNT equivalent",
},
["GtTNT"] = {
name2 = "gigatonnes of TNT",
symbol = "gigatonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e18,
default = "EJ",
link = "TNT equivalent",
},
["GW.h"] = {
name1 = "gigawatt-hour",
symbol = "GW⋅h",
utype = "energy",
scale = 3.6e12,
default = "TJ",
link = "Kilowatt-hour",
},
["GWh"] = {
name1 = "gigawatt-hour",
symbol = "GWh",
utype = "energy",
scale = 3.6e12,
default = "TJ",
link = "Kilowatt-hour",
},
["hph"] = {
name1 = "horsepower-hour",
symbol = "hp⋅h",
utype = "energy",
scale = 2684519.537696172792,
default = "kWh",
link = "Horsepower",
},
["inlb"] = {
name1 = "inch-pound",
symbol = "in⋅lb",
utype = "energy",
alttype = "torque",
scale = 0.1129848290276167,
default = "mJ",
link = "Foot-pound (energy)",
},
["inlb-f"] = {
name1 = "inch-pound force",
name2 = "inch-pounds force",
symbol = "in⋅lb<sub>f</sub>",
utype = "energy",
alttype = "torque",
scale = 0.1129848290276167,
default = "mJ",
link = "Foot-pound (energy)",
},
["inlbf"] = {
name1 = "inch-pound force",
name2 = "inch-pounds force",
symbol = "in⋅lbf",
utype = "energy",
alttype = "torque",
scale = 0.1129848290276167,
default = "mJ",
link = "Foot-pound (energy)",
},
["inoz-f"] = {
name1 = "inch-ounce force",
name2 = "inch-ounces force",
symbol = "in⋅oz<sub>f</sub>",
utype = "energy",
alttype = "torque",
scale = 0.00706155181422604375,
default = "mJ",
link = "Foot-pound (energy)",
},
["inozf"] = {
name1 = "inch-ounce force",
name2 = "inch-ounces force",
symbol = "in⋅ozf",
utype = "energy",
alttype = "torque",
scale = 0.00706155181422604375,
default = "mJ",
link = "Foot-pound (energy)",
},
["J"] = {
_name1 = "joule",
_symbol = "J",
utype = "energy",
scale = 1,
prefixes = 1,
default = "cal",
link = "Joule",
},
["kBOE"] = {
name1 = "kilo barrel of oil equivalent",
name2 = "kilo barrels of oil equivalent",
symbol = "kBOE",
utype = "energy",
scale = 6.1178632e12,
default = "TJ",
link = "Barrel of oil equivalent",
},
["kcal"] = {
name1 = "kilocalorie",
symbol = "kcal",
utype = "energy",
scale = 4184,
default = "kJ",
link = "Calorie",
},
["kcal-15"] = {
name1 = "kilocalorie (15°C)",
name2 = "kilocalories (15°C)",
symbol = "kcal<sub>15</sub>",
utype = "energy",
scale = 4185.8,
default = "kJ",
link = "Calorie",
},
["kcal-IT"] = {
name1 = "kilocalorie (International Steam Table)",
name2 = "kilocalories (International Steam Table)",
symbol = "kcal<sub>IT</sub>",
utype = "energy",
scale = 4186.8,
default = "kJ",
link = "Calorie",
},
["kcal-th"] = {
name1 = "kilocalorie (thermochemical)",
name2 = "kilocalories (thermochemical)",
symbol = "kcal<sub>th</sub>",
utype = "energy",
scale = 4184,
default = "kJ",
link = "Calorie",
},
["kerg"] = {
name1 = "kiloerg",
symbol = "kerg",
utype = "energy",
scale = 0.0001,
default = "mJ",
link = "Erg",
},
["keV"] = {
name1 = "kiloelectronvolt",
symbol = "keV",
utype = "energy",
scale = 1.602176487e-16,
default = "fJ",
link = "Electronvolt",
},
["kgTNT"] = {
name2 = "kilograms of TNT",
symbol = "kilogram of TNT",
usename = 1,
utype = "energy",
scale = 4184000,
default = "MJ",
link = "TNT equivalent",
},
["kt(TNT)"] = {
name1 = "kilotonne",
name1_us = "kiloton",
symbol = "kt",
utype = "energy",
scale = 4.184e12,
default = "TJ",
link = "TNT equivalent",
},
["ktoe"] = {
name1 = "kilotonne of oil equivalent",
name2 = "kilotonnes of oil equivalent",
symbol = "ktoe",
utype = "energy",
scale = 4.1868e13,
default = "TJ",
link = "Tonne of oil equivalent",
},
["ktonTNT"] = {
name1 = "kiloton of TNT",
name2 = "kilotons of TNT",
symbol = "kt",
utype = "energy",
scale = 4.184e12,
default = "TJ",
link = "TNT equivalent",
},
["ktTNT"] = {
name2 = "kilotonnes of TNT",
symbol = "kilotonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e12,
default = "TJ",
link = "TNT equivalent",
},
["kW.h"] = {
name1 = "kilowatt-hour",
symbol = "kW⋅h",
utype = "energy",
scale = 3600000,
default = "MJ",
},
["kWh"] = {
name1 = "kilowatt-hour",
symbol = "kWh",
utype = "energy",
scale = 3600000,
default = "MJ",
},
["Mcal"] = {
name1 = "megacalorie",
symbol = "Mcal",
utype = "energy",
scale = 4184000,
default = "MJ",
link = "Calorie",
},
["mcal"] = {
name1 = "millicalorie",
symbol = "mcal",
utype = "energy",
scale = 0.004184,
default = "mJ",
link = "Calorie",
},
["Mcal-15"] = {
name1 = "megacalorie (15°C)",
name2 = "megacalories (15°C)",
symbol = "Mcal<sub>15</sub>",
utype = "energy",
scale = 4185800,
default = "MJ",
link = "Calorie",
},
["mcal-15"] = {
name1 = "millicalorie (15°C)",
name2 = "millicalories (15°C)",
symbol = "mcal<sub>15</sub>",
utype = "energy",
scale = 0.0041858,
default = "mJ",
link = "Calorie",
},
["Mcal-IT"] = {
name1 = "megacalorie (International Steam Table)",
name2 = "megacalories (International Steam Table)",
symbol = "Mcal<sub>IT</sub>",
utype = "energy",
scale = 4186800,
default = "MJ",
link = "Calorie",
},
["mcal-IT"] = {
name1 = "millicalorie (International Steam Table)",
name2 = "millicalories (International Steam Table)",
symbol = "mcal<sub>IT</sub>",
utype = "energy",
scale = 0.0041868,
default = "mJ",
link = "Calorie",
},
["Mcal-th"] = {
name1 = "megacalorie (thermochemical)",
name2 = "megacalories (thermochemical)",
symbol = "Mcal<sub>th</sub>",
utype = "energy",
scale = 4184000,
default = "MJ",
link = "Calorie",
},
["mcal-th"] = {
name1 = "millicalorie (thermochemical)",
name2 = "millicalories (thermochemical)",
symbol = "mcal<sub>th</sub>",
utype = "energy",
scale = 0.004184,
default = "mJ",
link = "Calorie",
},
["Merg"] = {
name1 = "megaerg",
symbol = "Merg",
utype = "energy",
scale = 0.1,
default = "J",
link = "Erg",
},
["merg"] = {
name1 = "millierg",
symbol = "merg",
utype = "energy",
scale = 0.0000000001,
default = "μJ",
link = "Erg",
},
["MeV"] = {
name1 = "megaelectronvolt",
symbol = "MeV",
utype = "energy",
scale = 1.602176487e-13,
default = "pJ",
link = "Electronvolt",
},
["meV"] = {
name1 = "millielectronvolt",
symbol = "meV",
utype = "energy",
scale = 1.602176487e-22,
default = "zJ",
link = "Electronvolt",
},
["MMBtu"] = {
name1 = "million British thermal units",
name2 = "million British thermal units",
symbol = "MMBtu",
utype = "energy",
scale = 1055055852.62,
default = "GJ",
link = "British thermal unit",
},
["Mt(TNT)"] = {
name1 = "megatonne",
name1_us = "megaton",
symbol = "Mt",
utype = "energy",
scale = 4.184e15,
default = "PJ",
link = "TNT equivalent",
},
["Mtoe"] = {
name1 = "megatonne of oil equivalent",
name2 = "megatonnes of oil equivalent",
symbol = "Mtoe",
utype = "energy",
scale = 4.1868e16,
default = "PJ",
link = "Tonne of oil equivalent",
},
["MtonTNT"] = {
name1 = "megaton of TNT",
name2 = "megatons of TNT",
symbol = "Mt",
utype = "energy",
scale = 4.184e15,
default = "PJ",
link = "TNT equivalent",
},
["mtonTNT"] = {
name2 = "millitons of TNT",
symbol = "milliton of TNT",
usename = 1,
utype = "energy",
scale = 4184000,
default = "MJ",
link = "TNT equivalent",
},
["MtTNT"] = {
name2 = "megatonnes of TNT",
symbol = "megatonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e15,
default = "PJ",
link = "TNT equivalent",
},
["mtTNT"] = {
name2 = "millitonnes of TNT",
symbol = "millitonne of TNT",
usename = 1,
utype = "energy",
scale = 4184000,
default = "MJ",
link = "TNT equivalent",
},
["MW.h"] = {
name1 = "megawatt-hour",
symbol = "MW⋅h",
utype = "energy",
scale = 3600000000,
default = "GJ",
link = "Kilowatt-hour",
},
["mW.h"] = {
name1 = "milliwatt-hour",
symbol = "mW⋅h",
utype = "energy",
scale = 3.6,
default = "J",
link = "Kilowatt-hour",
},
["MWh"] = {
name1 = "megawatt-hour",
symbol = "MWh",
utype = "energy",
scale = 3600000000,
default = "GJ",
link = "Kilowatt-hour",
},
["mWh"] = {
name1 = "milliwatt-hour",
symbol = "mWh",
utype = "energy",
scale = 3.6,
default = "J",
link = "Kilowatt-hour",
},
["neV"] = {
name1 = "nanoelectronvolt",
symbol = "neV",
utype = "energy",
scale = 1.602176487e-28,
default = "yJ",
link = "Electronvolt",
},
["PeV"] = {
name1 = "petaelectronvolt",
symbol = "PeV",
utype = "energy",
scale = 0.0001602176487,
default = "mJ",
link = "Electronvolt",
},
["peV"] = {
name1 = "picoelectronvolt",
symbol = "peV",
utype = "energy",
scale = 1.602176487e-31,
default = "yJ",
link = "Electronvolt",
},
["PSh"] = {
name1 = "Pferdestärkenstunde",
symbol = "PSh",
utype = "energy",
scale = 2647795.5,
default = "kWh",
},
["quad"] = {
name1 = "quadrillion British thermal units",
name2 = "quadrillion British thermal units",
symbol = "quad",
utype = "energy",
scale = 1.054804e18,
default = "EJ",
link = "Quad (unit)",
},
["Ry"] = {
name1 = "rydberg",
symbol = "Ry",
utype = "energy",
scale = 2.1798741e-18,
default = "eV",
link = "Rydberg constant",
},
["scf"] = {
name1 = "standard cubic foot",
name2 = "standard cubic feet",
symbol = "scf",
utype = "energy",
scale = 2869.2044809344,
default = "kJ",
},
["scfoot"] = {
name1 = "standard cubic foot",
name2 = "standard cubic foot",
symbol = "scf",
utype = "energy",
scale = 2869.2044809344,
default = "kJ",
},
["t(TNT)"] = {
name1 = "tonne",
name1_us = "ton",
symbol = "t",
utype = "energy",
scale = 4184000000,
default = "GJ",
link = "TNT equivalent",
},
["TeV"] = {
name1 = "teraelectronvolt",
symbol = "TeV",
utype = "energy",
scale = 1.602176487e-7,
default = "μJ",
link = "Electronvolt",
},
["th"] = {
name1 = "thermie",
symbol = "th",
utype = "energy",
scale = 4186800,
default = "MJ",
link = "Conversion of units#Energy",
},
["thm-EC"] = {
name1 = "therm (EC)",
name2 = "therms (EC)",
symbol = "thm (EC)",
utype = "energy",
scale = 105506000,
default = "MJ",
link = "Therm",
},
["thm-UK"] = {
name1 = "therm (UK)",
name2 = "therms (UK)",
symbol = "thm (UK)",
utype = "energy",
scale = 105505585.257348,
default = "MJ",
link = "Therm",
},
["thm-US"] = {
name1 = "therm (US)",
name1_us = "therm (U.S.)",
name2 = "therms (US)",
name2_us = "therms (U.S.)",
symbol = "thm (US)",
sym_us = "thm (U.S.)",
utype = "energy",
scale = 105480400,
default = "MJ",
link = "Therm",
},
["toe"] = {
name1 = "tonne of oil equivalent",
name2 = "tonnes of oil equivalent",
symbol = "toe",
utype = "energy",
scale = 41868000000,
default = "GJ",
},
["tonTNT"] = {
name2 = "tons of TNT",
symbol = "ton of TNT",
usename = 1,
utype = "energy",
scale = 4184000000,
default = "GJ",
link = "TNT equivalent",
},
["tTNT"] = {
name2 = "tonnes of TNT",
symbol = "tonne of TNT",
usename = 1,
utype = "energy",
scale = 4184000000,
default = "GJ",
link = "TNT equivalent",
},
["TtonTNT"] = {
name2 = "teratons of TNT",
symbol = "teraton of TNT",
usename = 1,
utype = "energy",
scale = 4.184e21,
default = "ZJ",
link = "TNT equivalent",
},
["TtTNT"] = {
name2 = "teratonnes of TNT",
symbol = "teratonne of TNT",
usename = 1,
utype = "energy",
scale = 4.184e21,
default = "ZJ",
link = "TNT equivalent",
},
["TW.h"] = {
name1 = "terawatt-hour",
symbol = "TW⋅h",
utype = "energy",
scale = 3.6e15,
default = "PJ",
link = "Kilowatt-hour",
},
["TWh"] = {
name1 = "terawatt-hour",
symbol = "TWh",
utype = "energy",
scale = 3.6e15,
default = "PJ",
link = "Kilowatt-hour",
},
["W.h"] = {
name1 = "watt-hour",
symbol = "W⋅h",
utype = "energy",
scale = 3600,
default = "kJ",
link = "Kilowatt-hour",
},
["Wh"] = {
name1 = "watt-hour",
symbol = "Wh",
utype = "energy",
scale = 3600,
default = "kJ",
link = "Kilowatt-hour",
},
["μerg"] = {
name1 = "microerg",
symbol = "μerg",
utype = "energy",
scale = 1e-13,
default = "nJ",
link = "Erg",
},
["μeV"] = {
name1 = "microelectronvolt",
symbol = "μeV",
utype = "energy",
scale = 1.602176487e-25,
default = "yJ",
link = "Electronvolt",
},
["μW.h"] = {
name1 = "microwatt-hour",
symbol = "μW⋅h",
utype = "energy",
scale = 0.0036,
default = "mJ",
link = "Kilowatt-hour",
},
["μWh"] = {
name1 = "microwatt-hour",
symbol = "μWh",
utype = "energy",
scale = 0.0036,
default = "mJ",
link = "Kilowatt-hour",
},
["-kW.h"] = {
target = "kW.h",
link = "Kilowatt hour",
},
["btu"] = {
target = "BTU",
},
["Calorie"] = {
target = "Cal",
},
["ft.lbf"] = {
target = "ftlbf",
},
["ft·lbf"] = {
target = "ftlbf",
},
["g-cal-15"] = {
target = "cal-15",
},
["g-cal-IT"] = {
target = "cal-IT",
},
["g-cal-th"] = {
target = "cal-th",
},
["g-kcal-15"] = {
target = "kcal-15",
},
["g-kcal-IT"] = {
target = "kcal-IT",
},
["g-kcal-th"] = {
target = "kcal-th",
},
["g-Mcal-15"] = {
target = "Mcal-15",
},
["g-mcal-15"] = {
target = "mcal-15",
},
["g-Mcal-IT"] = {
target = "Mcal-IT",
},
["g-mcal-IT"] = {
target = "mcal-IT",
},
["g-Mcal-th"] = {
target = "Mcal-th",
},
["g-mcal-th"] = {
target = "mcal-th",
},
["GW-h"] = {
target = "GW.h",
},
["GW·h"] = {
target = "GW.h",
},
["Hartree"] = {
target = "Eh",
},
["hp.h"] = {
target = "hph",
},
["in.lb-f"] = {
target = "inlb-f",
},
["in.lbf"] = {
target = "inlbf",
},
["in.oz-f"] = {
target = "inoz-f",
},
["in.ozf"] = {
target = "inozf",
},
["kbboe"] = {
target = "kBOE",
symbol = "kbboe",
},
["kg-cal-15"] = {
target = "Cal-15",
},
["kg-cal-IT"] = {
target = "Cal-IT",
},
["kg-cal-th"] = {
target = "Cal-th",
},
["kW-h"] = {
target = "kW.h",
},
["kW·h"] = {
target = "kW.h",
},
["MW-h"] = {
target = "MW.h",
},
["mW-h"] = {
target = "mW.h",
},
["MW·h"] = {
target = "MW.h",
},
["TW-h"] = {
target = "TW.h",
},
["uerg"] = {
target = "μerg",
},
["ueV"] = {
target = "μeV",
},
["uW-h"] = {
target = "μW.h",
},
["uW.h"] = {
target = "μW.h",
},
["uWh"] = {
target = "μWh",
},
["W-h"] = {
target = "W.h",
},
["eVpar"] = {
_name1 = "electronvolt",
_symbol = "eV",
utype = "energy per chemical amount",
scale = 96485.329522144166,
prefixes = 1,
default = "kcal/mol",
link = "Electronvolt",
},
["kcal/mol"] = {
per = { "kcal", "mol" },
utype = "energy per chemical amount",
default = "kJ/mol",
link = "Kilocalorie per mole",
},
["kJ/mol"] = {
per = { "kJ", "mol" },
utype = "energy per chemical amount",
default = "kcal/mol",
link = "Joule per mole",
},
["kWh/100 km"] = {
name1 = "kilowatt-hour per 100 kilometres",
name1_us = "kilowatt-hour per 100 kilometers",
name2 = "kilowatt-hours per 100 kilometres",
name2_us = "kilowatt-hours per 100 kilometers",
symbol = "kW⋅h/100 km",
utype = "energy per unit length",
scale = 36,
default = "MJ/km kWh/mi",
link = "Kilowatt-hour",
},
["kWh/100 mi"] = {
name1 = "kilowatt-hour per 100 miles",
name2 = "kilowatt-hours per 100 miles",
symbol = "kW⋅h/100 mi",
utype = "energy per unit length",
scale = 22.3694,
default = "mpge",
link = "Miles per gallon gasoline equivalent",
},
["MJ/100 km"] = {
name1 = "megajoule per 100 kilometres",
name1_us = "megajoule per 100 kilometers",
name2 = "megajoules per 100 kilometres",
name2_us = "megajoules per 100 kilometers",
symbol = "MJ/100 km",
utype = "energy per unit length",
scale = 10,
default = "BTU/mi",
link = "British thermal unit",
},
["mpge"] = {
name1 = "mile per gallon gasoline equivalent",
name2 = "miles per gallon gasoline equivalent",
symbol = "mpg‑e",
utype = "energy per unit length",
scale = 1.3263314048360777e-5,
invert = -1,
iscomplex= true,
default = "kWh/100 mi",
link = "Miles per gallon gasoline equivalent",
},
["BTU/mi"] = {
per = { "BTU", "mi" },
utype = "energy per unit length",
default = "v > 1525 ! M ! k ! J/km",
},
["kJ/km"] = {
per = { "kJ", "km" },
utype = "energy per unit length",
default = "BTU/mi",
},
["kWh/km"] = {
per = { "-kW.h", "km" },
utype = "energy per unit length",
default = "MJ/km kWh/mi",
},
["kWh/mi"] = {
per = { "-kW.h", "mi" },
utype = "energy per unit length",
default = "kWh/km MJ/km",
},
["MJ/km"] = {
per = { "MJ", "km" },
utype = "energy per unit length",
default = "BTU/mi",
},
["mpg-e"] = {
target = "mpge",
},
["BTU/lb"] = {
name1 = "British thermal unit per pound",
name2 = "British thermal units per pound",
symbol = "BTU/lb",
utype = "energy per unit mass",
scale = 2326,
default = "kJ/kg",
link = "British thermal unit",
},
["cal/g"] = {
name1 = "calorie per gram",
name2 = "calories per gram",
symbol = "cal/g",
utype = "energy per unit mass",
scale = 4184,
default = "J/g",
},
["GJ/kg"] = {
name1 = "gigajoule per kilogram",
name2 = "gigajoules per kilogram",
symbol = "GJ/kg",
utype = "energy per unit mass",
scale = 1e9,
default = "ktTNT/t",
link = "Specific energy",
},
["J/g"] = {
name1 = "joule per gram",
name2 = "joules per gram",
symbol = "J/g",
utype = "energy per unit mass",
scale = 1000,
default = "kcal/g",
link = "Specific energy",
},
["kcal/g"] = {
name1 = "kilocalorie per gram",
name2 = "kilocalories per gram",
symbol = "kcal/g",
utype = "energy per unit mass",
scale = 4184000,
default = "kJ/g",
},
["kJ/g"] = {
name1 = "kilojoule per gram",
name2 = "kilojoules per gram",
symbol = "kJ/g",
utype = "energy per unit mass",
scale = 1000000,
default = "kcal/g",
link = "Specific energy",
},
["kJ/kg"] = {
name1 = "kilojoule per kilogram",
name2 = "kilojoules per kilogram",
symbol = "kJ/kg",
utype = "energy per unit mass",
scale = 1000,
default = "BTU/lb",
link = "Specific energy",
},
["ktonTNT/MT"] = {
name2 = "kilotons of TNT per metric ton",
symbol = "kiloton of TNT per metric ton",
usename = 1,
utype = "energy per unit mass",
scale = 4184000000,
default = "GJ/kg",
link = "TNT equivalent",
},
["ktTNT/t"] = {
name2 = "kilotonnes of TNT per tonne",
symbol = "kilotonne of TNT per tonne",
usename = 1,
utype = "energy per unit mass",
scale = 4184000000,
default = "GJ/kg",
link = "TNT equivalent",
},
["MtonTNT/MT"] = {
name2 = "megatons of TNT per metric ton",
symbol = "megaton of TNT per metric ton",
usename = 1,
utype = "energy per unit mass",
scale = 4.184e12,
default = "TJ/kg",
link = "TNT equivalent",
},
["MtTNT/MT"] = {
name2 = "megatonnes of TNT per tonne",
symbol = "megatonne of TNT per tonne",
usename = 1,
utype = "energy per unit mass",
scale = 4.184e12,
default = "TJ/kg",
link = "TNT equivalent",
},
["TJ/kg"] = {
name1 = "terajoule per kilogram",
name2 = "terajoules per kilogram",
symbol = "TJ/kg",
utype = "energy per unit mass",
scale = 1e12,
default = "MtTNT/MT",
link = "Specific energy",
},
["Cal/g"] = {
per = { "Cal", "g" },
utype = "energy per unit mass",
default = "kJ/g",
},
["BTU/cuft"] = {
per = { "BTU", "cuft" },
utype = "energy per unit volume",
default = "kJ/L",
},
["Cal/12USoz(mL)serve"] = {
per = { "Cal", "-12USoz(mL)serve" },
utype = "energy per unit volume",
default = "kJ/L",
},
["Cal/12USoz(ml)serve"] = {
per = { "Cal", "-12USoz(ml)serve" },
utype = "energy per unit volume",
default = "kJ/l",
},
["Cal/12USozserve"] = {
per = { "Cal", "-12USozserve" },
utype = "energy per unit volume",
default = "kJ/L",
},
["Cal/USoz"] = {
per = { "Cal", "USoz" },
utype = "energy per unit volume",
default = "kJ/ml",
},
["kJ/L"] = {
per = { "kJ", "L" },
utype = "energy per unit volume",
default = "BTU/cuft",
},
["kJ/l"] = {
per = { "kJ", "ll" },
utype = "energy per unit volume",
default = "BTU/cuft",
},
["kJ/ml"] = {
per = { "kJ", "ml" },
utype = "energy per unit volume",
default = "Cal/USoz",
},
["MJ/m3"] = {
per = { "MJ", "m3" },
utype = "energy per unit volume",
default = "BTU/cuft",
},
["Sv"] = {
_name1 = "sievert",
_symbol = "Sv",
utype = "equivalent radiation dose",
scale = 1,
prefixes = 1,
default = "rem",
link = "Sievert",
},
["rem"] = {
_name1 = "rem",
_symbol = "rem",
utype = "equivalent radiation dose",
scale = 0.01,
prefixes = 1,
default = "Sv",
link = "Roentgen equivalent man",
},
["g/km"] = {
name1 = "gram per kilometre",
name1_us = "gram per kilometer",
name2 = "grams per kilometre",
name2_us = "grams per kilometer",
symbol = "g/km",
utype = "exhaust emission",
scale = 1e-6,
default = "oz/mi",
link = "Exhaust gas",
},
["g/mi"] = {
name1 = "gram per mile",
name2 = "grams per mile",
symbol = "g/mi",
utype = "exhaust emission",
scale = 6.2137119223733397e-7,
default = "g/km",
link = "Exhaust gas",
},
["gCO2/km"] = {
name1 = "gram of CO<sub>2</sub> per kilometre",
name1_us = "gram of CO<sub>2</sub> per kilometer",
name2 = "grams of CO<sub>2</sub> per kilometre",
name2_us = "grams of CO<sub>2</sub> per kilometer",
symbol = "g(CO<sub>2</sub>)/km",
utype = "exhaust emission",
scale = 1e-6,
default = "ozCO2/mi",
link = "Exhaust gas",
},
["gCO2/mi"] = {
name1 = "gram of CO<sub>2</sub> per mile",
name2 = "grams of CO<sub>2</sub> per mile",
symbol = "g(CO<sub>2</sub>)/mi",
utype = "exhaust emission",
scale = 6.2137119223733397e-7,
default = "gCO2/km",
link = "Exhaust gas",
},
["kg/km"] = {
name1 = "kilogram per kilometre",
name1_us = "kilogram per kilometer",
name2 = "kilograms per kilometre",
name2_us = "kilograms per kilometer",
symbol = "kg/km",
utype = "exhaust emission",
scale = 0.001,
default = "lb/mi",
link = "Exhaust gas",
},
["kgCO2/km"] = {
name1 = "kilogram of CO<sub>2</sub> per kilometre",
name1_us = "kilogram of CO<sub>2</sub> per kilometer",
name2 = "kilograms of CO<sub>2</sub> per kilometre",
name2_us = "kilograms of CO<sub>2</sub> per kilometer",
symbol = "kg(CO<sub>2</sub>)/km",
utype = "exhaust emission",
scale = 0.001,
default = "lbCO2/mi",
link = "Exhaust gas",
},
["lb/mi"] = {
name1 = "pound per mile",
name2 = "pounds per mile",
symbol = "lb/mi",
utype = "exhaust emission",
scale = 0.00028184923173665794,
default = "kg/km",
link = "Exhaust gas",
},
["lbCO2/mi"] = {
name1 = "pound of CO<sub>2</sub> per mile",
name2 = "pounds of CO<sub>2</sub> per mile",
symbol = "lb(CO<sub>2</sub>)/mi",
utype = "exhaust emission",
scale = 0.00028184923173665794,
default = "kgCO2/km",
link = "Exhaust gas",
},
["oz/mi"] = {
name1 = "ounce per mile",
name2 = "ounces per mile",
symbol = "oz/mi",
utype = "exhaust emission",
scale = 1.7615576983541121e-5,
default = "g/km",
link = "Exhaust gas",
},
["ozCO2/mi"] = {
name1 = "ounce of CO<sub>2</sub> per mile",
name2 = "ounces of CO<sub>2</sub> per mile",
symbol = "oz(CO<sub>2</sub>)/mi",
utype = "exhaust emission",
scale = 1.7615576983541121e-5,
default = "gCO2/km",
link = "Exhaust gas",
},
["cuft/a"] = {
name1 = "cubic foot per annum",
name2 = "cubic feet per annum",
symbol = "cu ft/a",
utype = "flow",
scale = 8.9730672142368242e-10,
default = "m3/a",
link = "Cubic foot per second",
},
["cuft/d"] = {
name1 = "cubic foot per day",
name2 = "cubic feet per day",
symbol = "cu ft/d",
utype = "flow",
scale = 3.2774128000000003e-7,
default = "m3/d",
link = "Cubic foot per second",
},
["cuft/h"] = {
name1 = "cubic foot per hour",
name2 = "cubic feet per hour",
symbol = "cu ft/h",
utype = "flow",
scale = 7.8657907200000004e-6,
default = "m3/h",
link = "Cubic foot per second",
},
["cuft/min"] = {
name1 = "cubic foot per minute",
name2 = "cubic feet per minute",
symbol = "cu ft/min",
utype = "flow",
scale = 0.00047194744319999999,
default = "m3/min",
},
["cuft/s"] = {
name1 = "cubic foot per second",
name2 = "cubic feet per second",
symbol = "cu ft/s",
utype = "flow",
scale = 28316846592e-12,
default = "m3/s",
},
["cumi/a"] = {
name1 = "cubic mile per annum",
name2 = "cubic miles per annum",
symbol = "cu mi/a",
utype = "flow",
scale = 132.08171170940057,
default = "km3/a",
link = "Cubic foot per second",
},
["cuyd/h"] = {
name1 = "cubic yard per hour",
name2 = "cubic yards per hour",
symbol = "cuyd/h",
utype = "flow",
scale = 0.00021237634944000001,
default = "m3/h",
link = "Cubic foot per second",
},
["cuyd/s"] = {
name1 = "cubic yard per second",
name2 = "cubic yards per second",
symbol = "cu yd/s",
utype = "flow",
scale = 0.76455485798400002,
default = "m3/s",
},
["Goilbbl/a"] = {
name1 = "billion barrels per year",
name2 = "billion barrels per year",
symbol = "Gbbl/a",
utype = "flow",
scale = 5.0380033629933836,
default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3/a",
link = "Barrel per day",
},
["impgal/h"] = {
name1 = "imperial gallon per hour",
name2 = "imperial gallons per hour",
symbol = "imp gal/h",
utype = "flow",
scale = 1.2628027777777779e-6,
default = "m3/h",
link = "Gallon",
},
["impgal/min"] = {
name1 = "imperial gallon per minute",
name2 = "imperial gallons per minute",
symbol = "imp gal/min",
utype = "flow",
scale = 7.5768166666666671e-5,
default = "m3/s",
link = "Gallon",
},
["impgal/s"] = {
name1 = "imperial gallon per second",
name2 = "imperial gallons per second",
symbol = "impgal/s",
utype = "flow",
scale = 0.00454609,
default = "m3/s",
link = "Imperial gallons per second",
},
["km3/a"] = {
name1 = "cubic kilometre per annum",
name1_us = "cubic kilometer per annum",
name2 = "cubic kilometres per annum",
name2_us = "cubic kilometers per annum",
symbol = "km<sup>3</sup>/a",
utype = "flow",
scale = 31.68808781402895,
default = "cumi/a",
link = "Cubic metre per second",
},
["km3/d"] = {
name1 = "cubic kilometre per day",
name1_us = "cubic kilometer per day",
name2 = "cubic kilometres per day",
name2_us = "cubic kilometers per day",
symbol = "km<sup>3</sup>/d",
utype = "flow",
scale = 11574.074074074075,
default = "cuft/d",
link = "Cubic metre per second",
},
["koilbbl/a"] = {
name1 = "thousand barrels per year",
name2 = "thousand barrels per year",
symbol = "kbbl/a",
utype = "flow",
scale = 5.0380033629933841e-6,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3/a",
link = "Barrel per day",
},
["koilbbl/d"] = {
name1 = "thousand barrels per day",
name2 = "thousand barrels per day",
symbol = "kbbl/d",
utype = "flow",
scale = 0.0018401307283333335,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3/d",
link = "Barrel per day",
},
["L/h"] = {
name1 = "litre per hour",
name1_us = "liter per hour",
name2 = "litres per hour",
name2_us = "liters per hour",
symbol = "L/h",
utype = "flow",
scale = 2.7777777777777776e-7,
default = "impgal/h USgal/h",
link = "Cubic metre per second",
},
["L/min"] = {
name1 = "litre per minute",
name1_us = "liter per minute",
name2 = "litres per minute",
name2_us = "liters per minute",
symbol = "L/min",
utype = "flow",
scale = 1.6666666666666667e-5,
default = "impgal/min USgal/min",
link = "Cubic metre per second",
},
["L/s"] = {
name1 = "litre per second",
name1_us = "liter per second",
name2 = "litres per second",
name2_us = "liters per second",
symbol = "L/s",
utype = "flow",
scale = 0.001,
default = "cuft/s",
link = "Cubic metre per second",
},
["m3/a"] = {
name1 = "cubic metre per annum",
name1_us = "cubic meter per annum",
name2 = "cubic metres per annum",
name2_us = "cubic meters per annum",
symbol = "m<sup>3</sup>/a",
utype = "flow",
scale = 3.1688087814028947e-8,
default = "cuft/a",
link = "Cubic metre per second",
},
["m3/d"] = {
name1 = "cubic metre per day",
name1_us = "cubic meter per day",
name2 = "cubic metres per day",
name2_us = "cubic meters per day",
symbol = "m<sup>3</sup>/d",
utype = "flow",
scale = 1.1574074074074073e-5,
default = "cuft/d",
link = "Cubic metre per second",
},
["m3/h"] = {
name1 = "cubic metre per hour",
name1_us = "cubic meter per hour",
name2 = "cubic metres per hour",
name2_us = "cubic meters per hour",
symbol = "m<sup>3</sup>/h",
utype = "flow",
scale = 0.00027777777777777778,
default = "cuft/h",
link = "Cubic metre per second",
},
["m3/min"] = {
name1 = "cubic metre per minute",
name1_us = "cubic meter per minute",
name2 = "cubic metres per minute",
name2_us = "cubic meters per minute",
symbol = "m<sup>3</sup>/min",
utype = "flow",
scale = 0.016666666666666666,
default = "cuft/min",
link = "Cubic metre per second",
},
["m3/s"] = {
name1 = "cubic metre per second",
name1_us = "cubic meter per second",
name2 = "cubic metres per second",
name2_us = "cubic meters per second",
symbol = "m<sup>3</sup>/s",
utype = "flow",
scale = 1,
default = "cuft/s",
},
["Moilbbl/a"] = {
name1 = "million barrels per year",
name2 = "million barrels per year",
symbol = "Mbbl/a",
utype = "flow",
scale = 0.0050380033629933837,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/a",
link = "Barrel per day",
},
["Moilbbl/d"] = {
name1 = "million barrels per day",
name2 = "million barrels per day",
symbol = "Mbbl/d",
utype = "flow",
scale = 1.8401307283333335,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/d",
link = "Barrel per day",
},
["oilbbl/a"] = {
name1 = "barrel per year",
name2 = "barrels per year",
symbol = "bbl/a",
utype = "flow",
scale = 5.0380033629933841e-9,
default = "m3/a",
link = "Barrel per day",
},
["oilbbl/d"] = {
name1 = "barrel per day",
name2 = "barrels per day",
symbol = "bbl/d",
utype = "flow",
scale = 1.8401307283333336e-6,
default = "m3/d",
},
["Toilbbl/a"] = {
name1 = "trillion barrels per year",
name2 = "trillion barrels per year",
symbol = "Tbbl/a",
utype = "flow",
scale = 5038.0033629933832,
default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3/a",
link = "Barrel per day",
},
["U.S.gal/d"] = {
name1 = "U.S. gallon per day",
name2 = "U.S. gallons per day",
symbol = "U.S. gal/d",
utype = "flow",
scale = 4.3812636388888893e-8,
default = "m3/s",
customary= 1,
},
["U.S.gal/h"] = {
name1 = "gallon per hour",
name2 = "gallons per hour",
symbol = "gal/h",
utype = "flow",
scale = 1.0515032733333334e-6,
default = "m3/h",
link = "Gallon",
customary= 2,
},
["U.S.gal/min"] = {
name1 = "U.S. gallon per minute",
name2 = "U.S. gallons per minute",
symbol = "U.S. gal/min",
utype = "flow",
scale = 6.3090196400000003e-5,
default = "m3/s",
link = "Gallon",
},
["USgal/a"] = {
name1 = "US gallon per year",
name2 = "US gallons per year",
symbol = "US gal/a",
utype = "flow",
scale = 1.1995246102365199e-10,
default = "m3/s",
},
["USgal/d"] = {
name1 = "US gallon per day",
name2 = "US gallons per day",
symbol = "US gal/d",
utype = "flow",
scale = 4.3812636388888893e-8,
default = "m3/s",
},
["USgal/h"] = {
name1 = "gallon per hour",
name2 = "gallons per hour",
symbol = "gal/h",
utype = "flow",
scale = 1.0515032733333334e-6,
default = "m3/h",
link = "Gallon",
customary= 1,
},
["USgal/min"] = {
name1 = "US gallon per minute",
name2 = "US gallons per minute",
symbol = "US gal/min",
utype = "flow",
scale = 6.3090196400000003e-5,
default = "m3/s",
link = "Gallon",
},
["USgal/s"] = {
name1 = "US gallon per second",
name1_us = "U.S. gallon per second",
name2 = "US gallons per second",
name2_us = "U.S. gallons per second",
symbol = "USgal/s",
utype = "flow",
scale = 0.003785411784,
default = "m3/s",
link = "US gallons per second",
},
["ft3/a"] = {
target = "cuft/a",
},
["ft3/d"] = {
target = "cuft/d",
},
["ft3/h"] = {
target = "cuft/h",
},
["ft3/s"] = {
target = "cuft/s",
},
["Gcuft/a"] = {
target = "e9cuft/a",
},
["Gcuft/d"] = {
target = "e9cuft/d",
},
["kcuft/a"] = {
target = "e3cuft/a",
},
["kcuft/d"] = {
target = "e3cuft/d",
},
["kcuft/s"] = {
target = "e3cuft/s",
},
["Mcuft/a"] = {
target = "e6cuft/a",
},
["Mcuft/d"] = {
target = "e6cuft/d",
},
["Mcuft/s"] = {
target = "e6cuft/s",
},
["m³/s"] = {
target = "m3/s",
},
["Tcuft/a"] = {
target = "e12cuft/a",
},
["Tcuft/d"] = {
target = "e12cuft/d",
},
["u.s.gal/min"] = {
target = "U.S.gal/min",
},
["usgal/min"] = {
target = "USgal/min",
},
["-LTf"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "LTf",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["-STf"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "STf",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["dyn"] = {
name1 = "dyne",
symbol = "dyn",
utype = "force",
scale = 0.00001,
default = "gr-f",
},
["g-f"] = {
name1 = "gram-force",
name2 = "grams-force",
symbol = "g<sub>f</sub>",
utype = "force",
scale = 0.00980665,
default = "mN oz-f",
link = "Kilogram-force",
},
["gf"] = {
name1 = "gram-force",
name2 = "grams-force",
symbol = "gf",
utype = "force",
scale = 0.00980665,
default = "mN ozf",
link = "Kilogram-force",
},
["gr-f"] = {
name1 = "grain-force",
name2 = "grains-force",
symbol = "gr<sub>f</sub>",
utype = "force",
scale = 0.0006354602307515,
default = "μN",
link = "Pound (force)",
},
["grf"] = {
name1 = "grain-force",
name2 = "grains-force",
symbol = "grf",
utype = "force",
scale = 0.0006354602307515,
default = "μN",
link = "Pound (force)",
},
["kdyn"] = {
name1 = "kilodyne",
symbol = "kdyn",
utype = "force",
scale = 0.01,
default = "oz-f",
link = "Dyne",
},
["kg-f"] = {
name1 = "kilogram-force",
name2 = "kilograms-force",
symbol = "kg<sub>f</sub>",
utype = "force",
scale = 9.80665,
default = "N lb-f",
},
["kgf"] = {
name1 = "kilogram-force",
name2 = "kilograms-force",
symbol = "kgf",
utype = "force",
scale = 9.80665,
default = "N lbf",
},
["kp"] = {
name1 = "kilopond",
symbol = "kp",
utype = "force",
scale = 9.80665,
default = "N lb-f",
link = "Kilogram-force",
},
["L/T-f"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "L/T<sub>f</sub>",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["L/Tf"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "L/Tf",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["lb-f"] = {
name1 = "pound-force",
name2 = "pounds-force",
symbol = "lb<sub>f</sub>",
utype = "force",
scale = 4.4482216152605,
default = "N",
link = "Pound (force)",
},
["lbf"] = {
name1 = "pound-force",
name2 = "pounds-force",
symbol = "lbf",
utype = "force",
scale = 4.4482216152605,
default = "N",
link = "Pound (force)",
},
["lb(f)"] = {
name1 = "pound",
symbol = "lb",
utype = "force",
scale = 4.4482216152605,
default = "N",
link = "Pound (force)",
},
["LT-f"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "LT<sub>f</sub>",
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["LTf"] = {
name1 = "long ton-force",
name2 = "long tons-force",
symbol = "LTf",
usename = 1,
utype = "force",
scale = 9964.01641818352,
default = "kN",
},
["Mdyn"] = {
name1 = "megadyne",
symbol = "Mdyn",
utype = "force",
scale = 10,
default = "lb-f",
link = "Dyne",
},
["mdyn"] = {
name1 = "millidyne",
symbol = "mdyn",
utype = "force",
scale = 0.00000001,
default = "gr-f",
link = "Dyne",
},
["mg-f"] = {
name1 = "milligram-force",
name2 = "milligrams-force",
symbol = "mg<sub>f</sub>",
utype = "force",
scale = 0.00000980665,
default = "μN gr-f",
link = "Kilogram-force",
},
["mgf"] = {
name1 = "milligram-force",
name2 = "milligrams-force",
symbol = "mgf",
utype = "force",
scale = 0.00000980665,
default = "μN grf",
link = "Kilogram-force",
},
["Mp"] = {
name1 = "megapond",
symbol = "Mp",
utype = "force",
scale = 9806.65,
default = "kN LT-f ST-f",
link = "Kilogram-force",
},
["mp"] = {
name1 = "millipond",
symbol = "mp",
utype = "force",
scale = 0.00000980665,
default = "μN gr-f",
link = "Kilogram-force",
},
["N"] = {
_name1 = "newton",
_symbol = "N",
utype = "force",
scale = 1,
prefixes = 1,
default = "lb-f",
link = "Newton (unit)",
},
["oz-f"] = {
name1 = "ounce-force",
name2 = "ounces-force",
symbol = "oz<sub>f</sub>",
utype = "force",
scale = 0.2780138203095378125,
default = "mN",
link = "Pound (force)",
},
["ozf"] = {
name1 = "ounce-force",
name2 = "ounces-force",
symbol = "ozf",
utype = "force",
scale = 0.2780138203095378125,
default = "mN",
link = "Pound (force)",
},
["p"] = {
name1 = "pond",
symbol = "p",
utype = "force",
scale = 0.00980665,
default = "mN oz-f",
link = "Kilogram-force",
},
["pdl"] = {
name1 = "poundal",
symbol = "pdl",
utype = "force",
scale = 0.138254954376,
default = "N",
},
["S/T-f"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "S/T<sub>f</sub>",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["S/Tf"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "S/Tf",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["ST-f"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "ST<sub>f</sub>",
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["STf"] = {
name1 = "short ton-force",
name2 = "short tons-force",
symbol = "STf",
usename = 1,
utype = "force",
scale = 8896.443230521,
default = "kN",
},
["t-f"] = {
name1 = "tonne-force",
name2 = "tonnes-force",
symbol = "t<sub>f</sub>",
utype = "force",
scale = 9806.65,
default = "kN LT-f ST-f",
link = "Ton-force#Tonne-force",
},
["tf"] = {
name1 = "tonne-force",
name2 = "tonnes-force",
symbol = "tf",
utype = "force",
scale = 9806.65,
default = "kN LTf STf",
link = "Ton-force#Tonne-force",
},
["dyne"] = {
target = "dyn",
},
["newtons"] = {
target = "N",
},
["poundal"] = {
target = "pdl",
},
["tonne-force"] = {
target = "tf",
},
["impgal/mi"] = {
per = { "@impgal", "mi" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "L/km USgal/mi",
},
["km/L"] = {
per = { "km", "L" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "mpgimp mpgus",
},
["km/l"] = {
per = { "km", "ll" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "mpgimp mpgus",
},
["L/100 km"] = {
per = { "L", "100km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
symlink = "[[Fuel economy in automobiles#Units of measure|L/100 km]]",
},
["l/100 km"] = {
per = { "ll", "100km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
symlink = "[[Fuel economy in automobiles#Units of measure|l/100 km]]",
},
["L/km"] = {
per = { "L", "km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
},
["l/km"] = {
per = { "ll", "km" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
},
["mi/impqt"] = {
per = { "mi", "impqt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/U.S.qt"] = {
per = { "mi", "U.S.qt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/USqt"] = {
per = { "mi", "USqt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/usqt"] = {
per = { "mi", "usqt" },
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mpgimp"] = {
per = { "mi", "@impgal" },
symbol = "mpg<sub>‑imp</sub>",
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "L/100 km+mpgus",
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[Imperial units|imp]]</sub>",
},
["mpgus"] = {
per = { "mi", "+USgal" },
symbol = "mpg<sub>‑US</sub>",
utype = "fuel efficiency",
invert = -1,
iscomplex= true,
default = "L/100 km+mpgimp",
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[United States customary units|US]]</sub>",
},
["U.S.gal/mi"] = {
per = { "*U.S.gal", "mi" },
sp_us = true,
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "L/km impgal/mi",
},
["usgal/mi"] = {
per = { "+USgal", "mi" },
utype = "fuel efficiency",
invert = 1,
iscomplex= true,
default = "L/km impgal/mi",
},
["L/100km"] = {
target = "L/100 km",
},
["l/100km"] = {
target = "l/100 km",
},
["mpg"] = {
shouldbe = "Use %{mpgus%} for miles per US gallon or %{mpgimp%} for miles per imperial gallon (not %{mpg%})",
},
["mpgU.S."] = {
target = "mpgus",
symbol = "mpg<sub>‑U.S.</sub>",
sp_us = true,
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[United States customary units|U.S.]]</sub>",
},
["mpgu.s."] = {
target = "mpgus",
symbol = "mpg<sub>‑U.S.</sub>",
sp_us = true,
symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>‑[[United States customary units|U.S.]]</sub>",
},
["mpgUS"] = {
target = "mpgus",
},
["USgal/mi"] = {
target = "usgal/mi",
},
["kPa/m"] = {
per = { "kPa", "-m-frac" },
utype = "fracture gradient",
default = "psi/ft",
},
["psi/ft"] = {
per = { "psi", "-ft-frac" },
utype = "fracture gradient",
default = "kPa/m",
},
["cm/km"] = {
name1 = "centimetre per kilometre",
name1_us = "centimeter per kilometer",
name2 = "centimetres per kilometre",
name2_us = "centimeters per kilometer",
symbol = "cm/km",
utype = "gradient",
scale = 0.00001,
default = "ft/mi",
link = "Grade (slope)",
},
["ft/mi"] = {
name1 = "foot per mile",
name2 = "feet per mile",
symbol = "ft/mi",
utype = "gradient",
scale = 0.00018939393939393939,
default = "v < 5.28 ! c ! ! m/km",
link = "Grade (slope)",
},
["ft/nmi"] = {
name1 = "foot per nautical mile",
name2 = "feet per nautical mile",
symbol = "ft/nmi",
utype = "gradient",
scale = 0.00016457883369330455,
default = "v < 6.076 ! c ! ! m/km",
link = "Grade (slope)",
},
["in/ft"] = {
name1 = "inch per foot",
name2 = "inches per foot",
symbol = "in/ft",
utype = "gradient",
scale = 0.083333333333333329,
default = "mm/m",
link = "Grade (slope)",
},
["in/mi"] = {
name1 = "inch per mile",
name2 = "inches per mile",
symbol = "in/mi",
utype = "gradient",
scale = 1.5782828282828283e-5,
default = "v < 0.6336 ! m ! c ! m/km",
link = "Grade (slope)",
},
["m/km"] = {
name1 = "metre per kilometre",
name1_us = "meter per kilometer",
name2 = "metres per kilometre",
name2_us = "meters per kilometer",
symbol = "m/km",
utype = "gradient",
scale = 0.001,
default = "ft/mi",
link = "Grade (slope)",
},
["mm/km"] = {
name1 = "millimetre per kilometre",
name1_us = "millimeter per kilometer",
name2 = "millimetres per kilometre",
name2_us = "millimeters per kilometer",
symbol = "mm/km",
utype = "gradient",
scale = 0.000001,
default = "in/mi",
link = "Grade (slope)",
},
["mm/m"] = {
name1 = "millimetre per metre",
name1_us = "millimeter per meter",
name2 = "millimetres per metre",
name2_us = "millimeters per meter",
symbol = "mm/m",
utype = "gradient",
scale = 0.001,
default = "in/ft",
link = "Grade (slope)",
},
["admi"] = {
name1 = "admiralty mile",
symbol = "nmi (admiralty)",
utype = "length",
scale = 1853.184,
default = "km mi",
link = "Nautical mile",
},
["AU"] = {
name1 = "astronomical unit",
symbol = "AU",
utype = "length",
scale = 149597870700,
default = "km mi",
},
["Brnmi"] = {
name1 = "British nautical mile",
symbol = "(Brit) nmi",
utype = "length",
scale = 1853.184,
default = "km mi",
link = "Nautical mile",
},
["bu"] = {
name2 = "bu",
symbol = "bu",
usename = 1,
utype = "length",
scale = 0.0030303030303030303,
default = "mm",
link = "Japanese units of measurement#Length",
},
["ch"] = {
name1 = "chain",
symbol = "ch",
utype = "length",
scale = 20.1168,
default = "ft m",
subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } },
link = "Chain (unit)",
},
["chlk"] = {
name1 = "[[Chain (unit)|chain]]",
symbol = "[[Chain (unit)|ch]]",
utype = "length",
scale = 20.1168,
default = "ft m",
link = "",
},
["chain"] = {
symbol = "chain",
usename = 1,
utype = "length",
scale = 20.1168,
default = "ft m",
subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } },
link = "Chain (unit)",
},
["chainlk"] = {
symbol = "[[Chain (unit)|chain]]",
usename = 1,
utype = "length",
scale = 20.1168,
default = "ft m",
link = "",
},
["dpcm"] = {
name2 = "dot/cm",
symbol = "dot/cm",
utype = "length",
scale = 100,
invert = -1,
iscomplex= true,
default = "dpi",
link = "Dots per inch",
},
["dpi"] = {
name2 = "DPI",
symbol = "DPI",
utype = "length",
scale = 39.370078740157481,
invert = -1,
iscomplex= true,
default = "pitch",
link = "Dots per inch",
},
["fathom"] = {
symbol = "fathom",
usename = 1,
utype = "length",
scale = 1.8288,
default = "ft m",
},
["foot"] = {
name1 = "foot",
name2 = "foot",
symbol = "ft",
utype = "length",
scale = 0.3048,
default = "m",
subdivs = { ["in"] = { 12, default = "m" } },
link = "Foot (unit)",
},
["ft"] = {
name1 = "foot",
name2 = "feet",
symbol = "ft",
utype = "length",
scale = 0.3048,
exception= "integer_more_precision",
default = "m",
subdivs = { ["in"] = { 12, default = "m" } },
link = "Foot (unit)",
},
["furlong"] = {
symbol = "furlong",
usename = 1,
utype = "length",
scale = 201.168,
default = "ft m",
},
["Gly"] = {
name1 = "gigalight-year",
symbol = "Gly",
utype = "length",
scale = 9.4607304725808e24,
default = "Mpc",
link = "Light-year#Definitions",
},
["Gpc"] = {
name1 = "gigaparsec",
symbol = "Gpc",
utype = "length",
scale = 3.0856775814671916e25,
default = "Gly",
link = "Parsec#Megaparsecs and gigaparsecs",
},
["hand"] = {
name1 = "hand",
symbol = "h",
utype = "length",
builtin = "hand",
scale = 0.1016,
iscomplex= true,
default = "in cm",
link = "Hand (unit)",
},
["in"] = {
name1 = "inch",
name2 = "inches",
symbol = "in",
utype = "length",
scale = 0.0254,
exception= "subunit_more_precision",
default = "mm",
},
["inabbreviated"] = {
name2 = "in",
symbol = "in",
utype = "length",
scale = 0.0254,
default = "mm",
link = "Inch",
},
["kly"] = {
name1 = "kilolight-year",
symbol = "kly",
utype = "length",
scale = 9.4607304725808e18,
default = "pc",
link = "Light-year#Definitions",
},
["kpc"] = {
name1 = "kiloparsec",
symbol = "kpc",
utype = "length",
scale = 3.0856775814671916e19,
default = "kly",
link = "Parsec#Parsecs and kiloparsecs",
},
["LD"] = {
name1 = "lunar distance",
symbol = "LD",
utype = "length",
scale = 384403000,
default = "km mi",
link = "Lunar distance (astronomy)",
},
["league"] = {
symbol = "league",
usename = 1,
utype = "length",
scale = 4828.032,
default = "km",
link = "League (unit)",
},
["ly"] = {
name1 = "light-year",
symbol = "ly",
utype = "length",
scale = 9.4607304725808e15,
default = "AU",
},
["m"] = {
_name1 = "metre",
_name1_us= "meter",
_symbol = "m",
utype = "length",
scale = 1,
prefixes = 1,
default = "v > 0 and v < 3 ! ftin ! ft",
link = "Metre",
},
["mi"] = {
name1 = "mile",
symbol = "mi",
utype = "length",
scale = 1609.344,
default = "km",
subdivs = { ["ch"] = { 80, default = "km" }, ["chlk"] = { 80, default = "km" }, ["chain"] = { 80, default = "km" }, ["chainlk"] = { 80, default = "km" }, ["ft"] = { 5280, default = "km" }, ["furlong"] = { 8, default = "km" }, ["yd"] = { 1760, default = "km" } },
},
["mil"] = {
symbol = "mil",
usename = 1,
utype = "length",
scale = 0.0000254,
default = "mm",
link = "Thousandth of an inch",
},
["Mly"] = {
name1 = "megalight-year",
symbol = "Mly",
utype = "length",
scale = 9.4607304725808e21,
default = "kpc",
link = "Light-year#Definitions",
},
["Mpc"] = {
name1 = "megaparsec",
symbol = "Mpc",
utype = "length",
scale = 3.0856775814671916e22,
default = "Mly",
link = "Parsec#Megaparsecs and gigaparsecs",
},
["NM"] = {
name1 = "nautical mile",
symbol = "NM",
utype = "length",
scale = 1852,
default = "km mi",
},
["nmi"] = {
name1 = "nautical mile",
symbol = "nmi",
utype = "length",
scale = 1852,
default = "km mi",
},
["oldUKnmi"] = {
name1 = "nautical mile",
symbol = "nmi",
utype = "length",
scale = 1853.184,
default = "km mi",
},
["oldUSnmi"] = {
name1 = "nautical mile",
symbol = "nmi",
utype = "length",
scale = 1853.24496,
default = "km mi",
},
["pc"] = {
name1 = "parsec",
symbol = "pc",
utype = "length",
scale = 3.0856775814671916e16,
default = "ly",
},
["perch"] = {
name2 = "perches",
symbol = "perch",
usename = 1,
utype = "length",
scale = 5.0292,
default = "ft m",
link = "Rod (unit)",
},
["pitch"] = {
name2 = "μm",
symbol = "μm",
utype = "length",
scale = 1e-6,
default = "dpi",
defkey = "pitch",
linkey = "pitch",
link = "Dots per inch",
},
["pole"] = {
symbol = "pole",
usename = 1,
utype = "length",
scale = 5.0292,
default = "ft m",
link = "Rod (unit)",
},
["pre1954U.S.nmi"] = {
name1 = "(pre-1954 U.S.) nautical mile",
symbol = "(pre‑1954 U.S.) nmi",
utype = "length",
scale = 1853.24496,
default = "km mi",
link = "Nautical mile",
},
["pre1954USnmi"] = {
name1 = "(pre-1954 US) nautical mile",
name1_us = "(pre-1954 U.S.) nautical mile",
symbol = "(pre‑1954 US) nmi",
sym_us = "(pre‑1954 U.S.) nmi",
utype = "length",
scale = 1853.24496,
default = "km mi",
link = "Nautical mile",
},
["rd"] = {
name1 = "rod",
symbol = "rd",
utype = "length",
scale = 5.0292,
default = "ft m",
link = "Rod (unit)",
},
["royal cubit"] = {
name1 = "royal cubit",
symbol = "cu",
utype = "length",
scale = 0.524,
default = "mm",
},
["rtkm"] = {
name1 = "route kilometre",
name1_us = "route kilometer",
symbol = "km",
utype = "length",
scale = 1000,
default = "mi",
link = "Kilometre",
},
["rtmi"] = {
name1 = "route mile",
symbol = "mi",
utype = "length",
scale = 1609.344,
default = "km",
link = "Mile",
},
["shaku"] = {
name2 = "shaku",
symbol = "shaku",
usename = 1,
utype = "length",
scale = 0.30303030303030304,
default = "m",
link = "Shaku (unit)",
},
["sm"] = {
name1 = "smoot",
symbol = "sm",
utype = "length",
scale = 1.70180,
default = "m",
link = "Smoot (unit)",
},
["smi"] = {
name1 = "statute mile",
symbol = "mi",
utype = "length",
scale = 1609.344,
default = "km",
subdivs = { ["chain"] = { 80, default = "km" } },
},
["solar radius"] = {
name1 = "solar radius",
name2 = "solar radii",
symbol = "''R''<sub>☉</sub>",
utype = "length",
scale = 695700e3,
default = "km",
},
["sun"] = {
name2 = "sun",
symbol = "sun",
usename = 1,
utype = "length",
scale = 0.030303030303030304,
default = "mm",
link = "Japanese units of measurement#Length",
},
["thou"] = {
name2 = "thou",
symbol = "thou",
usename = 1,
utype = "length",
scale = 0.0000254,
default = "mm",
link = "Thousandth of an inch",
},
["verst"] = {
symbol = "verst",
usename = 1,
utype = "length",
scale = 1066.8,
default = "km mi",
},
["yd"] = {
name1 = "yard",
symbol = "yd",
utype = "length",
scale = 0.9144,
default = "m",
subdivs = { ["ft"] = { 3, default = "m" } },
},
["μin"] = {
name1 = "microinch",
name2 = "microinches",
symbol = "μin",
utype = "length",
scale = 0.0000000254,
default = "nm",
link = "SI prefix#Non-metric units",
},
["Å"] = {
name1 = "ångström",
symbol = "Å",
utype = "length",
scale = 0.0000000001,
default = "in",
},
["Hz"] = {
_name1 = "hertz",
_name2 = "hertz",
_symbol = "Hz",
utype = "length",
scale = 3.3356409519815204e-9,
invert = -1,
iscomplex= true,
prefixes = 1,
default = "m",
link = "Hertz",
},
["rpm"] = {
name1 = "revolution per minute",
name2 = "revolutions per minute",
symbol = "rpm",
utype = "length",
scale = 5.5594015866358675e-11,
invert = -1,
iscomplex= true,
default = "Hz",
link = "Revolutions per minute",
},
["-ft-frac"] = {
target = "ft",
link = "Fracture gradient",
},
["-in-stiff"] = {
target = "in",
link = "Stiffness",
},
["-m-frac"] = {
target = "m",
link = "Fracture gradient",
},
["-m-stiff"] = {
target = "m",
link = "Stiffness",
},
["100km"] = {
target = "km",
multiplier= 100,
},
["100mi"] = {
target = "mi",
multiplier= 100,
},
["100miles"] = {
target = "mi",
symbol = "miles",
multiplier= 100,
},
["admiralty nmi"] = {
target = "oldUKnmi",
},
["angstrom"] = {
target = "Å",
},
["au"] = {
target = "AU",
symbol = "au",
},
["feet"] = {
target = "ft",
},
["hands"] = {
target = "hand",
},
["inch"] = {
target = "in",
},
["inches"] = {
target = "in",
},
["light-year"] = {
target = "ly",
},
["meter"] = {
target = "m",
sp_us = true,
},
["meters"] = {
target = "m",
sp_us = true,
},
["metre"] = {
target = "m",
},
["metres"] = {
target = "m",
},
["micrometre"] = {
target = "μm",
},
["micron"] = {
target = "μm",
default = "μin",
},
["mile"] = {
target = "mi",
usename = 1,
},
["miles"] = {
target = "mi",
usename = 1,
},
["parsec"] = {
target = "pc",
},
["rod"] = {
target = "rd",
},
["smoot"] = {
target = "sm",
},
["uin"] = {
target = "μin",
},
["yard"] = {
target = "yd",
},
["yards"] = {
target = "yd",
},
["yds"] = {
target = "yd",
},
["dtex"] = {
name1 = "decitex",
name2 = "decitex",
symbol = "dtex",
utype = "linear density",
scale = 1e-7,
default = "lb/yd",
link = "Units of textile measurement#Units",
},
["kg/cm"] = {
name1 = "kilogram per centimetre",
name1_us = "kilogram per centimeter",
name2 = "kilograms per centimetre",
name2_us = "kilograms per centimeter",
symbol = "kg/cm",
utype = "linear density",
scale = 100,
default = "lb/yd",
link = "Linear density",
},
["kg/m"] = {
name1 = "kilogram per metre",
name1_us = "kilogram per meter",
name2 = "kilograms per metre",
name2_us = "kilograms per meter",
symbol = "kg/m",
utype = "linear density",
scale = 1,
default = "lb/yd",
link = "Linear density",
},
["lb/ft"] = {
name1 = "pound per foot",
name2 = "pounds per foot",
symbol = "lb/ft",
utype = "linear density",
scale = 1.4881639435695539,
default = "kg/m",
link = "Linear density",
},
["lb/yd"] = {
name1 = "pound per yard",
name2 = "pounds per yard",
symbol = "lb/yd",
utype = "linear density",
scale = 0.49605464785651798,
default = "kg/m",
link = "Linear density",
},
["G"] = {
_name1 = "gauss",
_name2 = "gauss",
_symbol = "G",
utype = "magnetic field strength",
scale = 0.0001,
prefixes = 1,
default = "T",
link = "Gauss (unit)",
},
["T"] = {
_name1 = "tesla",
_symbol = "T",
utype = "magnetic field strength",
scale = 1,
prefixes = 1,
default = "G",
link = "Tesla (unit)",
},
["A/m"] = {
name1 = "ampere per metre",
name1_us = "ampere per meter",
name2 = "amperes per metre",
name2_us = "amperes per meter",
symbol = "A/m",
utype = "magnetizing field",
scale = 1,
default = "Oe",
},
["kA/m"] = {
name1 = "kiloampere per metre",
name1_us = "kiloampere per meter",
name2 = "kiloamperes per metre",
name2_us = "kiloamperes per meter",
symbol = "kA/m",
utype = "magnetizing field",
scale = 1000,
default = "kOe",
link = "Ampere per metre",
},
["MA/m"] = {
name1 = "megaampere per metre",
name1_us = "megaampere per meter",
name2 = "megaamperes per metre",
name2_us = "megaamperes per meter",
symbol = "MA/m",
utype = "magnetizing field",
scale = 1e6,
default = "kOe",
link = "Ampere per metre",
},
["Oe"] = {
_name1 = "oersted",
_symbol = "Oe",
utype = "magnetizing field",
scale = 79.5774715,
prefixes = 1,
default = "kA/m",
link = "Oersted",
},
["-Lcwt"] = {
name1 = "hundredweight",
name2 = "hundredweight",
symbol = "cwt",
utype = "mass",
scale = 50.80234544,
default = "lb",
},
["-Scwt"] = {
name1 = "hundredweight",
name2 = "hundredweight",
symbol = "cwt",
utype = "mass",
scale = 45.359237,
default = "lb",
},
["-ST"] = {
name1 = "short ton",
symbol = "ST",
utype = "mass",
scale = 907.18474,
default = "t",
},
["carat"] = {
symbol = "carat",
usename = 1,
utype = "mass",
scale = 0.0002,
default = "g",
link = "Carat (mass)",
},
["drachm"] = {
name1_us = "dram",
symbol = "drachm",
usename = 1,
utype = "mass",
scale = 0.001771845195,
default = "g",
link = "Dram (unit)",
},
["dram"] = {
target = "drachm",
},
["dwt"] = {
name1 = "pennyweight",
symbol = "dwt",
utype = "mass",
scale = 0.00155517384,
default = "oz g",
},
["DWton"] = {
symbol = "deadweight ton",
usename = 1,
utype = "mass",
scale = 1016.0469088,
default = "DWtonne",
link = "Deadweight tonnage",
},
["DWtonne"] = {
name1_us = "deadweight metric ton",
symbol = "deadweight tonne",
sym_us = "~deadweight metric ton",
usename = 1,
utype = "mass",
scale = 1000,
default = "DWton",
link = "Deadweight tonnage",
},
["g"] = {
_name1 = "gram",
_symbol = "g",
utype = "mass",
scale = 0.001,
prefixes = 1,
default = "oz",
link = "Gram",
},
["gr"] = {
name1 = "grain",
symbol = "gr",
utype = "mass",
scale = 0.00006479891,
default = "g",
link = "Grain (unit)",
},
["Gt"] = {
name1 = "gigatonne",
symbol = "Gt",
utype = "mass",
scale = 1000000000000,
default = "LT ST",
link = "Tonne",
},
["impgalh2o"] = {
name1 = "imperial gallon of water",
name2 = "imperial gallons of water",
symbol = "imp gal H<sub>2</sub>O",
utype = "mass",
scale = 4.5359236999999499,
default = "lb kg",
link = "Imperial gallon",
},
["kt"] = {
name1 = "kilotonne",
symbol = "kt",
utype = "mass",
scale = 1000000,
default = "LT ST",
link = "Tonne",
},
["lb"] = {
name1 = "pound",
symbol = "lb",
utype = "mass",
scale = 0.45359237,
exception= "integer_more_precision",
default = "kg",
subdivs = { ["oz"] = { 16, default = "kg" } },
link = "Pound (mass)",
},
["Lcwt"] = {
name1 = "long hundredweight",
name2 = "long hundredweight",
symbol = "Lcwt",
usename = 1,
utype = "mass",
scale = 50.80234544,
default = "lb",
subdivs = { ["qtr"] = { 4, default = "kg" }, ["st"] = { 8, default = "kg" } },
link = "Hundredweight",
},
["long cwt"] = {
name1 = "long hundredweight",
name2 = "long hundredweight",
symbol = "long cwt",
utype = "mass",
scale = 50.80234544,
default = "lb kg",
subdivs = { ["qtr"] = { 4, default = "kg" } },
link = "Hundredweight",
},
["long qtr"] = {
name1 = "long quarter",
symbol = "long qtr",
utype = "mass",
scale = 12.70058636,
default = "lb kg",
},
["LT"] = {
symbol = "long ton",
usename = 1,
utype = "mass",
scale = 1016.0469088,
default = "t",
subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } },
},
["lt"] = {
name1 = "long ton",
symbol = "LT",
utype = "mass",
scale = 1016.0469088,
default = "t",
subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } },
},
["metric ton"] = {
symbol = "metric ton",
usename = 1,
utype = "mass",
scale = 1000,
default = "long ton",
link = "Tonne",
},
["MT"] = {
name1 = "metric ton",
symbol = "t",
utype = "mass",
scale = 1000,
default = "LT ST",
link = "Tonne",
},
["Mt"] = {
name1 = "megatonne",
symbol = "Mt",
utype = "mass",
scale = 1000000000,
default = "LT ST",
link = "Tonne",
},
["oz"] = {
name1 = "ounce",
symbol = "oz",
utype = "mass",
scale = 0.028349523125,
default = "g",
},
["ozt"] = {
name1 = "troy ounce",
symbol = "ozt",
utype = "mass",
scale = 0.0311034768,
default = "oz g",
},
["pdr"] = {
name1 = "pounder",
symbol = "pdr",
utype = "mass",
scale = 0.45359237,
default = "kg",
link = "Pound (mass)",
},
["qtr"] = {
name1 = "quarter",
symbol = "qtr",
utype = "mass",
scale = 12.70058636,
default = "lb kg",
subdivs = { ["lb"] = { 28, default = "kg" } },
link = "Long quarter",
},
["Scwt"] = {
name1 = "short hundredweight",
name2 = "short hundredweight",
symbol = "Scwt",
usename = 1,
utype = "mass",
scale = 45.359237,
default = "lb",
link = "Hundredweight",
},
["short cwt"] = {
name1 = "short hundredweight",
name2 = "short hundredweight",
symbol = "short cwt",
utype = "mass",
scale = 45.359237,
default = "lb kg",
link = "Hundredweight",
},
["short qtr"] = {
name1 = "short quarter",
symbol = "short qtr",
utype = "mass",
scale = 11.33980925,
default = "lb kg",
},
["ST"] = {
symbol = "short ton",
usename = 1,
utype = "mass",
scale = 907.18474,
default = "t",
subdivs = { ["Scwt"] = { 20, default = "t", unit = "-Scwt" } },
},
["shtn"] = {
name1 = "short ton",
symbol = "sh tn",
utype = "mass",
scale = 907.18474,
default = "t",
},
["shton"] = {
symbol = "ton",
usename = 1,
utype = "mass",
scale = 907.18474,
default = "t",
},
["solar mass"] = {
name1 = "solar mass",
name2 = "solar masses",
symbol = "''M''<sub>☉</sub>",
utype = "mass",
scale = 1.98855e30,
default = "kg",
},
["st"] = {
name1 = "stone",
name2 = "stone",
symbol = "st",
utype = "mass",
scale = 6.35029318,
default = "lb kg",
subdivs = { ["lb"] = { 14, default = "kg lb" } },
link = "Stone (unit)",
},
["t"] = {
name1 = "tonne",
name1_us = "metric ton",
symbol = "t",
utype = "mass",
scale = 1000,
default = "LT ST",
},
["tonne"] = {
name1 = "tonne",
name1_us = "metric ton",
symbol = "t",
utype = "mass",
scale = 1000,
default = "shton",
},
["troy pound"] = {
symbol = "troy pound",
usename = 1,
utype = "mass",
scale = 0.3732417216,
default = "lb kg",
link = "Troy weight",
},
["usgalh2o"] = {
name1 = "US gallon of water",
name1_us = "U.S. gallon of water",
name2 = "US gallons of water",
name2_us = "U.S. gallons of water",
symbol = "US gal H<sub>2</sub>O",
utype = "mass",
scale = 3.7776215836051126,
default = "lb kg",
link = "United States customary units#Fluid volume",
},
["viss"] = {
name2 = "viss",
symbol = "viss",
utype = "mass",
scale = 1.632932532,
default = "kg",
link = "Myanmar units of measurement#Mass",
},
["billion tonne"] = {
target = "e9t",
},
["kilogram"] = {
target = "kg",
},
["kilotonne"] = {
target = "kt",
},
["lbs"] = {
target = "lb",
},
["lbt"] = {
target = "troy pound",
},
["lcwt"] = {
target = "Lcwt",
},
["long ton"] = {
target = "LT",
},
["mcg"] = {
target = "μg",
},
["million tonne"] = {
target = "e6t",
},
["scwt"] = {
target = "Scwt",
},
["short ton"] = {
target = "ST",
},
["stone"] = {
target = "st",
},
["thousand tonne"] = {
target = "e3t",
},
["tonnes"] = {
target = "t",
},
["kg/kW"] = {
name1 = "kilogram per kilowatt",
name2 = "kilograms per kilowatt",
symbol = "kg/kW",
utype = "mass per unit power",
scale = 0.001,
default = "lb/hp",
link = "Kilowatt",
},
["lb/hp"] = {
name1 = "pound per horsepower",
name2 = "pounds per horsepower",
symbol = "lb/hp",
utype = "mass per unit power",
scale = 0.00060827738784176115,
default = "kg/kW",
link = "Horsepower",
},
["kg/h"] = {
per = { "kg", "h" },
utype = "mass per unit time",
default = "lb/h",
},
["lb/h"] = {
per = { "lb", "h" },
utype = "mass per unit time",
default = "kg/h",
},
["g-mol/d"] = {
name1 = "gram-mole per day",
name2 = "gram-moles per day",
symbol = "g‑mol/d",
utype = "molar rate",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "Mole (unit)",
},
["g-mol/h"] = {
name1 = "gram-mole per hour",
name2 = "gram-moles per hour",
symbol = "g‑mol/h",
utype = "molar rate",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "Mole (unit)",
},
["g-mol/min"] = {
name1 = "gram-mole per minute",
name2 = "gram-moles per minute",
symbol = "g‑mol/min",
utype = "molar rate",
scale = 0.016666666666666666,
default = "g-mol/s",
link = "Mole (unit)",
},
["g-mol/s"] = {
name1 = "gram-mole per second",
name2 = "gram-moles per second",
symbol = "g‑mol/s",
utype = "molar rate",
scale = 1,
default = "lb-mol/min",
link = "Mole (unit)",
},
["gmol/d"] = {
name1 = "gram-mole per day",
name2 = "gram-moles per day",
symbol = "gmol/d",
utype = "molar rate",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "Mole (unit)",
},
["gmol/h"] = {
name1 = "gram-mole per hour",
name2 = "gram-moles per hour",
symbol = "gmol/h",
utype = "molar rate",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "Mole (unit)",
},
["gmol/min"] = {
name1 = "gram-mole per minute",
name2 = "gram-moles per minute",
symbol = "gmol/min",
utype = "molar rate",
scale = 0.016666666666666666,
default = "gmol/s",
link = "Mole (unit)",
},
["gmol/s"] = {
name1 = "gram-mole per second",
name2 = "gram-moles per second",
symbol = "gmol/s",
utype = "molar rate",
scale = 1,
default = "lbmol/min",
link = "Mole (unit)",
},
["kmol/d"] = {
name1 = "kilomole per day",
name2 = "kilomoles per day",
symbol = "kmol/d",
utype = "molar rate",
scale = 0.011574074074074073,
default = "mmol/s",
link = "Mole (unit)",
},
["kmol/h"] = {
name1 = "kilomole per hour",
name2 = "kilomoles per hour",
symbol = "kmol/h",
utype = "molar rate",
scale = 0.27777777777777779,
default = "mol/s",
link = "Mole (unit)",
},
["kmol/min"] = {
name1 = "kilomole per minute",
name2 = "kilomoles per minute",
symbol = "kmol/min",
utype = "molar rate",
scale = 16.666666666666668,
default = "mol/s",
link = "Kilomole (unit)",
},
["kmol/s"] = {
name1 = "kilomole per second",
name2 = "kilomoles per second",
symbol = "kmol/s",
utype = "molar rate",
scale = 1000,
default = "lb-mol/s",
link = "Mole (unit)",
},
["lb-mol/d"] = {
name1 = "pound-mole per day",
name2 = "pound-moles per day",
symbol = "lb‑mol/d",
utype = "molar rate",
scale = 0.0052499116898148141,
default = "mmol/s",
link = "Pound-mole",
},
["lb-mol/h"] = {
name1 = "pound-mole per hour",
name2 = "pound-moles per hour",
symbol = "lb‑mol/h",
utype = "molar rate",
scale = 0.12599788055555555,
default = "mol/s",
link = "Pound-mole",
},
["lb-mol/min"] = {
name1 = "pound-mole per minute",
name2 = "pound-moles per minute",
symbol = "lb‑mol/min",
utype = "molar rate",
scale = 7.5598728333333334,
default = "mol/s",
link = "Pound-mole",
},
["lb-mol/s"] = {
name1 = "pound-mole per second",
name2 = "pound-moles per second",
symbol = "lb‑mol/s",
utype = "molar rate",
scale = 453.59237,
default = "kmol/s",
link = "Pound-mole",
},
["lbmol/d"] = {
name1 = "pound-mole per day",
name2 = "pound-moles per day",
symbol = "lbmol/d",
utype = "molar rate",
scale = 0.0052499116898148141,
default = "mmol/s",
link = "Pound-mole",
},
["lbmol/h"] = {
name1 = "pound-mole per hour",
name2 = "pound-moles per hour",
symbol = "lbmol/h",
utype = "molar rate",
scale = 0.12599788055555555,
default = "mol/s",
link = "Pound-mole",
},
["lbmol/min"] = {
name1 = "pound-mole per minute",
name2 = "pound-moles per minute",
symbol = "lbmol/min",
utype = "molar rate",
scale = 7.5598728333333334,
default = "mol/s",
link = "Pound-mole",
},
["lbmol/s"] = {
name1 = "pound-mole per second",
name2 = "pound-moles per second",
symbol = "lbmol/s",
utype = "molar rate",
scale = 453.59237,
default = "kmol/s",
link = "Pound-mole",
},
["mmol/s"] = {
name1 = "millimole per second",
name2 = "millimoles per second",
symbol = "mmol/s",
utype = "molar rate",
scale = 0.001,
default = "lb-mol/d",
link = "Mole (unit)",
},
["mol/d"] = {
name1 = "mole per day",
name2 = "moles per day",
symbol = "mol/d",
utype = "molar rate",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "Mole (unit)",
},
["mol/h"] = {
name1 = "mole per hour",
name2 = "moles per hour",
symbol = "mol/h",
utype = "molar rate",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "Mole (unit)",
},
["mol/min"] = {
name1 = "mole per minute",
name2 = "moles per minute",
symbol = "mol/min",
utype = "molar rate",
scale = 0.016666666666666666,
default = "mol/s",
link = "Mole (unit)",
},
["mol/s"] = {
name1 = "mole per second",
name2 = "moles per second",
symbol = "mol/s",
utype = "molar rate",
scale = 1,
default = "lb-mol/min",
link = "Mole (unit)",
},
["μmol/s"] = {
name1 = "micromole per second",
name2 = "micromoles per second",
symbol = "μmol/s",
utype = "molar rate",
scale = 0.000001,
default = "lb-mol/d",
link = "Mole (unit)",
},
["umol/s"] = {
target = "μmol/s",
},
["/acre"] = {
name1 = "per acre",
name2 = "per acre",
symbol = "/acre",
utype = "per unit area",
scale = 0.00024710538146716532,
default = "/ha",
link = "Acre",
},
["/ha"] = {
name1 = "per hectare",
name2 = "per hectare",
symbol = "/ha",
utype = "per unit area",
scale = 100e-6,
default = "/acre",
link = "Hectare",
},
["/sqcm"] = {
name1 = "per square centimetre",
name1_us = "per square centimeter",
name2 = "per square centimetre",
name2_us = "per square centimeter",
symbol = "/cm<sup>2</sup>",
utype = "per unit area",
scale = 1e4,
default = "/sqin",
link = "Square centimetre",
},
["/sqin"] = {
name1 = "per square inch",
name2 = "per square inch",
symbol = "/in<sup>2</sup>",
utype = "per unit area",
scale = 1550.0031000062002,
default = "/sqcm",
link = "Square inch",
},
["/sqkm"] = {
name1 = "per square kilometre",
name1_us = "per square kilometer",
name2 = "per square kilometre",
name2_us = "per square kilometer",
symbol = "/km<sup>2</sup>",
utype = "per unit area",
scale = 1e-6,
default = "/sqmi",
link = "Square kilometre",
},
["/sqmi"] = {
name1 = "per square mile",
name2 = "per square mile",
symbol = "/sq mi",
utype = "per unit area",
scale = 3.8610215854244582e-7,
default = "/sqkm",
link = "Square mile",
},
["PD/acre"] = {
name1 = "inhabitant per acre",
name2 = "inhabitants per acre",
symbol = "/acre",
utype = "per unit area",
scale = 0.00024710538146716532,
default = "PD/ha",
link = "Acre",
},
["PD/ha"] = {
name1 = "inhabitant per hectare",
name2 = "inhabitants per hectare",
symbol = "/ha",
utype = "per unit area",
scale = 100e-6,
default = "PD/acre",
link = "Hectare",
},
["PD/sqkm"] = {
name1 = "inhabitant per square kilometre",
name1_us = "inhabitant per square kilometer",
name2 = "inhabitants per square kilometre",
name2_us = "inhabitants per square kilometer",
symbol = "/km<sup>2</sup>",
utype = "per unit area",
scale = 1e-6,
default = "PD/sqmi",
link = "Square kilometre",
},
["PD/sqmi"] = {
name1 = "inhabitant per square mile",
name2 = "inhabitants per square mile",
symbol = "/sq mi",
utype = "per unit area",
scale = 3.8610215854244582e-7,
default = "PD/sqkm",
link = "Square mile",
},
["/cm2"] = {
target = "/sqcm",
},
["/in2"] = {
target = "/sqin",
},
["/km2"] = {
target = "/sqkm",
},
["pd/acre"] = {
target = "PD/acre",
},
["pd/ha"] = {
target = "PD/ha",
},
["PD/km2"] = {
target = "PD/sqkm",
},
["pd/km2"] = {
target = "PD/sqkm",
},
["PD/km²"] = {
target = "PD/sqkm",
},
["pd/sqkm"] = {
target = "PD/sqkm",
},
["pd/sqmi"] = {
target = "PD/sqmi",
},
["/l"] = {
name1 = "per litre",
name1_us = "per liter",
name2 = "per litre",
name2_us = "per liter",
symbol = "/l",
utype = "per unit volume",
scale = 1000,
default = "/usgal",
link = "Litre",
},
["/L"] = {
name1 = "per litre",
name1_us = "per liter",
name2 = "per litre",
name2_us = "per liter",
symbol = "/L",
utype = "per unit volume",
scale = 1000,
default = "/usgal",
link = "Litre",
},
["/USgal"] = {
name1 = "per gallon",
name2 = "per gallon",
symbol = "/gal",
utype = "per unit volume",
scale = 264.172052,
default = "/L",
link = "US gallon",
customary= 2,
},
["/usgal"] = {
target = "/USgal",
},
["bhp"] = {
name1 = "brake horsepower",
name2 = "brake horsepower",
symbol = "bhp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
link = "Horsepower#Brake horsepower",
},
["Cal/d"] = {
name1 = "large calorie per day",
name2 = "large calories per day",
symbol = "Cal/d",
utype = "power",
scale = 0.048425925925925928,
default = "kJ/d",
link = "Calorie",
},
["Cal/h"] = {
name1 = "large calorie per hour",
name2 = "large calories per hour",
symbol = "Cal/h",
utype = "power",
scale = 1.1622222222222223,
default = "kJ/h",
link = "Calorie",
},
["cal/h"] = {
name1 = "calorie per hour",
name2 = "calories per hour",
symbol = "cal/h",
utype = "power",
scale = 0.0011622222222222223,
default = "W",
link = "Calorie",
},
["CV"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "CV",
utype = "power",
scale = 735.49875,
default = "kW",
},
["hk"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "hk",
utype = "power",
scale = 735.49875,
default = "kW",
},
["hp"] = {
name1 = "horsepower",
name2 = "horsepower",
symbol = "hp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
},
["hp-electric"] = {
name1 = "electric horsepower",
name2 = "electric horsepower",
symbol = "hp",
utype = "power",
scale = 746,
default = "kW",
link = "Horsepower#Electrical horsepower",
},
["hp-electrical"] = {
name1 = "electrical horsepower",
name2 = "electrical horsepower",
symbol = "hp",
utype = "power",
scale = 746,
default = "kW",
link = "Horsepower#Electrical horsepower",
},
["hp-metric"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "hp",
utype = "power",
scale = 735.49875,
default = "kW",
},
["ihp"] = {
name1 = "indicated horsepower",
name2 = "indicated horsepower",
symbol = "ihp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
link = "Horsepower#Indicated horsepower",
},
["kcal/h"] = {
name1 = "kilocalorie per hour",
name2 = "kilocalories per hour",
symbol = "kcal/h",
utype = "power",
scale = 1.1622222222222223,
default = "kW",
link = "Calorie",
},
["kJ/d"] = {
name1 = "kilojoule per day",
name2 = "kilojoules per day",
symbol = "kJ/d",
utype = "power",
scale = 0.011574074074074073,
default = "Cal/d",
link = "Kilojoule",
},
["kJ/h"] = {
name1 = "kilojoule per hour",
name2 = "kilojoules per hour",
symbol = "kJ/h",
utype = "power",
scale = 0.27777777777777779,
default = "W",
link = "Kilojoule",
},
["PS"] = {
name1 = "metric horsepower",
name2 = "metric horsepower",
symbol = "PS",
utype = "power",
scale = 735.49875,
default = "kW",
},
["shp"] = {
name1 = "shaft horsepower",
name2 = "shaft horsepower",
symbol = "shp",
utype = "power",
scale = 745.69987158227022,
default = "kW",
link = "Horsepower#Shaft horsepower",
},
["W"] = {
_name1 = "watt",
_symbol = "W",
utype = "power",
scale = 1,
prefixes = 1,
default = "hp",
link = "Watt",
},
["BTU/h"] = {
per = { "BTU", "h" },
utype = "power",
default = "W",
},
["Btu/h"] = {
per = { "Btu", "h" },
utype = "power",
default = "W",
},
["BHP"] = {
target = "bhp",
},
["btu/h"] = {
target = "BTU/h",
},
["HP"] = {
target = "hp",
},
["Hp"] = {
target = "hp",
},
["hp-mechanical"] = {
target = "hp",
},
["IHP"] = {
target = "ihp",
},
["SHP"] = {
target = "shp",
},
["whp"] = {
target = "hp",
},
["hp/lb"] = {
name1 = "horsepower per pound",
name2 = "horsepower per pound",
symbol = "hp/lb",
utype = "power per unit mass",
scale = 1643.986806,
default = "kW/kg",
link = "Power-to-weight ratio",
},
["hp/LT"] = {
name1 = "horsepower per long ton",
name2 = "horsepower per long ton",
symbol = "hp/LT",
utype = "power per unit mass",
scale = 0.73392268125000004,
default = "kW/t",
link = "Power-to-weight ratio",
},
["hp/ST"] = {
name1 = "horsepower per short ton",
name2 = "horsepower per short ton",
symbol = "hp/ST",
utype = "power per unit mass",
scale = 0.821993403,
default = "kW/t",
link = "Power-to-weight ratio",
},
["hp/t"] = {
name1 = "horsepower per tonne",
name2 = "horsepower per tonne",
symbol = "hp/t",
utype = "power per unit mass",
scale = 0.74569987158227022,
default = "kW/t",
link = "Power-to-weight ratio",
},
["kW/kg"] = {
name1 = "kilowatt per kilogram",
name2 = "kilowatts per kilogram",
symbol = "kW/kg",
utype = "power per unit mass",
scale = 1000,
default = "hp/lb",
link = "Power-to-weight ratio",
},
["kW/t"] = {
name1 = "kilowatt per tonne",
name2 = "kilowatts per tonne",
symbol = "kW/t",
utype = "power per unit mass",
scale = 1,
default = "PS/t",
link = "Power-to-weight ratio",
},
["PS/t"] = {
name1 = "metric horsepower per tonne",
name2 = "metric horsepower per tonne",
symbol = "PS/t",
utype = "power per unit mass",
scale = 0.73549875,
default = "kW/t",
link = "Power-to-weight ratio",
},
["shp/lb"] = {
name1 = "shaft horsepower per pound",
name2 = "shaft horsepower per pound",
symbol = "shp/lb",
utype = "power per unit mass",
scale = 1643.986806,
default = "kW/kg",
link = "Power-to-weight ratio",
},
["hp/tonne"] = {
target = "hp/t",
symbol = "hp/tonne",
default = "kW/tonne",
},
["kW/tonne"] = {
target = "kW/t",
symbol = "kW/tonne",
},
["-lb/in2"] = {
name1 = "pound per square inch",
name2 = "pounds per square inch",
symbol = "lb/in<sup>2</sup>",
utype = "pressure",
scale = 6894.7572931683608,
default = "kPa kgf/cm2",
},
["atm"] = {
name1 = "standard atmosphere",
symbol = "atm",
utype = "pressure",
scale = 101325,
default = "kPa",
link = "Atmosphere (unit)",
},
["Ba"] = {
name1 = "barye",
symbol = "Ba",
utype = "pressure",
scale = 0.1,
default = "Pa",
},
["bar"] = {
symbol = "bar",
utype = "pressure",
scale = 100000,
default = "kPa",
link = "Bar (unit)",
},
["dbar"] = {
name1 = "decibar",
symbol = "dbar",
utype = "pressure",
scale = 10000,
default = "kPa",
link = "Bar (unit)",
},
["inHg"] = {
name1 = "inch of mercury",
name2 = "inches of mercury",
symbol = "inHg",
utype = "pressure",
scale = 3386.388640341,
default = "kPa",
},
["kBa"] = {
name1 = "kilobarye",
symbol = "kBa",
utype = "pressure",
scale = 100,
default = "hPa",
link = "Barye",
},
["kg-f/cm2"] = {
name1 = "kilogram-force per square centimetre",
name1_us = "kilogram-force per square centimeter",
name2 = "kilograms-force per square centimetre",
name2_us = "kilograms-force per square centimeter",
symbol = "kg<sub>f</sub>/cm<sup>2</sup>",
utype = "pressure",
scale = 98066.5,
default = "psi",
link = "Kilogram-force",
},
["kg/cm2"] = {
name1 = "kilogram per square centimetre",
name1_us = "kilogram per square centimeter",
name2 = "kilograms per square centimetre",
name2_us = "kilograms per square centimeter",
symbol = "kg/cm<sup>2</sup>",
utype = "pressure",
scale = 98066.5,
default = "psi",
link = "Kilogram-force",
},
["kgf/cm2"] = {
name1 = "kilogram-force per square centimetre",
name1_us = "kilogram-force per square centimeter",
name2 = "kilograms-force per square centimetre",
name2_us = "kilograms-force per square centimeter",
symbol = "kgf/cm<sup>2</sup>",
utype = "pressure",
scale = 98066.5,
default = "psi",
link = "Kilogram-force",
},
["ksi"] = {
name1 = "kilopound per square inch",
name2 = "kilopounds per square inch",
symbol = "ksi",
utype = "pressure",
scale = 6894757.2931683613,
default = "MPa",
link = "Pound per square inch",
},
["lbf/in2"] = {
name1 = "pound-force per square inch",
name2 = "pounds-force per square inch",
symbol = "lbf/in<sup>2</sup>",
utype = "pressure",
scale = 6894.7572931683608,
default = "kPa kgf/cm2",
},
["mb"] = {
name1 = "millibar",
symbol = "mb",
utype = "pressure",
scale = 100,
default = "hPa",
link = "Bar (unit)",
},
["mbar"] = {
name1 = "millibar",
symbol = "mbar",
utype = "pressure",
scale = 100,
default = "hPa",
link = "Bar (unit)",
},
["mmHg"] = {
name1 = "millimetre of mercury",
name1_us = "millimeter of mercury",
name2 = "millimetres of mercury",
name2_us = "millimeters of mercury",
symbol = "mmHg",
utype = "pressure",
scale = 133.322387415,
default = "kPa",
},
["Pa"] = {
_name1 = "pascal",
_symbol = "Pa",
utype = "pressure",
scale = 1,
prefixes = 1,
default = "psi",
link = "Pascal (unit)",
},
["psf"] = {
name1 = "pound per square foot",
name2 = "pounds per square foot",
symbol = "psf",
utype = "pressure",
scale = 47.880258980335839,
default = "kPa",
link = "Pound per square inch",
},
["psi"] = {
name1 = "pound per square inch",
name2 = "pounds per square inch",
symbol = "psi",
utype = "pressure",
scale = 6894.7572931683608,
default = "kPa",
},
["Torr"] = {
name1 = "torr",
symbol = "Torr",
utype = "pressure",
scale = 133.32236842105263,
default = "kPa",
},
["N/cm2"] = {
per = { "N", "cm2" },
utype = "pressure",
default = "psi",
},
["N/m2"] = {
per = { "N", "m2" },
utype = "pressure",
default = "psi",
},
["g/cm2"] = {
per = { "g", "cm2" },
utype = "pressure",
default = "lb/sqft",
multiplier= 9.80665,
},
["g/m2"] = {
per = { "g", "m2" },
utype = "pressure",
default = "lb/sqft",
multiplier= 9.80665,
},
["kg/ha"] = {
per = { "kg", "ha" },
utype = "pressure",
default = "lb/acre",
multiplier= 9.80665,
},
["kg/m2"] = {
per = { "kg", "m2" },
utype = "pressure",
default = "lb/sqft",
multiplier= 9.80665,
},
["lb/1000sqft"] = {
per = { "lb", "1000sqft" },
utype = "pressure",
default = "g/m2",
multiplier= 9.80665,
},
["lb/acre"] = {
per = { "lb", "acre" },
utype = "pressure",
default = "kg/ha",
multiplier= 9.80665,
},
["lb/sqft"] = {
per = { "lb", "sqft" },
utype = "pressure",
default = "kg/m2",
multiplier= 9.80665,
},
["lb/sqyd"] = {
per = { "lb", "sqyd" },
utype = "pressure",
default = "kg/m2",
multiplier= 9.80665,
},
["LT/acre"] = {
per = { "LT", "acre" },
utype = "pressure",
default = "t/ha",
multiplier= 9.80665,
},
["MT/ha"] = {
per = { "MT", "ha" },
utype = "pressure",
default = "LT/acre ST/acre",
multiplier= 9.80665,
},
["oz/sqft"] = {
per = { "oz", "sqft" },
utype = "pressure",
default = "g/m2",
multiplier= 9.80665,
},
["oz/sqyd"] = {
per = { "oz", "sqyd" },
utype = "pressure",
default = "g/m2",
multiplier= 9.80665,
},
["ST/acre"] = {
per = { "ST", "acre" },
utype = "pressure",
default = "t/ha",
multiplier= 9.80665,
},
["t/ha"] = {
per = { "t", "ha" },
utype = "pressure",
default = "LT/acre ST/acre",
multiplier= 9.80665,
},
["tonne/acre"] = {
per = { "tonne", "acre" },
utype = "pressure",
default = "tonne/ha",
multiplier= 9.80665,
},
["tonne/ha"] = {
per = { "tonne", "ha" },
utype = "pressure",
default = "tonne/acre",
multiplier= 9.80665,
},
["kgfpsqcm"] = {
target = "kgf/cm2",
},
["kgpsqcm"] = {
target = "kg/cm2",
},
["kN/m2"] = {
target = "kPa",
},
["lb/in2"] = {
target = "lbf/in2",
},
["torr"] = {
target = "Torr",
},
["Bq"] = {
_name1 = "becquerel",
_symbol = "Bq",
utype = "radioactivity",
scale = 1,
prefixes = 1,
default = "pCi",
link = "Becquerel",
},
["Ci"] = {
_name1 = "curie",
_symbol = "Ci",
utype = "radioactivity",
scale = 3.7e10,
prefixes = 1,
default = "GBq",
link = "Curie (unit)",
},
["Rd"] = {
_name1 = "rutherford",
_symbol = "Rd",
utype = "radioactivity",
scale = 1e6,
prefixes = 1,
default = "MBq",
link = "Rutherford (unit)",
},
["cm/h"] = {
name1 = "centimetre per hour",
name1_us = "centimeter per hour",
name2 = "centimetres per hour",
name2_us = "centimeters per hour",
symbol = "cm/h",
utype = "speed",
scale = 2.7777777777777775e-6,
default = "in/h",
link = "Metre per second",
},
["cm/s"] = {
name1 = "centimetre per second",
name1_us = "centimeter per second",
name2 = "centimetres per second",
name2_us = "centimeters per second",
symbol = "cm/s",
utype = "speed",
scale = 0.01,
default = "in/s",
link = "Metre per second",
},
["cm/year"] = {
name1 = "centimetre per year",
name1_us = "centimeter per year",
name2 = "centimetres per year",
name2_us = "centimeters per year",
symbol = "cm/year",
utype = "speed",
scale = 3.168873850681143e-10,
default = "in/year",
link = "Orders of magnitude (speed)",
},
["foot/s"] = {
name1 = "foot per second",
name2 = "foot per second",
symbol = "ft/s",
utype = "speed",
scale = 0.3048,
default = "m/s",
},
["ft/min"] = {
name1 = "foot per minute",
name2 = "feet per minute",
symbol = "ft/min",
utype = "speed",
scale = 0.00508,
default = "m/min",
link = "Feet per second",
},
["ft/s"] = {
name1 = "foot per second",
name2 = "feet per second",
symbol = "ft/s",
utype = "speed",
scale = 0.3048,
default = "m/s",
link = "Feet per second",
},
["furlong per fortnight"] = {
name2 = "furlongs per fortnight",
symbol = "furlong per fortnight",
usename = 1,
utype = "speed",
scale = 0.00016630952380952381,
default = "km/h mph",
link = "FFF system",
},
["in/h"] = {
name1 = "inch per hour",
name2 = "inches per hour",
symbol = "in/h",
utype = "speed",
scale = 7.0555555555555559e-6,
default = "cm/h",
link = "Inch",
},
["in/s"] = {
name1 = "inch per second",
name2 = "inches per second",
symbol = "in/s",
utype = "speed",
scale = 0.0254,
default = "cm/s",
link = "Inch",
},
["in/year"] = {
name1 = "inch per year",
name2 = "inches per year",
symbol = "in/year",
utype = "speed",
scale = 8.0489395807301024e-10,
default = "cm/year",
link = "Orders of magnitude (speed)",
},
["isp"] = {
name1 = "second",
symbol = "s",
utype = "speed",
scale = 9.80665,
default = "km/s",
link = "Specific impulse",
},
["km/d"] = {
name1 = "kilometre per day",
name1_us = "kilometer per day",
name2 = "kilometres per day",
name2_us = "kilometers per day",
symbol = "km/d",
utype = "speed",
scale = 1.1574074074074074e-2,
default = "mi/d",
link = "Orders of magnitude (speed)",
},
["km/h"] = {
name1 = "kilometre per hour",
name1_us = "kilometer per hour",
name2 = "kilometres per hour",
name2_us = "kilometers per hour",
symbol = "km/h",
utype = "speed",
scale = 0.27777777777777779,
default = "mph",
link = "Kilometres per hour",
},
["km/s"] = {
name1 = "kilometre per second",
name1_us = "kilometer per second",
name2 = "kilometres per second",
name2_us = "kilometers per second",
symbol = "km/s",
utype = "speed",
scale = 1000,
default = "mi/s",
link = "Metre per second",
},
["kn"] = {
name1 = "knot",
symbol = "kn",
utype = "speed",
scale = 0.51444444444444448,
default = "km/h mph",
link = "Knot (unit)",
},
["kNs/kg"] = {
name2 = "kN‑s/kg",
symbol = "kN‑s/kg",
utype = "speed",
scale = 1000,
default = "isp",
link = "Specific impulse",
},
["m/min"] = {
name1 = "metre per minute",
name1_us = "meter per minute",
name2 = "metres per minute",
name2_us = "meters per minute",
symbol = "m/min",
utype = "speed",
scale = 0.016666666666666666,
default = "ft/min",
link = "Metre per second",
},
["m/s"] = {
name1 = "metre per second",
name1_us = "meter per second",
name2 = "metres per second",
name2_us = "meters per second",
symbol = "m/s",
utype = "speed",
scale = 1,
default = "ft/s",
},
["Mach"] = {
name2 = "Mach",
symbol = "Mach",
utype = "speed",
builtin = "mach",
scale = 0,
iscomplex= true,
default = "km/h mph",
link = "Mach number",
},
["mi/d"] = {
name1 = "mile per day",
name2 = "miles per day",
symbol = "mi/d",
utype = "speed",
scale = 1.8626666666666667e-2,
default = "km/d",
link = "Orders of magnitude (speed)",
},
["mi/s"] = {
name1 = "mile per second",
name2 = "miles per second",
symbol = "mi/s",
utype = "speed",
scale = 1609.344,
default = "km/s",
link = "Mile",
},
["mm/h"] = {
name1 = "millimetre per hour",
name1_us = "millimeter per hour",
name2 = "millimetres per hour",
name2_us = "millimeters per hour",
symbol = "mm/h",
utype = "speed",
scale = 2.7777777777777781e-7,
default = "in/h",
link = "Metre per second",
},
["mph"] = {
name1 = "mile per hour",
name2 = "miles per hour",
symbol = "mph",
utype = "speed",
scale = 0.44704,
default = "km/h",
link = "Miles per hour",
},
["Ns/kg"] = {
name2 = "N‑s/kg",
symbol = "N‑s/kg",
utype = "speed",
scale = 1,
default = "isp",
link = "Specific impulse",
},
["si tsfc"] = {
name2 = "g/(kN⋅s)",
symbol = "g/(kN⋅s)",
utype = "speed",
scale = 9.9999628621379242e-7,
invert = -1,
iscomplex= true,
default = "tsfc",
link = "Thrust specific fuel consumption",
},
["tsfc"] = {
name2 = "lb/(lbf⋅h)",
symbol = "lb/(lbf⋅h)",
utype = "speed",
scale = 2.832545036049801e-5,
invert = -1,
iscomplex= true,
default = "si tsfc",
link = "Thrust specific fuel consumption",
},
["cm/y"] = {
target = "cm/year",
},
["cm/yr"] = {
target = "cm/year",
},
["in/y"] = {
target = "in/year",
},
["in/yr"] = {
target = "in/year",
},
["knot"] = {
target = "kn",
},
["knots"] = {
target = "kn",
},
["kph"] = {
target = "km/h",
},
["mi/h"] = {
target = "mph",
},
["mm/s"] = {
per = { "mm", "s" },
utype = "speed",
default = "in/s",
link = "Metre per second",
},
["C"] = {
name1 = "degree Celsius",
name2 = "degrees Celsius",
symbol = "°C",
usesymbol= 1,
utype = "temperature",
scale = 1,
offset = -273.15,
iscomplex= true,
istemperature= true,
default = "F",
link = "Celsius",
},
["F"] = {
name1 = "degree Fahrenheit",
name2 = "degrees Fahrenheit",
symbol = "°F",
usesymbol= 1,
utype = "temperature",
scale = 0.55555555555555558,
offset = 32-273.15*(9/5),
iscomplex= true,
istemperature= true,
default = "C",
link = "Fahrenheit",
},
["K"] = {
_name1 = "kelvin",
_symbol = "K",
usesymbol= 1,
utype = "temperature",
scale = 1,
offset = 0,
iscomplex= true,
istemperature= true,
prefixes = 1,
default = "C F",
link = "Kelvin",
},
["keVT"] = {
name1 = "kiloelectronvolt",
symbol = "keV",
utype = "temperature",
scale = 11.604505e6,
offset = 0,
iscomplex= true,
default = "MK",
link = "Electronvolt",
},
["R"] = {
name1 = "degree Rankine",
name2 = "degrees Rankine",
symbol = "°R",
usesymbol= 1,
utype = "temperature",
scale = 0.55555555555555558,
offset = 0,
iscomplex= true,
istemperature= true,
default = "K F C",
link = "Rankine scale",
},
["Celsius"] = {
target = "C",
},
["°C"] = {
target = "C",
},
["°F"] = {
target = "F",
},
["°R"] = {
target = "R",
},
["C-change"] = {
name1 = "degree Celsius change",
name2 = "degrees Celsius change",
symbol = "°C",
usesymbol= 1,
utype = "temperature change",
scale = 1,
default = "F-change",
link = "Celsius",
},
["F-change"] = {
name1 = "degree Fahrenheit change",
name2 = "degrees Fahrenheit change",
symbol = "°F",
usesymbol= 1,
utype = "temperature change",
scale = 0.55555555555555558,
default = "C-change",
link = "Fahrenheit",
},
["K-change"] = {
name1 = "kelvin change",
name2 = "kelvins change",
symbol = "K",
usesymbol= 1,
utype = "temperature change",
scale = 1,
default = "F-change",
link = "Kelvin",
},
["°C-change"] = {
target = "C-change",
},
["°F-change"] = {
target = "F-change",
},
["century"] = {
name1 = "century",
name2 = "centuries",
symbol = "ha",
utype = "time",
scale = 3155760000,
default = "Gs",
},
["d"] = {
name1 = "day",
symbol = "d",
utype = "time",
scale = 86400,
default = "ks",
},
["decade"] = {
name1 = "decade",
symbol = "daa",
utype = "time",
scale = 315576000,
default = "Ms",
},
["dog year"] = {
name1 = "dog year",
symbol = "dog yr",
utype = "time",
scale = 220903200,
default = "years",
link = "List of unusual units of measurement#Dog year",
},
["fortnight"] = {
symbol = "fortnight",
usename = 1,
utype = "time",
scale = 1209600,
default = "week",
},
["h"] = {
name1 = "hour",
symbol = "h",
utype = "time",
scale = 3600,
default = "ks",
},
["long billion year"] = {
name1 = "billion years",
name2 = "billion years",
symbol = "Ta",
utype = "time",
scale = 31557600000000000000,
default = "Es",
link = "Annum",
},
["millennium"] = {
name1 = "millennium",
name2 = "millennia",
symbol = "ka",
utype = "time",
scale = 31557600000,
default = "Gs",
},
["milliard year"] = {
name1 = "milliard years",
name2 = "milliard years",
symbol = "Ga",
utype = "time",
scale = 31557600000000000,
default = "Ps",
link = "Annum",
},
["million year"] = {
name1 = "million years",
name2 = "million years",
symbol = "Ma",
utype = "time",
scale = 31557600000000,
default = "Ts",
link = "Annum",
},
["min"] = {
name1 = "minute",
symbol = "min",
utype = "time",
scale = 60,
default = "s",
},
["month"] = {
symbol = "month",
usename = 1,
utype = "time",
scale = 2629800,
default = "Ms",
},
["months"] = {
name1 = "month",
symbol = "mo",
utype = "time",
scale = 2629800,
default = "year",
},
["s"] = {
_name1 = "second",
_symbol = "s",
utype = "time",
scale = 1,
prefixes = 1,
default = "v < 7200 ! min ! h",
link = "Second",
},
["short billion year"] = {
name1 = "billion years",
name2 = "billion years",
symbol = "Ga",
utype = "time",
scale = 31557600000000000,
default = "Ps",
link = "Annum",
},
["short trillion year"] = {
name1 = "trillion years",
name2 = "trillion years",
symbol = "Ta",
utype = "time",
scale = 31557600000000000000,
default = "Es",
link = "Annum",
},
["thousand million year"] = {
name1 = "thousand million years",
name2 = "thousand million years",
symbol = "Ga",
utype = "time",
scale = 31557600000000000,
default = "Ps",
link = "Annum",
},
["wk"] = {
symbol = "week",
usename = 1,
utype = "time",
scale = 604800,
default = "Ms",
},
["year"] = {
name1 = "year",
symbol = "a",
utype = "time",
scale = 31557600,
default = "Ms",
link = "Annum",
},
["years"] = {
name1 = "year",
symbol = "yr",
utype = "time",
scale = 31557600,
default = "Ms",
link = "Annum",
},
["byr"] = {
target = "short billion year",
},
["day"] = {
target = "d",
},
["days"] = {
target = "d",
},
["dog yr"] = {
target = "dog year",
},
["Gyr"] = {
target = "thousand million year",
},
["hour"] = {
target = "h",
},
["hours"] = {
target = "h",
},
["kMyr"] = {
target = "thousand million year",
},
["kmyr"] = {
target = "thousand million year",
},
["kyr"] = {
target = "millennium",
},
["long byr"] = {
target = "long billion year",
},
["minute"] = {
target = "min",
},
["minutes"] = {
target = "min",
},
["mth"] = {
target = "month",
},
["Myr"] = {
target = "million year",
},
["myr"] = {
target = "million year",
},
["sec"] = {
target = "s",
},
["second"] = {
target = "s",
},
["seconds"] = {
target = "s",
},
["tmyr"] = {
target = "thousand million year",
},
["tryr"] = {
target = "short trillion year",
},
["tyr"] = {
target = "millennium",
},
["week"] = {
target = "wk",
},
["weeks"] = {
target = "wk",
},
["yr"] = {
target = "year",
},
["kg.m"] = {
name1 = "kilogram metre",
name1_us = "kilogram meter",
symbol = "kg⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbft",
link = "Kilogram metre (torque)",
},
["kgf.m"] = {
name1 = "kilogram force-metre",
name1_us = "kilogram force-meter",
symbol = "kgf⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["kgm"] = {
name1 = "kilogram metre",
name1_us = "kilogram meter",
symbol = "kg⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["kpm"] = {
name1 = "kilopond metre",
name1_us = "kilopond meter",
symbol = "kp⋅m",
utype = "torque",
scale = 9.80665,
default = "Nm lbft",
link = "Kilogram metre (torque)",
},
["lb-fft"] = {
name1 = "pound force-foot",
name2 = "pound force-feet",
symbol = "ft⋅lb<sub>f</sub>",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["lb.ft"] = {
name1 = "pound force-foot",
name2 = "pound force-feet",
symbol = "lb⋅ft",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["lb.in"] = {
name1 = "pound force-inch",
symbol = "lb⋅in",
utype = "torque",
scale = 0.1129848290276167,
default = "mN.m",
link = "Pound-foot (torque)",
},
["lbfft"] = {
name1 = "pound force-foot",
name2 = "pound force-feet",
symbol = "lbf⋅ft",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["lbft"] = {
name1 = "pound-foot",
name2 = "pound-feet",
symbol = "lb⋅ft",
utype = "torque",
scale = 1.3558179483314004,
default = "Nm",
link = "Pound-foot (torque)",
},
["m.kg-f"] = {
name1 = "metre kilogram-force",
name1_us = "meter kilogram-force",
name2 = "metre kilograms-force",
name2_us = "meter kilograms-force",
symbol = "m⋅kg<sub>f</sub>",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["m.kgf"] = {
name1 = "metre kilogram-force",
name1_us = "meter kilogram-force",
name2 = "metre kilograms-force",
name2_us = "meter kilograms-force",
symbol = "m⋅kgf",
utype = "torque",
scale = 9.80665,
default = "Nm lbfft",
link = "Kilogram metre (torque)",
},
["mN.m"] = {
name1 = "millinewton-metre",
name1_us = "millinewton-meter",
symbol = "mN⋅m",
utype = "torque",
scale = 0.001,
default = "lb.in",
link = "Newton-metre",
},
["Nm"] = {
_name1 = "newton-metre",
_name1_us= "newton-meter",
_symbol = "N⋅m",
utype = "torque",
alttype = "energy",
scale = 1,
prefixes = 1,
default = "lbfft",
link = "Newton-metre",
},
["kN/m"] = {
per = { "kN", "-m-stiff" },
utype = "torque",
default = "lbf/in",
},
["lbf/in"] = {
per = { "lbf", "-in-stiff" },
utype = "torque",
default = "kN/m",
},
["lb-f.ft"] = {
target = "lb-fft",
},
["lbf.ft"] = {
target = "lbfft",
},
["lbf·ft"] = {
target = "lbfft",
},
["lb·ft"] = {
target = "lb.ft",
},
["mkg-f"] = {
target = "m.kg-f",
},
["mkgf"] = {
target = "m.kgf",
},
["N.m"] = {
target = "Nm",
},
["N·m"] = {
target = "Nm",
},
["ton-mile"] = {
symbol = "ton-mile",
usename = 1,
utype = "transportation",
scale = 1.4599723182105602,
default = "tkm",
},
["tkm"] = {
name1 = "tonne-kilometre",
name1_us = "tonne-kilometer",
symbol = "tkm",
utype = "transportation",
scale = 1,
default = "ton-mile",
},
["-12USoz(mL)serve"] = {
name1_us = "12 U.S. fl oz (355 mL) serving",
symbol = "12 US fl oz (355 mL) serving",
sym_us = "12 U.S. fl oz (355 mL) serving",
utype = "volume",
scale = 0.00035488235475000004,
default = "mL",
link = "Beverage can#Standard sizes",
},
["-12USoz(ml)serve"] = {
name1_us = "12 U.S. fl oz (355 ml) serving",
symbol = "12 US fl oz (355 ml) serving",
sym_us = "12 U.S. fl oz (355 ml) serving",
utype = "volume",
scale = 0.00035488235475000004,
default = "ml",
link = "Beverage can#Standard sizes",
},
["-12USozserve"] = {
name1_us = "12 U.S. fl oz serving",
symbol = "12 US fl oz serving",
sym_us = "12 U.S. fl oz serving",
utype = "volume",
scale = 0.00035488235475000004,
default = "mL",
link = "Beverage can#Standard sizes",
},
["acre-foot"] = {
name1 = "acre-foot",
name2 = "acre-foot",
symbol = "acre⋅ft",
utype = "volume",
scale = 1233.48183754752,
default = "m3",
},
["acre-ft"] = {
name1 = "acre-foot",
name2 = "acre-feet",
symbol = "acre⋅ft",
utype = "volume",
scale = 1233.48183754752,
default = "m3",
},
["AUtbsp"] = {
name1 = "Australian tablespoon",
symbol = "AU tbsp",
utype = "volume",
scale = 0.000020,
default = "ml",
},
["Bcuft"] = {
name1 = "billion cubic foot",
name2 = "billion cubic feet",
symbol = "billion cu ft",
utype = "volume",
scale = 28316846.592,
default = "Gl",
link = "Cubic foot",
},
["bdft"] = {
name1 = "board foot",
name2 = "board feet",
symbol = "bd ft",
utype = "volume",
scale = 0.0023597372167,
default = "m3",
},
["board feet"] = {
name2 = "board feet",
symbol = "board foot",
usename = 1,
utype = "volume",
scale = 0.0023597372167,
default = "m3",
},
["board foot"] = {
name2 = "board foot",
symbol = "board foot",
usename = 1,
utype = "volume",
scale = 0.0023597372167,
default = "m3",
},
["cc"] = {
name1 = "cubic centimetre",
name1_us = "cubic centimeter",
symbol = "cc",
utype = "volume",
scale = 0.000001,
default = "cuin",
},
["CID"] = {
name1 = "cubic inch",
name2 = "cubic inches",
symbol = "cu in",
utype = "volume",
scale = 0.000016387064,
default = "cc",
link = "Cubic inch#Engine displacement",
},
["cord"] = {
symbol = "cord",
utype = "volume",
scale = 3.624556363776,
default = "m3",
link = "Cord (unit)",
},
["cufoot"] = {
name1 = "cubic foot",
name2 = "cubic foot",
symbol = "cu ft",
utype = "volume",
scale = 0.028316846592,
default = "m3",
},
["cuft"] = {
name1 = "cubic foot",
name2 = "cubic feet",
symbol = "cu ft",
utype = "volume",
scale = 0.028316846592,
default = "m3",
},
["cuin"] = {
name1 = "cubic inch",
name2 = "cubic inches",
symbol = "cu in",
utype = "volume",
scale = 0.000016387064,
default = "cm3",
},
["cumi"] = {
name1 = "cubic mile",
symbol = "cu mi",
utype = "volume",
scale = 4168181825.440579584,
default = "km3",
},
["cuyd"] = {
name1 = "cubic yard",
symbol = "cu yd",
utype = "volume",
scale = 0.764554857984,
default = "m3",
},
["firkin"] = {
symbol = "firkin",
usename = 1,
utype = "volume",
scale = 0.04091481,
default = "L impgal USgal",
link = "Firkin (unit)",
},
["foot3"] = {
target = "cufoot",
},
["Goilbbl"] = {
name1 = "billion barrels",
name2 = "billion barrels",
symbol = "Gbbl",
utype = "volume",
scale = 158987294.928,
default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["gr water"] = {
name1 = "grains water",
name2 = "grains water",
symbol = "gr H<sub>2</sub>O",
utype = "volume",
scale = 0.00000006479891,
default = "cm3",
link = "Grain (unit)",
},
["grt"] = {
name1 = "gross register ton",
symbol = "grt",
utype = "volume",
scale = 2.8316846592,
default = "m3",
link = "Gross register tonnage",
},
["impbbl"] = {
name1 = "imperial barrel",
symbol = "imp bbl",
utype = "volume",
scale = 0.16365924,
default = "L impgal USgal",
link = "Barrel (unit)",
},
["impbsh"] = {
name1 = "imperial bushel",
symbol = "imp bsh",
utype = "volume",
scale = 0.03636872,
default = "L impgal USdrygal",
},
["impbu"] = {
name1 = "imperial bushel",
symbol = "imp bu",
utype = "volume",
scale = 0.03636872,
default = "m3",
},
["impgal"] = {
name1 = "imperial gallon",
symbol = "imp gal",
utype = "volume",
scale = 0.00454609,
default = "L USgal",
},
["impgi"] = {
name1 = "gill",
symbol = "gi",
utype = "volume",
scale = 0.0001420653125,
default = "ml USoz",
link = "Gill (unit)",
},
["impkenning"] = {
name1 = "imperial kenning",
symbol = "kenning",
utype = "volume",
scale = 0.01818436,
default = "L USdrygal",
link = "Kenning (unit)",
},
["impoz"] = {
name1 = "imperial fluid ounce",
symbol = "imp fl oz",
utype = "volume",
scale = 0.0000284130625,
default = "ml USoz",
},
["imppk"] = {
name1 = "imperial peck",
symbol = "pk",
utype = "volume",
scale = 0.00909218,
default = "L USdrygal",
link = "Peck",
},
["imppt"] = {
name1 = "imperial pint",
symbol = "imp pt",
utype = "volume",
scale = 0.00056826125,
default = "L",
},
["impqt"] = {
name1 = "imperial quart",
symbol = "imp qt",
utype = "volume",
scale = 0.0011365225,
default = "ml USoz",
customary= 3,
},
["kilderkin"] = {
symbol = "kilderkin",
usename = 1,
utype = "volume",
scale = 0.08182962,
default = "L impgal USgal",
},
["koilbbl"] = {
name1 = "thousand barrels",
name2 = "thousand barrels",
symbol = "kbbl",
utype = "volume",
scale = 158.987294928,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["L"] = {
_name1 = "litre",
_name1_us= "liter",
_symbol = "L",
utype = "volume",
scale = 0.001,
prefixes = 1,
default = "impgal USgal",
link = "Litre",
},
["l"] = {
_name1 = "litre",
_name1_us= "liter",
_symbol = "l",
utype = "volume",
scale = 0.001,
prefixes = 1,
default = "impgal USgal",
link = "Litre",
},
["ll"] = {
name1 = "litre",
name1_us = "liter",
symbol = "l",
utype = "volume",
scale = 0.001,
default = "impgal USgal",
},
["m3"] = {
_name1 = "cubic metre",
_name1_us= "cubic meter",
_symbol = "m<sup>3</sup>",
prefix_position= 7,
utype = "volume",
scale = 1,
prefixes = 3,
default = "cuft",
link = "Cubic metre",
},
["Mbbl"] = {
name1 = "thousand barrels",
name2 = "thousand barrels",
symbol = "Mbbl",
utype = "volume",
scale = 158.987294928,
default = "v * 1.58987294928 < 10 ! e3 ! ! m3",
link = "Barrel (unit)#Oil barrel",
},
["MMoilbbl"] = {
name1 = "million barrels",
name2 = "million barrels",
symbol = "MMbbl",
utype = "volume",
scale = 158987.294928,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["Moilbbl"] = {
name1 = "million barrels",
name2 = "million barrels",
symbol = "Mbbl",
utype = "volume",
scale = 158987.294928,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["MTON"] = {
name1 = "measurement ton",
symbol = "MTON",
utype = "volume",
scale = 1.13267386368,
default = "m3",
},
["MUSgal"] = {
name1 = "million US gallons",
name1_us = "million U.S. gallons",
name2 = "million US gallons",
name2_us = "million U.S. gallons",
symbol = "million US gal",
sym_us = "million U.S. gal",
utype = "volume",
scale = 3785.411784,
default = "Ml",
link = "US gallon",
},
["oilbbl"] = {
name1 = "barrel",
symbol = "bbl",
utype = "volume",
scale = 0.158987294928,
default = "m3",
link = "Barrel (unit)#Oil barrel",
},
["stere"] = {
symbol = "stere",
usename = 1,
utype = "volume",
scale = 1,
default = "cuft",
},
["Toilbbl"] = {
name1 = "trillion barrels",
name2 = "trillion barrels",
symbol = "Tbbl",
utype = "volume",
scale = 158987294928,
default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3",
link = "Barrel (unit)#Oil barrel",
},
["USbbl"] = {
name1 = "US barrel",
name1_us = "U.S. barrel",
symbol = "US bbl",
sym_us = "U.S. bbl",
utype = "volume",
scale = 0.119240471196,
default = "L USgal impgal",
link = "Barrel (unit)",
},
["USbeerbbl"] = {
name1 = "US beer barrel",
name1_us = "U.S. beer barrel",
symbol = "US bbl",
sym_us = "U.S. bbl",
utype = "volume",
scale = 0.117347765304,
default = "L USgal impgal",
link = "Barrel (unit)",
},
["USbsh"] = {
name1 = "US bushel",
name1_us = "U.S. bushel",
symbol = "US bsh",
sym_us = "U.S. bsh",
utype = "volume",
scale = 0.03523907016688,
default = "L USdrygal impgal",
link = "Bushel",
},
["USbu"] = {
name1 = "US bushel",
name1_us = "U.S. bushel",
symbol = "US bu",
sym_us = "U.S. bu",
utype = "volume",
scale = 0.03523907016688,
default = "L USdrygal impgal",
link = "Bushel",
},
["USdrybbl"] = {
name1 = "US dry barrel",
name1_us = "U.S. dry barrel",
symbol = "US dry bbl",
sym_us = "U.S. dry bbl",
utype = "volume",
scale = 0.11562819898508,
default = "m3",
link = "Barrel (unit)",
},
["USdrygal"] = {
name1 = "US dry gallon",
name1_us = "U.S. dry gallon",
symbol = "US dry gal",
sym_us = "U.S. dry gal",
utype = "volume",
scale = 0.00440488377086,
default = "L",
link = "Gallon",
},
["USdrypt"] = {
name1 = "US dry pint",
name1_us = "U.S. dry pint",
symbol = "US dry pt",
sym_us = "U.S. dry pt",
utype = "volume",
scale = 0.0005506104713575,
default = "ml",
link = "Pint",
},
["USdryqt"] = {
name1 = "US dry quart",
name1_us = "U.S. dry quart",
symbol = "US dry qt",
sym_us = "U.S. dry qt",
utype = "volume",
scale = 0.001101220942715,
default = "ml",
link = "Quart",
},
["USflgal"] = {
name1 = "US gallon",
name1_us = "U.S. gallon",
symbol = "US fl gal",
sym_us = "U.S. fl gal",
utype = "volume",
scale = 0.003785411784,
default = "L impgal",
link = "Gallon",
},
["USgal"] = {
name1 = "US gallon",
name1_us = "U.S. gallon",
symbol = "US gal",
sym_us = "U.S. gal",
utype = "volume",
scale = 0.003785411784,
default = "L impgal",
},
["USgi"] = {
name1 = "gill",
symbol = "gi",
utype = "volume",
scale = 0.0001182941183,
default = "ml impoz",
link = "Gill (unit)",
},
["USkenning"] = {
name1 = "US kenning",
name1_us = "U.S. kenning",
symbol = "US kenning",
sym_us = "U.S. kenning",
utype = "volume",
scale = 0.01761953508344,
default = "L impgal",
link = "Kenning (unit)",
},
["USmin"] = {
name1 = "US minim",
name1_us = "U.S. minim",
symbol = "US min",
sym_us = "U.S. min",
utype = "volume",
scale = 0.000000061611519921875,
default = "ml",
link = "Minim (unit)",
},
["USoz"] = {
name1 = "US fluid ounce",
name1_us = "U.S. fluid ounce",
symbol = "US fl oz",
sym_us = "U.S. fl oz",
utype = "volume",
scale = 0.0000295735295625,
default = "ml",
},
["USpk"] = {
name1 = "US peck",
name1_us = "U.S. peck",
symbol = "US pk",
sym_us = "U.S. pk",
utype = "volume",
scale = 0.00880976754172,
default = "L impgal",
link = "Peck",
},
["USpt"] = {
name1 = "US pint",
name1_us = "U.S. pint",
symbol = "US pt",
sym_us = "U.S. pt",
utype = "volume",
scale = 0.000473176473,
default = "L imppt",
link = "Pint",
},
["USqt"] = {
name1 = "US quart",
name1_us = "U.S. quart",
symbol = "US qt",
sym_us = "U.S. qt",
utype = "volume",
scale = 0.000946352946,
default = "ml",
link = "Quart",
customary= 1,
},
["USquart"] = {
name1 = "US quart",
name1_us = "U.S. quart",
symbol = "US qt",
sym_us = "U.S. qt",
utype = "volume",
scale = 0.000946352946,
default = "ml impoz",
link = "Quart",
},
["UStbsp"] = {
name1 = "US tablespoon",
name1_us = "U.S. tablespoon",
symbol = "US tbsp",
sym_us = "U.S. tbsp",
utype = "volume",
scale = 1.4786764781250001e-5,
default = "ml",
},
["winecase"] = {
symbol = "case",
usename = 1,
utype = "volume",
scale = 0.009,
default = "L",
link = "Case (goods)",
},
["*U.S.drygal"] = {
target = "USdrygal",
sp_us = true,
customary= 2,
},
["*U.S.gal"] = {
target = "USgal",
sp_us = true,
customary= 2,
},
["+USdrygal"] = {
target = "USdrygal",
customary= 1,
},
["+usfloz"] = {
target = "USoz",
link = "Fluid ounce",
customary= 1,
},
["+USgal"] = {
target = "USgal",
customary= 1,
},
["+USoz"] = {
target = "USoz",
customary= 1,
},
["@impgal"] = {
target = "impgal",
link = "Gallon",
customary= 3,
},
["acre feet"] = {
target = "acre-ft",
},
["acre foot"] = {
target = "acre-foot",
},
["acre ft"] = {
target = "acre-ft",
},
["acre-feet"] = {
target = "acre-ft",
},
["acre.foot"] = {
target = "acre-foot",
},
["acre.ft"] = {
target = "acre-ft",
},
["acre·ft"] = {
target = "acre-ft",
},
["bushels"] = {
target = "USbsh",
},
["cid"] = {
target = "CID",
},
["ft3"] = {
target = "cuft",
},
["gal"] = {
target = "USgal",
},
["gallon"] = {
shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallon%})",
},
["gallons"] = {
shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallons%})",
},
["Gcuft"] = {
target = "e9cuft",
},
["impfloz"] = {
target = "impoz",
},
["Impgal"] = {
target = "impgal",
},
["in3"] = {
target = "cuin",
symbol = "in<sup>3</sup>",
},
["hm³"] = {
target = "hm3",
},
["kcuft"] = {
target = "e3cuft",
},
["kcum"] = {
target = "e3m3",
},
["km³"] = {
target = "km3",
},
["liter"] = {
target = "L",
sp_us = true,
},
["liters"] = {
target = "L",
sp_us = true,
},
["litre"] = {
target = "L",
},
["litres"] = {
target = "L",
},
["Mcuft"] = {
target = "e6cuft",
},
["Mcum"] = {
target = "e6m3",
},
["Mft3"] = {
target = "e6cuft",
},
["mi3"] = {
target = "cumi",
},
["m³"] = {
target = "m3",
},
["Pcuft"] = {
target = "e15cuft",
},
["pt"] = {
shouldbe = "Use %{USpt%} for US pints or %{imppt%} for imperial pints (not %{pt%})",
},
["qt"] = {
shouldbe = "Use %{USqt%} for US quarts or %{impqt%} for imperial quarts (not %{qt%})",
},
["Tcuft"] = {
target = "e12cuft",
},
["Tft3"] = {
target = "e12cuft",
},
["U.S.bbl"] = {
target = "USbbl",
sp_us = true,
default = "L U.S.gal impgal",
},
["U.S.beerbbl"] = {
target = "USbeerbbl",
sp_us = true,
default = "L U.S.gal impgal",
},
["U.S.bsh"] = {
target = "USbsh",
sp_us = true,
default = "L U.S.drygal impgal",
},
["U.S.bu"] = {
target = "USbu",
sp_us = true,
default = "L U.S.drygal impgal",
},
["U.S.drybbl"] = {
target = "USdrybbl",
sp_us = true,
},
["U.S.drygal"] = {
target = "USdrygal",
sp_us = true,
},
["U.S.drypt"] = {
target = "USdrypt",
sp_us = true,
},
["U.S.dryqt"] = {
target = "USdryqt",
sp_us = true,
},
["U.S.flgal"] = {
target = "USflgal",
sp_us = true,
},
["U.S.floz"] = {
target = "USoz",
sp_us = true,
},
["U.S.gal"] = {
target = "USgal",
sp_us = true,
link = "U.S. gallon",
},
["u.s.gal"] = {
target = "USgal",
sp_us = true,
link = "U.S. gallon",
},
["U.S.gi"] = {
target = "USgi",
sp_us = true,
},
["U.S.kenning"] = {
target = "USkenning",
sp_us = true,
},
["U.S.oz"] = {
target = "USoz",
sp_us = true,
},
["U.S.pk"] = {
target = "USpk",
sp_us = true,
},
["U.S.pt"] = {
target = "USpt",
sp_us = true,
},
["U.S.qt"] = {
target = "USqt",
sp_us = true,
default = "L impqt",
customary= 2,
},
["usbbl"] = {
target = "USbbl",
},
["usbeerbbl"] = {
target = "USbeerbbl",
},
["usbsh"] = {
target = "USbsh",
},
["usbu"] = {
target = "USbu",
},
["usdrybbl"] = {
target = "USdrybbl",
},
["usdrygal"] = {
target = "USdrygal",
},
["usdrypt"] = {
target = "USdrypt",
},
["usdryqt"] = {
target = "USdryqt",
},
["USfloz"] = {
target = "USoz",
},
["usfloz"] = {
target = "USoz",
},
["USGAL"] = {
target = "USgal",
},
["usgal"] = {
target = "USgal",
},
["usgi"] = {
target = "USgi",
},
["uskenning"] = {
target = "USkenning",
},
["usoz"] = {
target = "USoz",
},
["uspk"] = {
target = "USpk",
},
["uspt"] = {
target = "USpt",
},
["usqt"] = {
target = "USqt",
},
["yd3"] = {
target = "cuyd",
},
["cuft/sqmi"] = {
per = { "cuft", "sqmi" },
utype = "volume per unit area",
default = "m3/km2",
},
["m3/ha"] = {
name1 = "cubic metre per hectare",
name1_us = "cubic meter per hectare",
name2 = "cubic metres per hectare",
name2_us = "cubic meters per hectare",
symbol = "m<sup>3</sup>/ha",
utype = "volume per unit area",
scale = 0.0001,
default = "USbu/acre",
link = "Hectare",
},
["m3/km2"] = {
per = { "m3", "km2" },
utype = "volume per unit area",
default = "cuft/sqmi",
},
["U.S.gal/acre"] = {
per = { "U.S.gal", "acre" },
utype = "volume per unit area",
default = "m3/km2",
},
["USbu/acre"] = {
name2 = "US bushels per acre",
symbol = "US bushel per acre",
usename = 1,
utype = "volume per unit area",
scale = 8.7077638761350888e-6,
default = "m3/ha",
link = "Bushel",
},
["USgal/acre"] = {
per = { "USgal", "acre" },
utype = "volume per unit area",
default = "m3/km2",
},
["cuyd/mi"] = {
per = { "cuyd", "mi" },
utype = "volume per unit length",
default = "m3/km",
},
["m3/km"] = {
per = { "m3", "km" },
utype = "volume per unit length",
default = "cuyd/mi",
},
["mich"] = {
combination= { "ch", "mi" },
multiple = { 80 },
utype = "length",
},
["michlk"] = {
combination= { "chlk", "mi" },
multiple = { 80 },
utype = "length",
},
["michainlk"] = {
combination= { "chainlk", "mi" },
multiple = { 80 },
utype = "length",
},
["miyd"] = {
combination= { "yd", "mi" },
multiple = { 1760 },
utype = "length",
},
["miydftin"] = {
combination= { "in", "ft", "yd", "mi" },
multiple = { 12, 3, 1760 },
utype = "length",
},
["mift"] = {
combination= { "ft", "mi" },
multiple = { 5280 },
utype = "length",
},
["ydftin"] = {
combination= { "in", "ft", "yd" },
multiple = { 12, 3 },
utype = "length",
},
["ydft"] = {
combination= { "ft", "yd" },
multiple = { 3 },
utype = "length",
},
["ftin"] = {
combination= { "in", "ft" },
multiple = { 12 },
utype = "length",
},
["footin"] = {
combination= { "in", "foot" },
multiple = { 12 },
utype = "length",
},
["handin"] = {
combination= { "in", "hand" },
multiple = { 4 },
utype = "length",
},
["lboz"] = {
combination= { "oz", "lb" },
multiple = { 16 },
utype = "mass",
},
["stlb"] = {
combination= { "lb", "st" },
multiple = { 14 },
utype = "mass",
},
["stlboz"] = {
combination= { "oz", "lb", "st" },
multiple = { 16, 14 },
utype = "mass",
},
["st and lb"] = {
combination= { "lb", "st" },
multiple = { 14 },
utype = "mass",
},
["GN LTf"] = {
combination= { "GN", "-LTf" },
utype = "force",
},
["GN LTf STf"] = {
combination= { "GN", "-LTf", "-STf" },
utype = "force",
},
["GN STf"] = {
combination= { "GN", "-STf" },
utype = "force",
},
["GN STf LTf"] = {
combination= { "GN", "-STf", "-LTf" },
utype = "force",
},
["kN LTf"] = {
combination= { "kN", "-LTf" },
utype = "force",
},
["kN LTf STf"] = {
combination= { "kN", "-LTf", "-STf" },
utype = "force",
},
["kN STf"] = {
combination= { "kN", "-STf" },
utype = "force",
},
["kN STf LTf"] = {
combination= { "kN", "-STf", "-LTf" },
utype = "force",
},
["LTf STf"] = {
combination= { "-LTf", "-STf" },
utype = "force",
},
["MN LTf"] = {
combination= { "MN", "-LTf" },
utype = "force",
},
["MN LTf STf"] = {
combination= { "MN", "-LTf", "-STf" },
utype = "force",
},
["MN STf"] = {
combination= { "MN", "-STf" },
utype = "force",
},
["MN STf LTf"] = {
combination= { "MN", "-STf", "-LTf" },
utype = "force",
},
["STf LTf"] = {
combination= { "-STf", "-LTf" },
utype = "force",
},
["L/100 km mpgimp"] = {
combination= { "L/100 km", "mpgimp" },
utype = "fuel efficiency",
},
["l/100 km mpgimp"] = {
combination= { "l/100 km", "mpgimp" },
utype = "fuel efficiency",
},
["L/100 km mpgUS"] = {
combination= { "L/100 km", "mpgus" },
utype = "fuel efficiency",
},
["L/100 km mpgus"] = {
combination= { "L/100 km", "mpgus" },
utype = "fuel efficiency",
},
["l/100 km mpgus"] = {
combination= { "l/100 km", "mpgus" },
utype = "fuel efficiency",
},
["mpgimp L/100 km"] = {
combination= { "mpgimp", "L/100 km" },
utype = "fuel efficiency",
},
["LT ST t"] = {
combination= { "lt", "-ST", "t" },
utype = "mass",
},
["LT t ST"] = {
combination= { "lt", "t", "-ST" },
utype = "mass",
},
["ST LT t"] = {
combination= { "-ST", "lt", "t" },
utype = "mass",
},
["ST t LT"] = {
combination= { "-ST", "t", "lt" },
utype = "mass",
},
["t LT ST"] = {
combination= { "t", "lt", "-ST" },
utype = "mass",
},
["ton"] = {
combination= { "LT", "ST" },
utype = "mass",
},
["kPa kg/cm2"] = {
combination= { "kPa", "kgf/cm2" },
utype = "pressure",
},
["kPa lb/in2"] = {
combination= { "kPa", "-lb/in2" },
utype = "pressure",
},
["floz"] = {
combination= { "impoz", "USoz" },
utype = "volume",
},
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local default_exceptions = {
-- Prefixed units with a default different from that of the base unit.
-- Each key item is a prefixed symbol (unitcode for engineering notation).
["cm<sup>2</sup>"] = "sqin",
["dm<sup>2</sup>"] = "sqin",
["e3acre"] = "km2",
["e3m2"] = "e6sqft",
["e6acre"] = "km2",
["e6ha"] = "e6acre",
["e6km2"] = "e6sqmi",
["e6m2"] = "e6sqft",
["e6sqft"] = "v * 9.290304 < 100 ! e3 ! e6 ! m2",
["e6sqmi"] = "e6km2",
["hm<sup>2</sup>"] = "acre",
["km<sup>2</sup>"] = "sqmi",
["mm<sup>2</sup>"] = "sqin",
["aJ"] = "eV",
["e3BTU"] = "MJ",
["e6BTU"] = "GJ",
["EJ"] = "kWh",
["fJ"] = "keV",
["GJ"] = "kWh",
["MJ"] = "kWh",
["PJ"] = "kWh",
["pJ"] = "MeV",
["TJ"] = "kWh",
["YJ"] = "kWh",
["yJ"] = "μeV",
["ZJ"] = "kWh",
["zJ"] = "meV",
["e12cuft/a"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/a",
["e12cuft/d"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/d",
["e12m3/a"] = "Tcuft/a",
["e12m3/d"] = "Tcuft/d",
["e3cuft/a"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/a",
["e3cuft/d"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/d",
["e3cuft/s"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/s",
["e3m3/a"] = "v < 28.316846592 ! k ! M ! cuft/a",
["e3m3/d"] = "v < 28.316846592 ! k ! M ! cuft/d",
["e3m3/s"] = "v < 28.316846592 ! k ! M ! cuft/s",
["e3USgal/a"] = "v * 3.785411784 < 1000 ! ! e3 ! m3/a",
["e6cuft/a"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/a",
["e6cuft/d"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/d",
["e6cuft/s"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/s",
["e6m3/a"] = "v < 28.316846592 ! M ! G ! cuft/a",
["e6m3/d"] = "v < 28.316846592 ! M ! G ! cuft/d",
["e6m3/s"] = "v < 28.316846592 ! e6 ! e9 ! cuft/s",
["e6USgal/a"] = "v * 3.785411784 < 1000 ! e3 ! e6 ! m3/a",
["e9cuft/a"] = "m3/a",
["e9cuft/d"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3/d",
["e9m3/a"] = "v < 28.316846592 ! G ! T ! cuft/a",
["e9m3/d"] = "v < 28.316846592 ! G ! T ! cuft/d",
["e9m3/s"] = "v < 28.316846592 ! e9 ! e12 ! cuft/s",
["e9USgal/a"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/a",
["e9USgal/s"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/s",
["nN"] = "gr-f",
["μN"] = "gr-f",
["mN"] = "oz-f",
["am"] = "in",
["cm"] = "in",
["dam"] = "ft",
["dm"] = "in",
["e12km"] = "e12mi",
["e12mi"] = "e12km",
["e3AU"] = "ly",
["e3km"] = "e3mi",
["e3mi"] = "e3km",
["e6km"] = "e6mi",
["e6mi"] = "e6km",
["e9km"] = "AU",
["e9mi"] = "e9km",
["Em"] = "mi",
["fm"] = "in",
["Gm"] = "mi",
["hm"] = "ft",
["km"] = "mi",
["mm"] = "in",
["Mm"] = "mi",
["nm"] = "in",
["Pm"] = "mi",
["pm"] = "in",
["Tm"] = "mi",
["Ym"] = "mi",
["ym"] = "in",
["Zm"] = "mi",
["zm"] = "in",
["μm"] = "in",
["e12lb"] = "v * 4.5359237 < 10 ! Mt ! Gt",
["e3lb"] = "v * 4.5359237 < 10 ! kg ! t",
["e3ozt"] = "v * 0.311034768 < 10 ! kg ! t",
["e3t"] = "LT ST",
["e6carat"] = "t",
["e6lb"] = "v * 4.5359237 < 10 ! t ! kilotonne",
["e6ozt"] = "lb kg",
["e6ST"] = "Mt",
["e6t"] = "LT ST",
["e9lb"] = "v * 4.5359237 < 10 ! kilotonne ! Mt",
["e9t"] = "LT ST",
["Gg"] = "lb",
["kg"] = "lb",
["mg"] = "gr",
["Mg"] = "LT ST",
["ng"] = "gr",
["μg"] = "gr",
["mBq"] = "fCi",
["kBq"] = "nCi",
["MBq"] = "μCi",
["GBq"] = "mCi",
["TBq"] = "Ci",
["PBq"] = "kCi",
["EBq"] = "kCi",
["fCi"] = "mBq",
["pCi"] = "Bq",
["nCi"] = "Bq",
["μCi"] = "kBq",
["mCi"] = "MBq",
["kCi"] = "TBq",
["MCi"] = "PBq",
["ns"] = "μs",
["μs"] = "ms",
["ms"] = "s",
["ks"] = "h",
["Ms"] = "week",
["Gs"] = "decade",
["Ts"] = "millennium",
["Ps"] = "million year",
["Es"] = "thousand million year",
["MK"] = "keVT",
["cL"] = "impoz usoz",
["cl"] = "impoz usoz",
["cm<sup>3</sup>"] = "cuin",
["dL"] = "impoz usoz",
["dl"] = "impoz usoz",
["mm<sup>3</sup>"] = "cuin",
["dm<sup>3</sup>"] = "cuin",
["e12cuft"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3",
["e12impgal"] = "v * 4.54609 < 1000 ! T ! P ! l",
["e12m3"] = "v < 28.316846592 ! T ! P ! cuft",
["e12U.S.gal"] = "v * 3.785411784 < 1000 ! T ! P ! l",
["e12USgal"] = "v * 3.785411784 < 1000 ! T ! P ! l",
["e15cuft"] = "v * 2.8316846592 < 100 ! e12 ! e15 ! m3",
["e15m3"] = "Pcuft",
["e3bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3",
["e3cuft"] = "v * 2.8316846592 < 100 ! ! e3 ! m3",
["e3impgal"] = "v * 4.54609 < 1000 ! k ! M ! l",
["e3m3"] = "v < 28.316846592 ! k ! M ! cuft",
["e3U.S.gal"] = "v * 3.785411784 < 1000 ! k ! M ! l",
["e3USgal"] = "v * 3.785411784 < 1000 ! k ! M ! l",
["e6bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3",
["e6cuft"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3",
["e6cuyd"] = "v * 7.64554857984 < 10 ! e3 ! e6 ! m3",
["e6impgal"] = "v * 4.54609 < 1000 ! M ! G ! l",
["e6L"] = "USgal",
["e6m3"] = "v < 28.316846592 ! M ! G ! cuft",
["e6U.S.gal"] = "v * 3.785411784 < 1000 ! M ! G ! l",
["e6USgal"] = "v * 3.785411784 < 1000 ! M ! G ! l",
["e9bdft"] = "v * 0.23597372167 < 100 ! e6 ! e9 ! m3",
["e9cuft"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3",
["e9impgal"] = "v * 4.54609 < 1000 ! G ! T ! l",
["e9m3"] = "v < 28.316846592 ! G ! T ! cuft",
["e9U.S.gal"] = "v * 3.785411784 < 1000 ! G ! T ! l",
["e9USgal"] = "v * 3.785411784 < 1000 ! G ! T ! l",
["GL"] = "cuft",
["Gl"] = "cuft",
["kL"] = "cuft",
["kl"] = "cuft",
["km<sup>3</sup>"] = "cumi",
["mL"] = "impoz usoz",
["ml"] = "impoz usoz",
["Ml"] = "v < 28.316846592 ! e3 ! e6 ! cuft",
["ML"] = "v < 28.316846592 ! e3 ! e6 ! cuft",
["TL"] = "cumi",
["Tl"] = "cumi",
["μL"] = "cuin",
["μl"] = "cuin",
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local link_exceptions = {
-- Prefixed units with a linked article different from that of the base unit.
-- Each key item is a prefixed symbol (not unitcode).
["mm<sup>2</sup>"] = "Square millimetre",
["cm<sup>2</sup>"] = "Square centimetre",
["dm<sup>2</sup>"] = "Square decimetre",
["km<sup>2</sup>"] = "Square kilometre",
["kJ"] = "Kilojoule",
["MJ"] = "Megajoule",
["GJ"] = "Gigajoule",
["TJ"] = "Terajoule",
["fm"] = "Femtometre",
["pm"] = "Picometre",
["nm"] = "Nanometre",
["μm"] = "Micrometre",
["mm"] = "Millimetre",
["cm"] = "Centimetre",
["dm"] = "Decimetre",
["dam"] = "Decametre",
["hm"] = "Hectometre",
["km"] = "Kilometre",
["Mm"] = "Megametre",
["Gm"] = "Gigametre",
["Tm"] = "Terametre",
["Pm"] = "Petametre",
["Em"] = "Exametre",
["Zm"] = "Zettametre",
["Ym"] = "Yottametre",
["μg"] = "Microgram",
["mg"] = "Milligram",
["kg"] = "Kilogram",
["Mg"] = "Tonne",
["yW"] = "Yoctowatt",
["zW"] = "Zeptowatt",
["aW"] = "Attowatt",
["fW"] = "Femtowatt",
["pW"] = "Picowatt",
["nW"] = "Nanowatt",
["μW"] = "Microwatt",
["mW"] = "Milliwatt",
["kW"] = "Kilowatt",
["MW"] = "Megawatt",
["GW"] = "Gigawatt",
["TW"] = "Terawatt",
["PW"] = "Petawatt",
["EW"] = "Exawatt",
["ZW"] = "Zettawatt",
["YW"] = "Yottawatt",
["as"] = "Attosecond",
["fs"] = "Femtosecond",
["ps"] = "Picosecond",
["ns"] = "Nanosecond",
["μs"] = "Microsecond",
["ms"] = "Millisecond",
["ks"] = "Kilosecond",
["Ms"] = "Megasecond",
["Gs"] = "Gigasecond",
["Ts"] = "Terasecond",
["Ps"] = "Petasecond",
["Es"] = "Exasecond",
["Zs"] = "Zettasecond",
["Ys"] = "Yottasecond",
["mm<sup>3</sup>"] = "Cubic millimetre",
["cm<sup>3</sup>"] = "Cubic centimetre",
["dm<sup>3</sup>"] = "Cubic decimetre",
["dam<sup>3</sup>"] = "Cubic decametre",
["km<sup>3</sup>"] = "Cubic kilometre",
["μL"] = "Microlitre",
["μl"] = "Microlitre",
["mL"] = "Millilitre",
["ml"] = "Millilitre",
["cL"] = "Centilitre",
["cl"] = "Centilitre",
["dL"] = "Decilitre",
["dl"] = "Decilitre",
["daL"] = "Decalitre",
["dal"] = "Decalitre",
["hL"] = "Hectolitre",
["hl"] = "Hectolitre",
["kL"] = "Kilolitre",
["kl"] = "Kilolitre",
["ML"] = "Megalitre",
["Ml"] = "Megalitre",
["GL"] = "Gigalitre",
["Gl"] = "Gigalitre",
["TL"] = "Teralitre",
["Tl"] = "Teralitre",
["PL"] = "Petalitre",
["Pl"] = "Petalitre",
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local per_unit_fixups = {
-- Automatically created per units of form "x/y" may have their unit type
-- changed, for example, "length/time" is changed to "speed".
-- Other adjustments can also be specified.
["/area"] = "per unit area",
["/volume"] = "per unit volume",
["area/area"] = "area per unit area",
["energy/length"] = "energy per unit length",
["energy/mass"] = "energy per unit mass",
["energy/time"] = { utype = "power", link = "Power (physics)" },
["energy/volume"] = "energy per unit volume",
["force/area"] = { utype = "pressure", link = "Pressure" },
["length/length"] = { utype = "gradient", link = "Grade (slope)" },
["length/time"] = { utype = "speed", link = "Speed" },
["length/time/time"] = { utype = "acceleration", link = "Acceleration" },
["mass/area"] = { utype = "pressure", multiplier = 9.80665 },
["mass/length"] = "linear density",
["mass/mass"] = "concentration",
["mass/power"] = "mass per unit power",
["mass/time"] = "mass per unit time",
["mass/volume"] = { utype = "density", link = "Density" },
["power/mass"] = "power per unit mass",
["power/volume"] = { link = "Power density" },
["pressure/length"] = "fracture gradient",
["speed/time"] = { utype = "acceleration", link = "Acceleration" },
["volume/area"] = "volume per unit area",
["volume/length"] = "volume per unit length",
["volume/time"] = "flow",
}
return {
all_units = all_units,
default_exceptions = default_exceptions,
link_exceptions = link_exceptions,
per_unit_fixups = per_unit_fixups,
}
69cd04fba2962c152d0008b00cb8b7df57549e07
Module:Convert/text
828
722
1108
1107
2025-08-22T00:55:51Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- Text used by Module:Convert for enwiki.
-- This is a separate module to simplify translation for use on another wiki.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
-- Some units accept an SI prefix before the unit code, such as "kg" for kilogram.
local SIprefixes = {
-- The prefix field is what the prefix should be, if different from the prefix used.
['Q'] = { exponent = 30, name = 'quetta', },
['R'] = { exponent = 27, name = 'ronna', },
['Y'] = { exponent = 24, name = 'yotta', },
['Z'] = { exponent = 21, name = 'zetta', },
['E'] = { exponent = 18, name = 'exa' , },
['P'] = { exponent = 15, name = 'peta' , },
['T'] = { exponent = 12, name = 'tera' , },
['G'] = { exponent = 9, name = 'giga' , },
['M'] = { exponent = 6, name = 'mega' , },
['k'] = { exponent = 3, name = 'kilo' , },
['h'] = { exponent = 2, name = 'hecto', },
['da']= { exponent = 1, name = 'deca' , name_us = 'deka' },
['d'] = { exponent = -1, name = 'deci' , },
['c'] = { exponent = -2, name = 'centi', },
['m'] = { exponent = -3, name = 'milli', },
['μ'] = { exponent = -6, name = 'micro', }, -- key = 'GREEK SMALL LETTER MU' (U+03BC) utf-8 CE BC
['µ'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- key = 'MICRO SIGN' (U+00B5) utf-8 C2 B5
['u'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- not an SI prefix, but allow for people typing this
['n'] = { exponent = -9, name = 'nano' , },
['p'] = { exponent =-12, name = 'pico' , },
['f'] = { exponent =-15, name = 'femto', },
['a'] = { exponent =-18, name = 'atto' , },
['z'] = { exponent =-21, name = 'zepto', },
['y'] = { exponent =-24, name = 'yocto', },
['r'] = { exponent =-27, name = 'ronto', },
['q'] = { exponent =-30, name = 'quecto', },
}
-- Some units can be qualified with one of the following prefixes, when linked.
local customary_units = {
{ "US", link = "United States customary units" },
{ "U.S.", link = "United States customary units" },
{ "imperial", link = "Imperial units" },
{ "imp", link = "Imperial units" },
}
-- Names when using engineering notation (a prefix of "eN" where N is a number; example "e6km").
-- key = { "name", link = "article title", exponent = numeric_key_value }
-- If lk=on and link is defined, the name of the number will appear as a link.
local eng_scales = {
["3"] = { "thousand", exponent = 3 },
["6"] = { "million", exponent = 6 },
["9"] = { "billion", link = "1000000000 (number)", exponent = 9 },
["12"] = { "trillion", link = "1000000000000 (number)", exponent = 12 },
["15"] = { "quadrillion", link = "1000000000000000 (number)", exponent = 15 },
}
local all_categories = {
unit = "[[Category:Convert errors]]",
option = "[[Category:Convert errors]]",
warning = '[[Category:Convert invalid options]]',
tracking = '[[Category:Convert tracking]]',
}
-- For some error messages, the following puts the wanted style around
-- each unit code marked like '...%{ft%}...'.
local unitcode_regex = '%%([{}])'
local unitcode_replace = { ['{'] = '"', ['}'] = '"' } -- no longer need the more elaborate substitute used before 2013-09-28
-- All messages that may be displayed if a problem occurs.
local all_messages = {
-- Message format string: $1=title, $2=text, $3=category, $4=anchor.
-- Each displayed message starts with "Convert:" so can easily locate by searching article.
cvt_format = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[<i>[[Help:Convert messages#$4|<span title="Convert: $1">convert: $2</span>]]</i>]</sup>$3<span class="error"></span>',
cvt_format2 = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[[Help:Convert messages#$4|<span title="Convert: $1">$2</span>]]</sup>$3<span class="error"></span>',
cvt_format_preview = '<strong class="error">Error in convert: $1 [[Help:Convert messages#$4|(help)]]</strong>$3',
-- Each of following messages is a table:
-- { [1] = 'title', -- mouseover title text
-- [2] = 'text', -- link text displayed in article
-- [3] = 'category key', -- key to lookup category in all_categories
-- [4] = 'anchor', -- anchor for link to relevant section on help page
-- regex = gsub_regex,
-- replace = gsub_table,
-- } Mouseover title text Link text CatKey Anchor
cvt_bad_input = { 'input "$1" must be a number and unit' , 'invalid input' , 'option', 'invalid_input' },
cvt_bad_num = { 'Value "$1" must be a number' , 'invalid number' , 'option', 'invalid_number' },
cvt_big_prec = { 'Precision "$1" is too large' , 'precision too large' , 'option', 'precision_too_large' },
cvt_invalid_num = { 'Number has overflowed' , 'number overflow' , 'option', 'number_overflow' },
cvt_no_num = { 'Needs the number to be converted' , 'needs a number' , 'option', 'needs_number' },
cvt_no_num2 = { 'Needs another number for a range' , 'needs another number', 'option', 'needs_another_number' },
cvt_bad_altitude = { '"$1" needs an integer' , 'invalid altitude' , 'option', 'invalid_altitude' },
cvt_bad_frac = { '"$1" needs an integer above 1' , 'invalid fraction' , 'option', 'invalid_fraction' },
cvt_bad_prec = { 'Precision "$1" must be an integer' , 'invalid precision' , 'option', 'invalid_precision' },
cvt_bad_sigfig = { '"$1" needs a positive integer' , 'invalid sigfig' , 'option', 'invalid_sigfig' },
cvt_empty_option = { 'Ignored empty option "$1"' , 'empty option' , 'option', 'empty_option' },
cvt_deprecated = { 'Option "$1" is deprecated' , '*' , 'option', 'deprecated_option', format = 'cvt_format2', nowarn = true },
cvt_no_spell = { 'Spelling is not available' , 'bug, ask for help' , 'option', 'ask_for_help' },
cvt_unknown_option = { 'Ignored invalid option "$1"' , 'invalid option' , 'option', 'invalid_option' },
cvt_wd_fail = { 'Unable to access Wikidata' , 'wikidata problem' , 'option', 'wikidata_problem' },
cvt_bad_default = { 'Unit "$1" has an invalid default' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_bad_unit = { 'Unit "$1" is invalid here' , 'unit invalid here' , 'unit' , 'unit_invalid_here' },
cvt_no_default = { 'Unit "$1" has no default output unit' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_no_unit = { 'Needs name of unit' , 'needs unit name' , 'unit' , 'needs_unit_name' },
cvt_unknown = { 'Unit name "$1" is not known' , 'unknown unit' , 'unit' , 'unknown_unit' },
cvt_should_be = { '$1' , 'ambiguous unit' , 'unit' , 'ambiguous_unit', regex = unitcode_regex, replace = unitcode_replace },
cvt_mismatch = { 'Cannot convert "$1" to "$2"' , 'unit mismatch' , 'unit' , 'unit_mismatch' },
cvt_bug_convert = { 'Bug: Cannot convert between specified units', 'bug, ask for help' , 'unit' , 'ask_for_help' },
cvt_lookup = { 'Unit "$1" is incorrectly defined' , 'bug, ask for help' , 'unit' , 'ask_for_help' },
}
-- Text to join input value/unit with output value/unit.
local disp_joins = {
-- [1]=before output, [2]=after output, [3]=between outputs in a combination; default "; "
-- [wantname] gives default abbr=off
["or"] = { " or " , "" , " or ", wantname = true },
["sqbr-sp"] = { " [" , "]" },
["sqbr-nbsp"] = { " [" , "]" },
["comma"] = { ", " , "" , ", " },
["semicolon"] = { "; " , "" },
["slash-sp"] = { " / " , "" , wantname = true },
["slash-nbsp"] = { " / ", "" , wantname = true },
["slash-nosp"] = { "/" , "" , wantname = true },
["b"] = { " (" , ")" },
["(or)"] = { " (" , ")", " or " },
["br"] = { "<br />" , "" , wantname = true },
["br()"] = { "<br />(" , ")", wantname = true },
}
-- Text to separate values in a range.
local range_types = {
-- Specifying a table requires either:
-- * "off" and "on" values (for "abbr=off" and "abbr=on"), or
-- * "input" and "output" values (for LHS and RHS);
-- other fields are optional.
-- When "adj=on|abbr=off" applies, spaces in range text are replaced with hyphens.
-- With "exception = true", that also occurs with "adj=on|abbr=on".
-- If "adj" is defined here, that text (unchanged) is used with "adj=on".
["+"] = " + ",
[","] = ", ",
[", and"] = ", and ",
[", or"] = ", or ",
["by"] = " by ",
["-"] = "–",
["to about"] = " to about ",
["and"] = { off = " and ", on = " and ", exception = true },
["and(-)"] = { input = " and ", output = "–" },
["or"] = { off = " or " , on = " or " , exception = true },
["to"] = { off = " to " , on = " to " , exception = true },
["to(-)"] = { input = " to ", output = "–" },
["+/-"] = { off = " ± ", on = " ± ", adj = " ± ", is_range_change = true },
["by(x)"] = { input = " by ", output = " × ", out_range_x = true },
["x"] = { off = " by ", on = " × ", abbr_range_x = true },
["xx"] = " × ",
["*"] = "×",
["/"] = " / ", -- for a table of high/low temperatures with {{convert|83|/|63|F|disp=br()|abbr=values}}
}
local range_aliases = {
-- ["alternative name for a range"] = "standard range name"
["–"] = "-",
["–"] = "-",
["×"] = "x",
["×"] = "x",
["±"] = "+/-",
["±"] = "+/-",
}
-- Convert accepts range text delimited with whitespace, for example, {{convert|1 to 2|ft}}.
-- In addition, the following "words" are accepted without spaces, for example, {{convert|1-2|ft}}.
-- Words must be in correct order for searching, for example, 'x' after 'xx'.
local range_words = { '-', '–', 'xx', 'x', '*' }
local ranges = {
types = range_types,
aliases = range_aliases,
words = range_words,
}
-- Valid option names.
local en_option_name = {
-- ["local text for option name"] = "en name used in this module"
["$"] = "$",
["abbr"] = "abbr",
["adj"] = "adj",
["altitude_ft"] = "altitude_ft",
["altitude_m"] = "altitude_m",
["comma"] = "comma",
["debug"] = "debug",
["disp"] = "disp",
["frac"] = "frac",
["input"] = "input",
["lang"] = "lang",
["link"] = "lk",
["lk"] = "lk",
["order"] = "order",
["qid"] = "qid",
["qual"] = "qual",
["qualifier"] = "qual",
["round"] = "round",
["sigfig"] = "sigfig",
["sing"] = "adj", -- "sing" is an old alias for "adj"
["sortable"] = "sortable",
["sp"] = "sp",
["spell"] = "spell",
["stylein"] = "stylein",
["styleout"] = "styleout",
["tracking"] = "tracking",
}
-- Valid option values.
-- Convention: parms.opt_xxx refers to an option that is set here
-- (not intended to be set by the template which invokes this module).
-- Example: At enwiki, "abbr" includes:
-- ["values"] = "opt_values"
-- As a result, if the template uses abbr=values, Module:Convert sets:
-- parms["opt_values"] = true
-- parms["abbr"] = nil
-- Therefore parms.abbr will be nil, or will have one of the listed values
-- that do not start with "opt_".
-- An option value of form "xxx?" is the same as "xxx" but shows the input as deprecated.
-- Options removed in January 2018 with remnants still in Module:Convert:
-- abbr=mos (in a range, repeat the input unit)
-- adj=1 (set opt_singular to make the unit name singular when 0 < abs(value) <= 1)
local en_option_value = {
["$"] = 'TEXT', -- TEXT should be a currency symbol that will be used instead of "$"
["abbr"] = {
-- ["local text for option value"] = "en value used in this module"
["def"] = "", -- ignored (some wrapper templates call convert with "abbr=def" to mean "default abbreviation")
["h"] = "on", -- abbr=on + use "h" for hand unit (default)
["hh"] = "opt_hand_hh", -- abbr=on + use "hh" for hand unit
["in"] = "in", -- use symbol for LHS unit
["none"] = "off", -- old name for "off"
["off"] = "off", -- use name for all units
["on"] = "on", -- use symbol for all units
["out"] = "out", -- use symbol for RHS unit (default)
["unit"] = "unit", -- abbr=on but abbreviate units only: e6km → million km (not ×10⁶ km)
["values"] = "opt_values", -- show only input and output numbers, not units
["~"] = "opt_also_symbol", -- show input unit symbol as well as name
},
["adj"] = {
["mid"] = "opt_adjectival, opt_adj_mid", -- adj=on with user-specified text after input unit (between input and output)
["off"] = "", -- ignored (off is the default)
["on"] = "opt_adjectival", -- unit name is singular and hyphenated
["pre"] = "opt_one_preunit", -- user-specified text before input unit
["ri0"] = "opt_ri=0", -- round input with precision = 0
["ri1"] = "opt_ri=1", -- round input with precision = 1
["ri2"] = "opt_ri=2", -- round input with precision = 2
["ri3"] = "opt_ri=3", -- round input with precision = 3
["~"] = "opt_also_symbol", -- same as abbr=~ so can have {{convert|1|C|K|abbr=off|adj=~}}
},
["altitude_ft"] = 'INTEGER',
["altitude_m"] = 'INTEGER',
["comma"] = {
["5"] = "opt_comma5", -- only use numsep grouping if 5 or more digits
["gaps"] = "opt_gaps", -- use gaps, not numsep, to separate groups of digits
["gaps3"] = "opt_gaps, opt_gaps3", -- group only in threes rather than default of no gap before a single digit after decimal mark
["off"] = "opt_nocomma", -- no numsep in input or output numbers
},
["debug"] = {
["yes"] = "opt_sortable_debug", -- make the normally hidden sort key visible
},
["disp"] = {
["5"] = "opt_round=5?", -- round output value to nearest 5
["b"] = "b", -- join: '(...)'
["(or)"] = "(or)", -- join: '(...)' with 'or' between outputs in a combination
["br"] = "br", -- join: '<br />'
["br()"] = "br()", -- join: '<br />(...)'
["comma"] = "comma", -- join: ','
["flip"] = "opt_flip", -- reverse order of input/output
["number"] = "opt_output_number_only", -- display output value (not input, and not output symbol/name)
["or"] = "or", -- join: 'or'
["out"] = "opt_output_only",
["output number only"] = "opt_output_number_only",
["output only"] = "opt_output_only",
["preunit"] = "opt_two_preunits", -- user-specified text before input and output units
["semicolon"] = "semicolon", -- join: ';'
["sqbr"] = "sqbr", -- join: '[...]'
["table"] = "opt_table", -- output is suitable for a table cell with align="right"
["tablecen"] = "opt_tablecen", -- output is suitable for a table cell with align="center"
["unit"] = "opt_input_unit_only", -- display input symbol/name (not output, and not input value)
["unit or text"] = "opt_input_unit_only, opt_ignore_error", -- display input symbol/name, or given unit code if not known
["unit2"] = "opt_output_unit_only",
["x"] = "x", -- join: <first>...<second> (user-specified text)
},
["frac"] = 'INTEGER',
["input"] = 'TEXT', -- TEXT should be <value><space><unitcode> or <wikidata-property-id>
["lang"] = { -- language for output digits (both en and local digits are always accepted for input)
["en"] = "opt_lang_en", -- use en digits for numbers, regardless of local language
["local"] = "opt_lang_local", -- use local digits for numbers (default, although config can change default to en)
},
["lk"] = {
["in"] = "in", -- link LHS unit name or symbol
["off"] = "off", -- do not link: same as default except for hand unit
["on"] = "on", -- link all unit names or symbols (but not twice for the same unit)
["out"] = "out", -- link RHS unit name or symbol
},
["order"] = {
["flip"] = "opt_flip", -- reverse order of input/output
["out"] = "opt_order_out", -- do not show input; instead, use order in output combination, with the first output shown as the input
},
["qid"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier
["qual"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier
["round"] = {
["0.5"] = "opt_round=0.5", -- round output value to nearest 0.5
["5"] = "opt_round=5", -- round output value to nearest 5
["10"] = "opt_round=10", -- round output value to nearest 10 (same as but clearer than "|-1")
["25"] = "opt_round=25", -- round output value to nearest 25
["50"] = "opt_round=50", -- round output value to nearest 50
["each"] = "opt_round_each", -- using default precision in a range, round each output separately (default uses highest precision of each item in range)
},
["sigfig"] = 'INTEGER',
["sortable"] = {
["off"] = "", -- ignored (off is the default)
["on"] = "opt_sortable_on", -- output sort key for use in a sortable table, based on value from converting to a standard base unit
["debug"] = "opt_sortable_on, opt_sortable_debug", -- |sortable=debug is the same as |sortable=on|debug=yes
},
["sp"] = {
["us"] = "opt_sp_us", -- use U.S. spelling (like "meter" instead of default "metre")
},
["spell"] = { -- only English spelling is supported; not scientific notation; only some fractions
["in"] = "opt_spell_in", -- spell input value in words
["In"] = "opt_spell_in, opt_spell_upper", -- spell input value in words with first letter uppercase
["on"] = "opt_spell_in, opt_spell_out", -- spell input and output values in words
["On"] = "opt_spell_in, opt_spell_out, opt_spell_upper", -- same, with first letter of first word in result uppercase
["us"] = "opt_sp_us", -- use U.S. spelling; same as sp=us so spell=us also works
},
["stylein"] = 'TEXT',
["styleout"] = 'TEXT',
["tracking"] = 'TEXT',
}
local titles = {
["frac"] = "Fraction/styles.css",
["sfrac"] = "Sfrac/styles.css",
}
return {
SIprefixes = SIprefixes,
all_categories = all_categories,
all_messages = all_messages,
currency = { ['$'] = true, ['£'] = true, ['€'] = true, ['₱'] = true, ['₽'] = true, ['¥'] = true },
customary_units = customary_units,
disp_joins = disp_joins,
en_option_name = en_option_name,
en_option_value = en_option_value,
eng_scales = eng_scales,
ranges = ranges,
titles = titles,
}
d9f24f7b3c125178aa827b8e2b4ad1e7ba143f48
Module:Convert/wikidata
828
723
1110
1109
2025-08-22T00:55:51Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- Functions to access Wikidata for Module:Convert.
local Collection = {}
Collection.__index = Collection
do
function Collection:add(item)
if item ~= nil then
self.n = self.n + 1
self[self.n] = item
end
end
function Collection:join(sep)
return table.concat(self, sep)
end
function Collection:remove(pos)
if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then
self.n = self.n - 1
return table.remove(self, pos)
end
end
function Collection:sort(comp)
table.sort(self, comp)
end
function Collection.new()
return setmetatable({n = 0}, Collection)
end
end
local function strip_to_nil(text)
-- If text is a non-empty string, return its trimmed content,
-- otherwise return nothing (empty string or not a string).
if type(text) == 'string' then
return text:match('(%S.-)%s*$')
end
end
local function frequency_unit(value, unit_table)
-- For use when converting m to Hz.
-- Return true, s where s = name of unit's default output unit,
-- or return false, t where t is an error message table.
-- However, for simplicity a valid result is always returned.
local unit
if unit_table._symbol == 'm' then
-- c = speed of light in a vacuum = 299792458 m/s
-- frequency = c / wavelength
local w = value * (unit_table.scale or 1)
local f = 299792458 / w -- if w == 0, f = math.huge which works here
if f >= 1e12 then
unit = 'THz'
elseif f >= 1e9 then
unit = 'GHz'
elseif f >= 1e6 then
unit = 'MHz'
elseif f >= 1e3 then
unit = 'kHz'
else
unit = 'Hz'
end
end
return true, unit or 'Hz'
end
local function wavelength_unit(value, unit_table)
-- Like frequency_unit but for use when converting Hz to m.
local unit
if unit_table._symbol == 'Hz' then
-- Using 0.9993 rather than 1 avoids rounding which would give results
-- like converting 300 MHz to 100 cm instead of 1 m.
local w = 1 / (value * (unit_table.scale or 1)) -- Hz scale is inverted
if w >= 0.9993e6 then
unit = 'Mm'
elseif w >= 0.9993e3 then
unit = 'km'
elseif w >= 0.9993 then
unit = 'm'
elseif w >= 0.9993e-2 then
unit = 'cm'
elseif w >= 0.9993e-3 then
unit = 'mm'
else
unit = 'um'
end
end
return true, unit or 'm'
end
local specials = {
frequency = { frequency_unit },
wavelength = { wavelength_unit },
--------------------------------------------------------------------------------
-- Following is a removed experiment to show two values as a range
-- using '-' as the separator.
-- frequencyrange = { frequency_unit, '-' },
-- wavelengthrange = { wavelength_unit, '-' },
}
local function make_unit(units, parms, uid)
-- Return a unit code for convert or nil if unit unknown.
-- If necessary, add a dummy unit to parms so convert will use it
-- for the input without attempting a conversion since nothing
-- useful is available (for example, with unit volt).
local unit = units[uid]
if type(unit) ~= 'table' then
return nil
end
local ucode = unit.ucode
if ucode and not unit.si then
return ucode -- a unit known to convert
end
parms.opt_ignore_error = true
ucode = ucode or unit._ucode -- must be a non-empty string
local ukey, utable
if unit.si then
local base = units[unit.si]
ukey = base.symbol -- must be a non-empty string
local n1 = base.name1
local n2 = base.name2
if not n1 then
n1 = ukey
n2 = n2 or n1 -- do not append 's'
end
utable = {
_symbol = ukey,
_name1 = n1,
_name2 = n2,
link = unit.link or base.link,
utype = n1,
prefixes = 1,
}
else
ukey = ucode
utable = {
symbol = ucode, -- must be a non-empty string
name1 = unit.name1, -- if nil, uses symbol
name2 = unit.name2, -- if nil, uses name1..'s'
link = unit.link, -- if nil, uses name1
utype = unit.name1 or ucode,
}
end
utable.scale = 1
utable.default = ''
utable.defkey = ''
utable.linkey = ''
utable.bad_mcode = ''
parms.unittable = { [ukey] = utable }
return ucode
end
local function matches_qualifier(statement, qual)
-- Return:
-- false, nil : if statement does not match specification
-- true, nil : if matches, and statement has no qualifier
-- true, sq : if matches, where sq is the statement's qualifier
-- A match means that no qualifier was specified (qual == nil), or that
-- the statement has a qualifier matching the specification.
-- If a match occurs, the caller needs the statement's qualifier (if any)
-- so statements that duplicate the qualifier are not used, after the first.
-- Then, if convert is showing all values for a property such as the diameter
-- of a telescope's mirror (diameters of primary and secondary mirrors), it
-- will not show alternative values that could in principle be present for the
-- same item (telescope) and property (diameter) and qualifier (primary/secondary).
local target = (statement.qualifiers or {}).P518 -- P518 is "applies to part"
if type(target) == 'table' then
for _, q in ipairs(target) do
if type(q) == 'table' then
local value = (q.datavalue or {}).value
if value then
if qual == nil or qual == value.id then
return true, value.id
end
end
end
end
end
if qual == nil then
return true, nil -- only occurs if statement has no qualifier
end
return false, nil -- statement's qualifier is not relevant because statement will be skipped
end
local function get_statements(parms, pid)
-- Get specified item and return a list of tables with each statement for property pid.
-- Each table is of form {statqual=sq, stmt=statement} where sq = statement qualifier (nil if none).
-- Statements are in Wikidata's order except that those with preferred rank
-- are first, then normal rank. Any other rank is ignored.
local stored = {} -- qualifiers of statements that are first for the qualifier, and will be returned
local qid = strip_to_nil(parms.qid) -- nil for current page's item, or an item id (expensive)
local qual = strip_to_nil(parms.qual) -- nil or id of wanted P518 (applies to part) item in qualifiers
local result = Collection.new()
local entity = mw.wikibase.getEntity(qid)
if type(entity) == 'table' then
local statements = (entity.claims or {})[pid]
if type(statements) == 'table' then
for _, rank in ipairs({ 'preferred', 'normal' }) do
for _, statement in ipairs(statements) do
if type(statement) == 'table' and rank == statement.rank then
local is_match, statqual = matches_qualifier(statement, qual)
if is_match then
result:add({ statqual = statqual, stmt = statement })
end
end
end
end
end
end
return result
end
local function input_from_property(tdata, parms, pid)
-- Given that pid is a Wikidata property identifier like 'P123',
-- return a collection of {amount, ucode} pairs (two strings)
-- for each matching item/property, or return nothing.
--------------------------------------------------------------------------------
-- There appear to be few restrictions on how Wikidata is organized so it is
-- very likely that any decision a module makes about how to handle data
-- will be wrong for some cases at some time. This meets current requirements.
-- For each qualifier (or if no qualifier), if there are any preferred
-- statements, use them and ignore any normal statements.
-- For each qualifier, for the preferred statements if any, or for
-- the normal statements (but not both):
-- * Accept each statement if it has no qualifier (this will not occur
-- if qual=x is specified because other code already ensures that in that
-- case, only statements with a qualifier matching x are considered).
-- * Ignore any statements after the first if it has a qualifier.
-- The rationale is that for the diameter at [[South Pole Telescope]], want
-- convert to show the diameters for both the primary and secondary mirrors
-- if the convert does not specify which diameter is wanted.
-- However, if convert is given the wanted qualifier, only one value
-- (_the_ diameter) is wanted. For simplicity/consistency, that is also done
-- even if no qual=x is specified. Unclear what should happen.
-- For the wavelength at [[Nançay Radio Telescope]], want to show all three
-- values, and the values have no qualifiers.
--------------------------------------------------------------------------------
local result = Collection.new()
local done = {}
local skip_normal
for _, t in ipairs(get_statements(parms, pid)) do
local statement = t.stmt
if statement.mainsnak and statement.mainsnak.datatype == 'quantity' then
local value = (statement.mainsnak.datavalue or {}).value
if value then
local amount = value.amount
if amount then
amount = tostring(amount) -- in case amount is ever a number
if amount:sub(1, 1) == '+' then
amount = amount:sub(2)
end
local unit = value.unit
if type(unit) == 'string' then
unit = unit:match('Q%d+$') -- unit item id is at end of URL
local ucode = make_unit(tdata.wikidata_units, parms, unit)
if ucode then
local skip
if t.statqual then
if done[t.statqual] then
skip = true
else
done[t.statqual] = true
end
else
if statement.rank == 'preferred' then
skip_normal = true
elseif skip_normal then
skip = true
end
end
if not skip then
result:add({ amount, ucode })
end
end
end
end
end
end
end
return result
end
local function input_from_text(tdata, parms, text, insert2)
-- Given string should be of form "<value><space><unit>" or
-- "<value1><space>ft<space><value2><space>in" for a special case (feet and inches).
-- Return true if values/units were extracted and inserted, or return nothing.
text = text:gsub(' ', ' '):gsub('%s+', ' ')
local pos = text:find(' ', 1, true)
if pos then
-- Leave checking of value to convert which can handle fractions.
local value = text:sub(1, pos - 1)
local uid = text:sub(pos + 1)
if uid:sub(1, 3) == 'ft ' and uid:sub(-3) == ' in' then
-- Special case for enwiki to allow {{convert|input=5 ft 10+1/2 in}}
insert2(uid:sub(4, -4), 'in')
insert2(value, 'ft')
else
insert2(value, make_unit(tdata.wikidata_units, parms, uid) or uid)
end
return true
end
end
local function adjustparameters(tdata, parms, index)
-- For Module:Convert, adjust parms (a table of {{convert}} parameters).
-- Return true if successful or return false, t where t is an error message table.
-- This is intended mainly for use in infoboxes where the input might be
-- <value><space><unit> or
-- <wikidata-property-id>
-- If successful, insert values and units in parms, before given index.
local text = parms.input -- should be a trimmed, non-empty string
local pid = text:match('^P%d+$')
local sep = ','
local special = specials[parms[index]]
if special then
parms.out_unit = special[1]
sep = special[2] or sep
table.remove(parms, index)
end
local function quit()
return false, pid and { 'cvt_no_output' } or { 'cvt_bad_input', text }
end
local function insert2(first, second)
table.insert(parms, index, second)
table.insert(parms, index, first)
end
if pid then
parms.input_text = '' -- output an empty string if an error occurs
local result = input_from_property(tdata, parms, pid)
if result.n == 0 then
return quit()
end
local ucode
for i, t in ipairs(result) do
-- Convert requires each input unit to be identical.
if i == 1 then
ucode = t[2]
elseif ucode ~= t[2] then
return quit()
end
end
local item = ucode
if item == parms[index] then
-- Remove specified output unit if it is the same as the Wikidata unit.
-- For example, {{convert|input=P2044|km}} with property "12 km".
table.remove(parms, index)
end
for i = result.n, 1, -1 do
insert2(result[i][1], item)
item = sep
end
return true
else
if input_from_text(tdata, parms, text, insert2) then
return true
end
end
return quit()
end
--------------------------------------------------------------------------------
--- List units and check syntax of definitions ---------------------------------
--------------------------------------------------------------------------------
local specifications = {
-- seq = sequence in which fields are displayed
base = {
title = 'SI base units',
fields = {
symbol = { seq = 2, mandatory = true },
name1 = { seq = 3, mandatory = true },
name2 = { seq = 4 },
link = { seq = 5 },
},
noteseq = 6,
header = '{| class="wikitable"\n!si !!symbol !!name1 !!name2 !!link !!note',
item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s',
footer = '|}',
},
alias = {
title = 'Aliases for convert',
fields = {
ucode = { seq = 2, mandatory = true },
si = { seq = 3 },
},
noteseq = 4,
header = '{| class="wikitable"\n!alias !!ucode !!base !!note',
item = '|-\n|%s ||%s ||%s ||%s',
footer = '|}',
},
known = {
title = 'Units known to convert',
fields = {
ucode = { seq = 2, mandatory = true },
label = { seq = 3, mandatory = true },
},
noteseq = 4,
header = '{| class="wikitable"\n!qid !!ucode !!label !!note',
item = '|-\n|%s ||%s ||%s ||%s',
footer = '|}',
},
unknown = {
title = 'Units not known to convert',
fields = {
_ucode = { seq = 2, mandatory = true },
si = { seq = 3 },
name1 = { seq = 4 },
name2 = { seq = 5 },
link = { seq = 6 },
label = { seq = 7, mandatory = true },
},
noteseq = 8,
header = '{| class="wikitable"\n!qid !!_ucode !!base !!name1 !!name2 !!link !!label !!note',
item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s ||%s ||%s',
footer = '|}',
},
}
local function listunits(tdata, ulookup)
-- For Module:Convert, make wikitext to list the built-in Wikidata units.
-- Return true, wikitext if successful or return false, t where t is an
-- error message table. Currently, an error return never occurs.
-- The syntax of each unit definition is checked and a note is added if
-- a problem is detected.
local function safe_cells(t)
-- This is not currently needed, but in case definitions ever use wikitext
-- like '[[kilogram|kg]]', escape the text so it works in a table cell.
local result = {}
for i, v in ipairs(t) do
if v:find('|', 1, true) then
v = v:gsub('(%[%[[^%[%]]-)|(.-%]%])', '%1\0%2') -- replace pipe in piped link with a zero byte
v = v:gsub('|', '|') -- escape '|'
v = v:gsub('%z', '|') -- restore pipe in piped link
end
result[i] = v:gsub('{', '{') -- escape '{'
end
return unpack(result)
end
local wdunits = tdata.wikidata_units
local speckeys = { 'base', 'alias', 'unknown', 'known' }
for _, sid in ipairs(speckeys) do
specifications[sid].units = Collection.new()
end
local keys = Collection.new()
for k, v in pairs(wdunits) do
keys:add(k)
end
table.sort(keys)
local note_count = 0
for _, key in ipairs(keys) do
local unit = wdunits[key]
local ktext, sid
if key:match('^Q%d+$') then
ktext = '[[d:' .. key .. '|' .. key .. ']]'
if unit.ucode then
sid = 'known'
else
sid = 'unknown'
end
elseif unit.ucode then
ktext = key
sid = 'alias'
else
ktext = key
sid = 'base'
end
local result = { ktext }
local spec = specifications[sid]
local fields = spec.fields
local note = Collection.new()
for k, v in pairs(unit) do
if fields[k] then
local seq = fields[k].seq
if result[seq] then
note:add('duplicate ' .. k) -- cannot happen since keys are unique
else
result[seq] = v
end
else
note:add('invalid ' .. k)
end
end
for k, v in pairs(fields) do
local value = result[v.seq]
if value then
if k == 'si' and not wdunits[value] then
note:add('need si ' .. value)
end
if k == 'label' then
local wdl = mw.wikibase.getLabel(key)
if wdl ~= value then
note:add('label changed to ' .. tostring(wdl))
end
end
else
result[v.seq] = ''
if v.mandatory then
note:add('missing ' .. k)
end
end
end
local text
if note.n > 0 then
note_count = note_count + 1
text = '*' .. note:join('<br />')
end
result[spec.noteseq] = text or ''
spec.units:add(result)
end
local results = Collection.new()
if note_count > 0 then
local text = note_count .. (note_count == 1 and ' note' or ' notes')
results:add("'''Search for * to see " .. text .. "'''\n")
end
for _, sid in ipairs(speckeys) do
local spec = specifications[sid]
results:add("'''" .. spec.title .. "'''")
results:add(spec.header)
local fmt = spec.item
for _, unit in ipairs(spec.units) do
results:add(string.format(fmt, safe_cells(unit)))
end
results:add(spec.footer)
end
return true, results:join('\n')
end
return { _adjustparameters = adjustparameters, _listunits = listunits }
b93954acaa7b2c734c1c6f4c869ed6d1821a2d84
Module:Convert/wikidata/data
828
724
1112
1111
2025-08-22T00:55:51Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
--[[ Cache of Wikidata information with units for Module:Convert.
The codes should rarely change, and using a cache means that changing a
unit at Wikidata will not cause lots of converts in articles to break.
For a unit known to convert, the unit here must have:
label = Wikidata label for unit (used only when listing units)
ucode = unit code for input to convert
(there are no optional fields because convert handles everything)
For a unit not known to convert, the unit here must have:
label = Wikidata label for unit (used only when listing units)
(no ucode field)
_ucode = unit code for input to convert, and the
symbol used to display the unit when abbr=on
(convert will use the specified fields to display the unit,
and will not attempt to do a conversion)
For a unit not known to convert, the unit here may have:
name1 = singular name used to display the unit when abbr=off
name2 = plural name used to display the unit when abbr=off
link = name of article that unit will be linked to when lk=on
si = key for the SI base unit, if any
The base unit for each SI unit here must have:
symbol = symbol used to display the base unit when abbr=on
name1 = singular name of base unit used to display the unit when abbr=off
(if name1 is not given, symbol will be used, but an SI unit should have a name)
The base unit for each SI unit here may have:
name2 = plural name of base unit used to display the unit when abbr=off
link = name of article that unit will be linked to when lk=on
(applies for all SI units using this base, where the
SI unit does not define its own link field)
If name1 is not specified, the symbol is used for the name.
If name2 is not specified, a plural name is formed by appending 's' to name1.
If link is not specified, name1 is used for the link.
SI units are assumed to be simple items like V (volt) where 'mV' would
cause convert to insert:
'm' before the base symbol 'V' to make 'mV', if abbr=on
'milli' before the base name 'volt' to make 'millivolt', if abbr=off
A unit like "square meter" would not work because it needs an SI prefix
inserted before "meter" rather than at the beginning of the name.
Items that should not be used with convert as no precise unit is implied:
Q11247037 ton generic (cannot use)
Q178413 gallon generic
Q130964 calorie dubious (ambiguous, should not use)
Q216658 bushel dubious
Q420266 fluid ounce dubious
]]
local wikidata_units = {
-- Following are SI base units.
A = {
symbol = 'A',
name1 = 'ampere',
},
F = {
symbol = 'F',
name1 = 'faraday',
},
H = {
symbol = 'H',
name1 = 'henry',
},
V = {
symbol = 'V',
name1 = 'volt',
},
-- Following are aliases to convert unit codes, used with "input=<value><space><unit>".
kilograms = {
ucode = 'kg',
},
-- Following are SI units not known to convert, used with "input=<value><space><unit>".
kV = {
ucode = 'kV',
si = 'V',
},
mV = {
ucode = 'mV',
si = 'V',
},
-- Following are Wikidata units.
Q131255 = {
label = 'farad',
_ucode = 'F',
si = 'F',
},
Q163354 = {
label = 'henry',
_ucode = 'H',
si = 'H',
},
Q1916026 = {
label = 'microvolt',
_ucode = 'uV',
si = 'V',
},
Q193933 = {
label = 'dioptre',
name1 = 'dioptre',
_ucode = 'dpt',
},
Q212120 = {
label = 'ampere hour',
name1 = 'ampere hour',
_ucode = 'A⋅h',
},
Q2448803 = {
label = 'millivolt',
_ucode = 'mV',
si = 'V',
},
Q2451296 = {
label = 'microfarad',
_ucode = 'uF',
si = 'F',
},
Q2490574 = {
label = 'milliampere',
_ucode = 'mA',
si = 'A',
},
Q25250 = {
label = 'volt',
_ucode = 'V',
si = 'V',
},
Q25272 = {
label = 'ampere',
_ucode = 'A',
si = 'A',
},
Q2553708 = {
label = 'megavolt',
_ucode = 'MV',
si = 'V',
},
Q2554092 = {
label = 'kilovolt',
_ucode = 'kV',
si = 'V',
},
Q2636421 = {
label = 'nanohenry',
_ucode = 'nH',
si = 'H',
},
Q2679083 = {
label = 'microhenry',
_ucode = 'uH',
si = 'H',
},
Q2682463 = {
label = 'nanofarad',
_ucode = 'nF',
si = 'F',
},
Q2756030 = {
label = 'picofarad',
_ucode = 'pF',
si = 'F',
},
Q2793566 = {
label = 'gigavolt',
_ucode = 'GV',
si = 'V',
},
Q2924137 = {
label = 'millihenry',
_ucode = 'mH',
si = 'H',
},
Q3117809 = {
label = 'microampere',
_ucode = 'uA',
si = 'A',
},
Q33680 = {
label = 'radian',
name1 = 'radian',
_ucode = 'rad',
},
Q4456994 = {
label = 'millifarad',
_ucode = 'mF',
si = 'F',
},
Q47083 = {
label = 'ohm',
name1 = 'ohm',
_ucode = 'Ω',
},
Q483261 = {
label = 'dalton',
name1 = 'dalton',
_ucode = 'u',
},
Q550341 = {
label = 'volt-ampere',
name1 = 'volt-ampere',
_ucode = 'VA',
},
Q100995 = {
label = 'pound',
ucode = 'lb',
},
Q1022113 = {
label = 'cubic centimetre',
ucode = 'cc',
},
Q102573 = {
label = 'becquerel',
ucode = 'Bq',
},
Q103246 = {
label = 'sievert',
ucode = 'Sv',
},
Q1050958 = {
label = 'inch of mercury',
ucode = 'inHg',
},
Q1051665 = {
label = 'metre per second squared',
ucode = 'm/s2',
},
Q1052397 = {
label = 'rad',
ucode = 'rad',
},
Q1054140 = {
label = 'megametre',
ucode = 'Mm',
},
Q1057069 = {
label = 'hectogram',
ucode = 'hg',
},
Q1063786 = {
label = 'square inch',
ucode = 'sqin',
},
Q1092296 = {
label = 'annum',
ucode = 'year',
},
Q11570 = {
label = 'kilogram',
ucode = 'kg',
},
Q11573 = {
label = 'metre',
ucode = 'm',
},
Q11574 = {
label = 'second',
ucode = 's',
},
Q11579 = {
label = 'kelvin',
ucode = 'K',
},
Q11582 = {
label = 'litre',
ucode = 'litre',
},
Q1165588 = {
label = 'rod',
ucode = 'rod',
},
Q1165799 = {
label = 'thou',
ucode = 'thou',
},
Q11776930 = {
label = 'megagram',
ucode = 'Mg',
},
Q11929860 = {
label = 'kiloparsec',
ucode = 'kpc',
},
Q1194225 = {
label = 'pound-force',
ucode = 'lbf',
},
Q12129 = {
label = 'parsec',
ucode = 'pc',
},
Q12438 = {
label = 'newton',
ucode = 'N',
},
Q1255620 = {
label = 'dram',
ucode = 'drachm',
},
Q12874593 = {
label = 'watt-hour',
ucode = 'W.h',
},
Q128822 = {
label = 'knot',
ucode = 'kn',
},
Q1374438 = {
label = 'kilosecond',
ucode = 'ks',
},
Q1377051 = {
label = 'gigasecond',
ucode = 'Gs',
},
Q14754979 = {
label = 'zettagram',
ucode = 'Zg',
},
Q14786969 = {
label = 'megajoule',
ucode = 'MJ',
},
Q14787261 = {
label = 'megawatt hour',
ucode = 'MW.h',
},
Q1550511 = {
label = 'square yard',
ucode = 'sqyd',
},
Q160857 = {
label = 'metric horsepower',
ucode = 'hp',
},
Q1628990 = {
label = 'horsepower-hour',
ucode = 'hph',
},
Q163343 = {
label = 'tesla',
ucode = 'T',
},
Q1645498 = {
label = 'microgram',
ucode = 'ug',
},
Q17087835 = {
label = 'cuerda',
ucode = 'cda',
},
Q174728 = {
label = 'centimetre',
ucode = 'cm',
},
Q174789 = {
label = 'millimetre',
ucode = 'mm',
},
Q175821 = {
label = 'micrometre',
ucode = 'um',
},
Q1770733 = {
label = 'teragram',
ucode = 'Tg',
},
Q1772386 = {
label = 'decigram',
ucode = 'dg',
},
Q177493 = {
label = 'gauss',
ucode = 'G',
},
Q1777507 = {
label = 'femtosecond',
ucode = 'fs',
},
Q177974 = {
label = 'standard atmosphere',
ucode = 'atm',
},
Q178674 = {
label = 'nanometre',
ucode = 'nm',
},
Q180154 = {
label = 'kilometre per hour',
ucode = 'km/h',
},
Q180892 = {
label = 'solar mass',
ucode = 'solar mass',
},
Q1811 = {
label = 'astronomical unit',
ucode = 'au',
},
Q1815100 = {
label = 'centilitre',
ucode = 'cl',
},
Q182098 = {
label = 'kilowatt hour',
ucode = 'kW.h',
},
Q1823150 = {
label = 'microwatt',
ucode = 'uW',
},
Q182429 = {
label = 'metre per second',
ucode = 'm/s',
},
Q1826195 = {
label = 'decilitre',
ucode = 'dl',
},
Q185078 = {
label = 'are',
ucode = 'a',
},
Q185153 = {
label = 'erg',
ucode = 'erg',
},
Q185648 = {
label = 'torr',
ucode = 'Torr',
},
Q190095 = {
label = 'gray',
ucode = 'Gy',
},
Q191118 = {
label = 'tonne',
ucode = 'tonne',
},
Q1913097 = {
label = 'femtogram',
ucode = 'fg',
},
Q192274 = {
label = 'picometre',
ucode = 'pm',
},
Q1972579 = {
label = 'poundal',
ucode = 'pdl',
},
Q200323 = {
label = 'decimetre',
ucode = 'dm',
},
Q201933 = {
label = 'dyne',
ucode = 'dyn',
},
Q2029519 = {
label = 'hectolitre',
ucode = 'hl',
},
Q2051195 = {
label = 'gigawatt hour',
ucode = 'GW.h',
},
Q207488 = {
label = 'Rankine scale',
ucode = 'R',
},
Q208788 = {
label = 'femtometre',
ucode = 'fm',
},
Q2101 = {
label = 'elementary charge',
ucode = 'e',
},
Q21014455 = {
label = 'metre per minute',
ucode = 'm/min',
},
Q21062777 = {
label = 'megapascal',
ucode = 'MPa',
},
Q21064807 = {
label = 'kilopascal',
ucode = 'kPa',
},
Q211256 = {
label = 'mile per hour',
ucode = 'mph',
},
Q21178489 = {
label = 'barrels per day',
ucode = 'oilbbl/d',
},
Q2143992 = {
label = 'kilohertz',
ucode = 'kHz',
},
Q21467992 = {
label = 'cubic foot per second',
ucode = 'cuft/s',
},
Q215571 = {
label = 'newton metre',
ucode = 'Nm',
},
Q216795 = {
label = 'dunam',
ucode = 'dunam',
},
Q216880 = {
label = 'kilogram-force',
ucode = 'kgf',
},
Q18413919 = {
label = 'centimetre per second',
ucode = 'cm/s',
},
Q218593 = {
label = 'inch',
ucode = 'in',
},
Q2282891 = {
label = 'microlitre',
ucode = 'ul',
},
Q2282906 = {
label = 'nanogram',
ucode = 'ng',
},
Q229354 = {
label = 'curie',
ucode = 'Ci',
},
Q232291 = {
label = 'square mile',
ucode = 'sqmi',
},
Q2332346 = {
label = 'millilitre',
ucode = 'ml',
},
Q23387 = {
label = 'week',
ucode = 'week',
},
Q23823681 = {
label = 'terawatt',
ucode = 'TW',
},
Q23925410 = {
label = 'gallon (UK)',
ucode = 'impgal',
},
Q23925413 = {
label = 'gallon (US)',
ucode = 'USgal',
},
Q2438073 = {
label = 'attogram',
ucode = 'ag',
},
Q2474258 = {
label = 'millisievert',
ucode = 'mSv',
},
Q2483628 = {
label = 'attosecond',
ucode = 'as',
},
Q2489298 = {
label = 'square centimetre',
ucode = 'cm2',
},
Q2518569 = {
label = 'nanosievert',
ucode = 'nSv',
},
Q25235 = {
label = 'hour',
ucode = 'h',
},
Q25236 = {
label = 'watt',
ucode = 'W',
},
Q25267 = {
label = 'degree Celsius',
ucode = 'C',
},
Q25269 = {
label = 'joule',
ucode = 'J',
},
Q253276 = {
label = 'mile',
ucode = 'mi',
},
Q25343 = {
label = 'square metre',
ucode = 'm2',
},
Q25406 = {
label = 'coulomb',
ucode = 'coulomb',
},
Q25517 = {
label = 'cubic metre',
ucode = 'm3',
},
Q260126 = {
label = 'Roentgen equivalent man',
ucode = 'rem',
},
Q2612219 = {
label = 'petagram',
ucode = 'Pg',
},
Q2619500 = {
label = 'foe',
ucode = 'foe',
},
Q2637946 = {
label = 'decalitre',
ucode = 'dal',
},
Q2655272 = {
label = 'exagram',
ucode = 'Eg',
},
Q2691798 = {
label = 'centigram',
ucode = 'cg',
},
Q2739114 = {
label = 'microsievert',
ucode = 'uSv',
},
Q2799294 = {
label = 'gigagram',
ucode = 'Gg',
},
Q3013059 = {
label = 'kiloannum',
ucode = 'millennium',
},
Q305896 = {
label = 'dots per inch',
ucode = 'dpi',
},
Q3207456 = {
label = 'milliwatt',
ucode = 'mW',
},
Q3221356 = {
label = 'yoctometre',
ucode = 'ym',
},
Q3239557 = {
label = 'picogram',
ucode = 'pg',
},
Q3241121 = {
label = 'milligram',
ucode = 'mg',
},
Q3267417 = {
label = 'terametre',
ucode = 'Tm',
},
Q3270676 = {
label = 'zeptometre',
ucode = 'zm',
},
Q3276763 = {
label = 'gigahertz',
ucode = 'GHz',
},
Q3277907 = {
label = 'exametre',
ucode = 'Em',
},
Q3277915 = {
label = 'zettametre',
ucode = 'Zm',
},
Q3277919 = {
label = 'petametre',
ucode = 'Pm',
},
Q3312063 = {
label = 'femtolitre',
ucode = 'fl',
},
Q3320608 = {
label = 'kilowatt',
ucode = 'kW',
},
Q3332822 = {
label = 'megaton of TNT',
ucode = 'Mt(TNT)',
},
Q35852 = {
label = 'hectare',
ucode = 'ha',
},
Q3675550 = {
label = 'cubic millimetre',
ucode = 'mm3',
},
Q3710 = {
label = 'foot',
ucode = 'ft',
},
Q3773454 = {
label = 'megaparsec',
ucode = 'Mpc',
},
Q3902688 = {
label = 'picolitre',
ucode = 'pl',
},
Q3902709 = {
label = 'picosecond',
ucode = 'ps',
},
Q39369 = {
label = 'hertz',
ucode = 'Hz',
},
Q3972226 = {
label = 'kilolitre',
ucode = 'kl',
},
Q4068266 = {
label = "apothecaries' drachm",
ucode = 'drachm',
},
Q41803 = {
label = 'gram',
ucode = 'g',
},
Q4220561 = {
label = 'kilometre per second',
ucode = 'km/s',
},
Q42289 = {
label = 'degree Fahrenheit',
ucode = 'F',
},
Q4243638 = {
label = 'cubic kilometre',
ucode = 'km3',
},
Q44395 = {
label = 'pascal',
ucode = 'Pa',
},
Q48013 = {
label = 'ounce',
ucode = 'oz',
},
Q482798 = {
label = 'yard',
ucode = 'yd',
},
Q4989854 = {
label = 'kilojoule',
ucode = 'kJ',
},
Q4992853 = {
label = 'kiloton of TNT',
ucode = 'kt(TNT)',
},
Q5139563 = {
label = 'hectopascal',
ucode = 'hPa',
},
Q5151 = {
label = 'month',
ucode = 'month',
},
Q531 = {
label = 'light-year',
ucode = 'ly',
},
Q5465723 = {
label = 'foot-poundal',
ucode = 'ftpdl',
},
Q573 = {
label = 'day',
ucode = 'd',
},
Q577 = {
label = 'year',
ucode = 'year',
},
Q5879479 = {
label = 'gigawatt',
ucode = 'GW',
},
Q6003257 = {
label = 'attometre',
ucode = 'am',
},
Q613726 = {
label = 'yottagram',
ucode = 'Yg',
},
Q6170164 = {
label = 'yoctogram',
ucode = 'yg',
},
Q667419 = {
label = 'long ton',
ucode = 'LT',
},
Q673166 = {
label = 'gravity of Earth',
ucode = 'g0',
},
Q693944 = {
label = 'grain',
ucode = 'gr',
},
Q6982035 = {
label = 'megawatt',
ucode = 'MW',
},
Q712226 = {
label = 'square kilometre',
ucode = 'km2',
},
Q723733 = {
label = 'millisecond',
ucode = 'ms',
},
Q732454 = {
label = 'megaannum',
ucode = 'Myr',
},
Q732707 = {
label = 'megahertz',
ucode = 'MHz',
},
Q752079 = {
label = 'gross register ton',
ucode = 'grt',
},
Q752197 = {
label = 'kilojoule per mole',
ucode = 'kJ/mol',
},
Q7727 = {
label = 'minute',
ucode = 'min',
},
Q794261 = {
label = 'cubic metre per second',
ucode = 'm3/s',
},
Q809678 = {
label = 'barye',
ucode = 'Ba',
},
Q81292 = {
label = 'acre',
ucode = 'acre',
},
Q81454 = {
label = 'ångström',
ucode = 'angstrom',
},
Q828224 = {
label = 'kilometre',
ucode = 'km',
},
Q83327 = {
label = 'electronvolt',
ucode = 'eV',
},
Q838801 = {
label = 'nanosecond',
ucode = 'ns',
},
Q842015 = {
label = 'microsecond',
ucode = 'us',
},
Q844211 = {
label = 'kilogram per cubic metre',
ucode = 'kg/m3',
},
Q844338 = {
label = 'hectometre',
ucode = 'hm',
},
Q844976 = {
label = 'oersted',
ucode = 'Oe',
},
Q848856 = {
label = 'decametre',
ucode = 'dam',
},
Q854546 = {
label = 'gigametre',
ucode = 'Gm',
},
Q857027 = {
label = 'square foot',
ucode = 'sqft',
},
Q9048643 = {
label = 'nanolitre',
ucode = 'nl',
},
Q93318 = {
label = 'nautical mile',
ucode = 'nmi',
},
}
return { wikidata_units = wikidata_units }
780312bf04e64ca1dd5fb2b59dc26b420a30ab56
Module:Convert/extra
828
725
1114
1113
2025-08-22T00:55:52Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- Extra conversion data used by Module:Convert.
--
-- [[Module:Convert/data]] defines all units and is transcluded in all pages
-- where [[Module:Convert]] is used. Testing new units by editing that module
-- would invalidate the cache for all affected pages.
--
-- For quick changes and experiments with new units, this module can be edited.
-- Since this module is transcluded in only a small number of pages, changes
-- should cause little server overhead and should propagate quickly.
--
-- If a unit is defined in the data module, any definition here is ignored,
-- so defining the same unit in both modules is not an error.
-- A unit defined here can refer to units that are also defined here, and
-- can refer to units defined in the data module.
--
-- Periodically, those extra units that are wanted permanently can be removed
-- from here after being added to [[Module:Convert/data]].
local extra_units = {
["bit"] = {
_name1 = "bit",
_symbol = "bit",
utype = "information",
scale = 0.125,
prefixes = 1,
default = "B",
link = "Bit",
},
["per-km2"] = {
name1 = "per square kilometre",
name1_us = "per square kilometer",
name2 = "per square kilometre",
name2_us = "per square kilometer",
symbol = "per km<sup>2</sup>",
utype = "per unit area",
scale = 1e-6,
default = "/sqmi",
link = "Square kilometre",
},
}
return { extra_units = extra_units }
55a4ac716545a8687a16e661345c64dca7597848
Module:ConvertNumeric
828
726
1116
1115
2025-08-22T00:55:52Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- Module for converting between different representations of numbers. See talk page for user documentation.
-- For unit tests see: [[Module:ConvertNumeric/testcases]]
-- When editing, preview with: [[Module_talk:ConvertNumeric/testcases]]
-- First, edit [[Module:ConvertNumeric/sandbox]], then preview with [[Module_talk:ConvertNumeric/sandbox/testcases]]
require('strict')
local ones_position = {
[0] = 'zero',
[1] = 'one',
[2] = 'two',
[3] = 'three',
[4] = 'four',
[5] = 'five',
[6] = 'six',
[7] = 'seven',
[8] = 'eight',
[9] = 'nine',
[10] = 'ten',
[11] = 'eleven',
[12] = 'twelve',
[13] = 'thirteen',
[14] = 'fourteen',
[15] = 'fifteen',
[16] = 'sixteen',
[17] = 'seventeen',
[18] = 'eighteen',
[19] = 'nineteen'
}
local ones_position_ord = {
[0] = 'zeroth',
[1] = 'first',
[2] = 'second',
[3] = 'third',
[4] = 'fourth',
[5] = 'fifth',
[6] = 'sixth',
[7] = 'seventh',
[8] = 'eighth',
[9] = 'ninth',
[10] = 'tenth',
[11] = 'eleventh',
[12] = 'twelfth',
[13] = 'thirteenth',
[14] = 'fourteenth',
[15] = 'fifteenth',
[16] = 'sixteenth',
[17] = 'seventeenth',
[18] = 'eighteenth',
[19] = 'nineteenth'
}
local ones_position_plural = {
[0] = 'zeros',
[1] = 'ones',
[2] = 'twos',
[3] = 'threes',
[4] = 'fours',
[5] = 'fives',
[6] = 'sixes',
[7] = 'sevens',
[8] = 'eights',
[9] = 'nines',
[10] = 'tens',
[11] = 'elevens',
[12] = 'twelves',
[13] = 'thirteens',
[14] = 'fourteens',
[15] = 'fifteens',
[16] = 'sixteens',
[17] = 'seventeens',
[18] = 'eighteens',
[19] = 'nineteens'
}
local tens_position = {
[2] = 'twenty',
[3] = 'thirty',
[4] = 'forty',
[5] = 'fifty',
[6] = 'sixty',
[7] = 'seventy',
[8] = 'eighty',
[9] = 'ninety'
}
local tens_position_ord = {
[2] = 'twentieth',
[3] = 'thirtieth',
[4] = 'fortieth',
[5] = 'fiftieth',
[6] = 'sixtieth',
[7] = 'seventieth',
[8] = 'eightieth',
[9] = 'ninetieth'
}
local tens_position_plural = {
[2] = 'twenties',
[3] = 'thirties',
[4] = 'forties',
[5] = 'fifties',
[6] = 'sixties',
[7] = 'seventies',
[8] = 'eighties',
[9] = 'nineties'
}
local groups = {
[1] = 'thousand',
[2] = 'million',
[3] = 'billion',
[4] = 'trillion',
[5] = 'quadrillion',
[6] = 'quintillion',
[7] = 'sextillion',
[8] = 'septillion',
[9] = 'octillion',
[10] = 'nonillion',
[11] = 'decillion',
[12] = 'undecillion',
[13] = 'duodecillion',
[14] = 'tredecillion',
[15] = 'quattuordecillion',
[16] = 'quindecillion',
[17] = 'sexdecillion',
[18] = 'septendecillion',
[19] = 'octodecillion',
[20] = 'novemdecillion',
[21] = 'vigintillion',
[22] = 'unvigintillion',
[23] = 'duovigintillion',
[24] = 'tresvigintillion',
[25] = 'quattuorvigintillion',
[26] = 'quinquavigintillion',
[27] = 'sesvigintillion',
[28] = 'septemvigintillion',
[29] = 'octovigintillion',
[30] = 'novemvigintillion',
[31] = 'trigintillion',
[32] = 'untrigintillion',
[33] = 'duotrigintillion',
[34] = 'trestrigintillion',
[35] = 'quattuortrigintillion',
[36] = 'quinquatrigintillion',
[37] = 'sestrigintillion',
[38] = 'septentrigintillion',
[39] = 'octotrigintillion',
[40] = 'noventrigintillion',
[41] = 'quadragintillion',
[51] = 'quinquagintillion',
[61] = 'sexagintillion',
[71] = 'septuagintillion',
[81] = 'octogintillion',
[91] = 'nonagintillion',
[101] = 'centillion',
[102] = 'uncentillion',
[103] = 'duocentillion',
[104] = 'trescentillion',
[111] = 'decicentillion',
[112] = 'undecicentillion',
[121] = 'viginticentillion',
[122] = 'unviginticentillion',
[131] = 'trigintacentillion',
[141] = 'quadragintacentillion',
[151] = 'quinquagintacentillion',
[161] = 'sexagintacentillion',
[171] = 'septuagintacentillion',
[181] = 'octogintacentillion',
[191] = 'nonagintacentillion',
[201] = 'ducentillion',
[301] = 'trecentillion',
[401] = 'quadringentillion',
[501] = 'quingentillion',
[601] = 'sescentillion',
[701] = 'septingentillion',
[801] = 'octingentillion',
[901] = 'nongentillion',
[1001] = 'millinillion',
}
local roman_numerals = {
I = 1,
V = 5,
X = 10,
L = 50,
C = 100,
D = 500,
M = 1000
}
local engord_tens_end = {
['twentieth'] = 20,
['thirtieth'] = 30,
['fortieth'] = 40,
['fiftieth'] = 50,
['sixtieth'] = 60,
['seventieth'] = 70,
['eightieth'] = 80,
['ninetieth'] = 90,
}
local eng_tens_cont = {
['twenty'] = 20,
['thirty'] = 30,
['forty'] = 40,
['fifty'] = 50,
['sixty'] = 60,
['seventy'] = 70,
['eighty'] = 80,
['ninety'] = 90,
}
-- Converts a given valid roman numeral (and some invalid roman numerals) to a number. Returns { -1, errorstring } on error.
local function roman_to_numeral(roman)
if type(roman) ~= "string" then return -1, "roman numeral not a string" end
local rev = roman:reverse()
local raising = true
local last = 0
local result = 0
for i = 1, #rev do
local c = rev:sub(i, i)
local next = roman_numerals[c]
if next == nil then return -1, "roman numeral contains illegal character " .. c end
if next > last then
result = result + next
raising = true
elseif next < last then
result = result - next
raising = false
elseif raising then
result = result + next
else
result = result - next
end
last = next
end
return result
end
-- Converts a given integer between 0 and 100 to English text (e.g. 47 -> forty-seven).
local function numeral_to_english_less_100(num, ordinal, plural, zero)
local terminal_ones, terminal_tens
if ordinal then
terminal_ones = ones_position_ord
terminal_tens = tens_position_ord
elseif plural then
terminal_ones = ones_position_plural
terminal_tens = tens_position_plural
else
terminal_ones = ones_position
terminal_tens = tens_position
end
if num == 0 and zero ~= nil then
return zero
elseif num < 20 then
return terminal_ones[num]
elseif num % 10 == 0 then
return terminal_tens[num / 10]
else
return tens_position[math.floor(num / 10)] .. '-' .. terminal_ones[num % 10]
end
end
local function standard_suffix(ordinal, plural)
if ordinal then return 'th' end
if plural then return 's' end
return ''
end
-- Converts a given integer (in string form) between 0 and 1000 to English text (e.g. 47 -> forty-seven).
local function numeral_to_english_less_1000(num, use_and, ordinal, plural, zero)
num = tonumber(num)
if num < 100 then
return numeral_to_english_less_100(num, ordinal, plural, zero)
elseif num % 100 == 0 then
return ones_position[num/100] .. ' hundred' .. standard_suffix(ordinal, plural)
else
return ones_position[math.floor(num/100)] .. ' hundred ' .. (use_and and 'and ' or '') .. numeral_to_english_less_100(num % 100, ordinal, plural, zero)
end
end
-- Converts an ordinal in English text from 'zeroth' to 'ninety-ninth' inclusive to a number [0–99], else -1.
local function english_to_ordinal(english)
local eng = string.lower(english or '')
local engord_lt20 = {} -- ones_position_ord{} keys & values swapped
for k, v in pairs( ones_position_ord ) do
engord_lt20[v] = k
end
if engord_lt20[eng] then
return engord_lt20[eng] -- e.g. first -> 1
elseif engord_tens_end[eng] then
return engord_tens_end[eng] -- e.g. ninetieth -> 90
else
local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$')
if tens and ones then
local tens_cont = eng_tens_cont[tens]
local ones_end = engord_lt20[ones]
if tens_cont and ones_end then
return tens_cont + ones_end -- e.g. ninety-ninth -> 99
end
end
end
return -1 -- Failed
end
-- Converts a number in English text from 'zero' to 'ninety-nine' inclusive to a number [0–99], else -1.
local function english_to_numeral(english)
local eng = string.lower(english or '')
local eng_lt20 = { ['single'] = 1 } -- ones_position{} keys & values swapped
for k, v in pairs( ones_position ) do
eng_lt20[v] = k
end
if eng_lt20[eng] then
return eng_lt20[eng] -- e.g. one -> 1
elseif eng_tens_cont[eng] then
return eng_tens_cont[eng] -- e.g. ninety -> 90
else
local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$')
if tens and ones then
local tens_cont = eng_tens_cont[tens]
local ones_end = eng_lt20[ones]
if tens_cont and ones_end then
return tens_cont + ones_end -- e.g. ninety-nine -> 99
end
end
end
return -1 -- Failed
end
-- Converts a number expressed as a string in scientific notation to a string in standard decimal notation
-- e.g. 1.23E5 -> 123000, 1.23E-5 = .0000123. Conversion is exact, no rounding is performed.
local function scientific_notation_to_decimal(num)
local exponent, subs = num:gsub("^%-?%d*%.?%d*%-?[Ee]([+%-]?%d+)$", "%1")
if subs == 0 then return num end -- Input not in scientific notation, just return unmodified
exponent = tonumber(exponent)
local negative = num:find("^%-")
local _, decimal_pos = num:find("%.")
-- Mantissa will consist of all decimal digits with no decimal point
local mantissa = num:gsub("^%-?(%d*)%.?(%d*)%-?[Ee][+%-]?%d+$", "%1%2")
if negative and decimal_pos then decimal_pos = decimal_pos - 1 end
if not decimal_pos then decimal_pos = #mantissa + 1 end
-- Remove leading zeros unless decimal point is in first position
while decimal_pos > 1 and mantissa:sub(1,1) == '0' do
mantissa = mantissa:sub(2)
decimal_pos = decimal_pos - 1
end
-- Shift decimal point right for exponent > 0
while exponent > 0 do
decimal_pos = decimal_pos + 1
exponent = exponent - 1
if decimal_pos > #mantissa + 1 then mantissa = mantissa .. '0' end
-- Remove leading zeros unless decimal point is in first position
while decimal_pos > 1 and mantissa:sub(1,1) == '0' do
mantissa = mantissa:sub(2)
decimal_pos = decimal_pos - 1
end
end
-- Shift decimal point left for exponent < 0
while exponent < 0 do
if decimal_pos == 1 then
mantissa = '0' .. mantissa
else
decimal_pos = decimal_pos - 1
end
exponent = exponent + 1
end
-- Insert decimal point in correct position and return
return (negative and '-' or '') .. mantissa:sub(1, decimal_pos - 1) .. '.' .. mantissa:sub(decimal_pos)
end
-- Rounds a number to the nearest integer (NOT USED)
local function round_num(x)
if x%1 >= 0.5 then
return math.ceil(x)
else
return math.floor(x)
end
end
-- Rounds a number to the nearest two-word number (round = up, down, or "on" for round to nearest).
-- Numbers with two digits before the decimal will be rounded to an integer as specified by round.
-- Larger numbers will be rounded to a number with only one nonzero digit in front and all other digits zero.
-- Negative sign is preserved and does not count towards word limit.
local function round_for_english(num, round)
-- If an integer with at most two digits, just return
if num:find("^%-?%d?%d%.?$") then return num end
local negative = num:find("^%-")
if negative then
-- We're rounding magnitude so flip it
if round == 'up' then round = 'down' elseif round == 'down' then round = 'up' end
end
-- If at most two digits before decimal, round to integer and return
local _, _, small_int, trailing_digits, round_digit = num:find("^%-?(%d?%d?)%.((%d)%d*)$")
if small_int then
if small_int == '' then small_int = '0' end
if (round == 'up' and trailing_digits:find('[1-9]')) or (round == 'on' and tonumber(round_digit) >= 5) then
small_int = tostring(tonumber(small_int) + 1)
end
return (negative and '-' or '') .. small_int
end
-- When rounding up, any number with > 1 nonzero digit will round up (e.g. 1000000.001 rounds up to 2000000)
local nonzero_digits = 0
for digit in num:gfind("[1-9]") do
nonzero_digits = nonzero_digits + 1
end
num = num:gsub("%.%d*$", "") -- Remove decimal part
-- Second digit used to determine which way to round lead digit
local _, _, lead_digit, round_digit, round_digit_2, rest = num:find("^%-?(%d)(%d)(%d)(%d*)$")
if tonumber(lead_digit .. round_digit) < 20 and (1 + #rest) % 3 == 0 then
-- In English numbers < 20 are one word so put 2 digits in lead and round based on 3rd
lead_digit = lead_digit .. round_digit
round_digit = round_digit_2
else
rest = round_digit_2 .. rest
end
if (round == 'up' and nonzero_digits > 1) or (round == 'on' and tonumber(round_digit) >= 5) then
lead_digit = tostring(tonumber(lead_digit) + 1)
end
-- All digits but lead digit will turn to zero
rest = rest:gsub("%d", "0")
return (negative and '-' or '') .. lead_digit .. '0' .. rest
end
local denominators = {
[2] = { 'half', plural = 'halves' },
[3] = { 'third' },
[4] = { 'quarter', us = 'fourth' },
[5] = { 'fifth' },
[6] = { 'sixth' },
[8] = { 'eighth' },
[9] = { 'ninth' },
[10] = { 'tenth' },
[16] = { 'sixteenth' },
}
-- Return status, fraction where:
-- status is a string:
-- "finished" if there is a fraction with no whole number;
-- "ok" if fraction is empty or valid;
-- "unsupported" if bad fraction;
-- fraction is a string giving (numerator / denominator) as English text, or is "".
-- Only unsigned fractions with a very limited range of values are supported,
-- except that if whole is empty, the numerator can use "-" to indicate negative.
-- whole (string or nil): nil or "" if no number before the fraction
-- numerator (string or nil): numerator, if any (default = 1 if a denominator is given)
-- denominator (string or nil): denominator, if any
-- sp_us (boolean): true if sp=us
-- negative_word (string): word to use for negative sign, if whole is empty
-- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half"
local function fraction_to_english(whole, numerator, denominator, sp_us, negative_word, use_one)
if numerator or denominator then
local finished = (whole == nil or whole == '')
local sign = ''
if numerator then
if finished and numerator:sub(1, 1) == '-' then
numerator = numerator:sub(2)
sign = negative_word .. ' '
end
else
numerator = '1'
end
if not numerator:match('^%d+$') or not denominator or not denominator:match('^%d+$') then
return 'unsupported', ''
end
numerator = tonumber(numerator)
denominator = tonumber(denominator)
local dendata = denominators[denominator]
if not (dendata and 1 <= numerator and numerator <= 99) then
return 'unsupported', ''
end
local numstr, denstr
local sep = '-'
if numerator == 1 then
denstr = sp_us and dendata.us or dendata[1]
if finished or use_one then
numstr = 'one'
elseif denstr:match('^[aeiou]') then
numstr = 'an'
sep = ' '
else
numstr = 'a'
sep = ' '
end
else
numstr = numeral_to_english_less_100(numerator)
denstr = dendata.plural
if not denstr then
denstr = (sp_us and dendata.us or dendata[1]) .. 's'
end
end
if finished then
return 'finished', sign .. numstr .. sep .. denstr
end
return 'ok', ' and ' .. numstr .. sep .. denstr
end
return 'ok', ''
end
-- Takes a decimal number and converts it to English text.
-- Return nil if a fraction cannot be converted (only some numbers are supported for fractions).
-- num (string or nil): the number to convert.
-- Can be an arbitrarily large decimal, such as "-123456789123456789.345", and
-- can use scientific notation (e.g. "1.23E5").
-- May fail for very large numbers not listed in "groups" such as "1E4000".
-- num is nil if there is no whole number before a fraction.
-- numerator (string or nil): numerator of fraction (nil if no fraction)
-- denominator (string or nil): denominator of fraction (nil if no fraction)
-- capitalize (boolean): whether to capitalize the result (e.g. 'One' instead of 'one')
-- use_and (boolean): whether to use the word 'and' between tens/ones place and higher places
-- hyphenate (boolean): whether to hyphenate all words in the result, useful as an adjective
-- ordinal (boolean): whether to produce an ordinal (e.g. 'first' instead of 'one')
-- plural (boolean): whether to pluralize the resulting number
-- links: nil: do not add any links; 'on': link "billion" and larger to Orders of magnitude article;
-- any other text: list of numbers to link (e.g. "billion,quadrillion")
-- negative_word: word to use for negative sign (typically 'negative' or 'minus'; nil to use default)
-- round: nil or '': no rounding; 'on': round to nearest two-word number; 'up'/'down': round up/down to two-word number
-- zero: word to use for value '0' (nil to use default)
-- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half"
local function _numeral_to_english(num, numerator, denominator, capitalize, use_and, hyphenate, ordinal, plural, links, negative_word, round, zero, use_one)
if not negative_word then
if use_and then
-- TODO Should 'minus' be used when do not have sp=us?
-- If so, need to update testcases, and need to fix "minus zero".
-- negative_word = 'minus'
negative_word = 'negative'
else
negative_word = 'negative'
end
end
local status, fraction_text = fraction_to_english(num, numerator, denominator, not use_and, negative_word, use_one)
if status == 'unsupported' then
return nil
end
if status == 'finished' then
-- Input is a fraction with no whole number.
-- Hack to avoid executing stuff that depends on num being a number.
local s = fraction_text
if hyphenate then s = s:gsub("%s", "-") end
if capitalize then s = s:gsub("^%l", string.upper) end
return s
end
num = scientific_notation_to_decimal(num)
if round and round ~= '' then
if round ~= 'on' and round ~= 'up' and round ~= 'down' then
error("Invalid rounding mode")
end
num = round_for_english(num, round)
end
-- Separate into negative sign, num (digits before decimal), decimal_places (digits after decimal)
local MINUS = '−' -- Unicode U+2212 MINUS SIGN (may be in values from [[Module:Convert]])
if num:sub(1, #MINUS) == MINUS then
num = '-' .. num:sub(#MINUS + 1) -- replace MINUS with '-'
elseif num:sub(1, 1) == '+' then
num = num:sub(2) -- ignore any '+'
end
local negative = num:find("^%-")
local decimal_places, subs = num:gsub("^%-?%d*%.(%d+)$", "%1")
if subs == 0 then decimal_places = nil end
num, subs = num:gsub("^%-?(%d*)%.?%d*$", "%1")
if num == '' and decimal_places then num = '0' end
if subs == 0 or num == '' then error("Invalid decimal numeral") end
-- For each group of 3 digits except the last one, print with appropriate group name (e.g. million)
local s = ''
while #num > 3 do
if s ~= '' then s = s .. ' ' end
local group_num = math.floor((#num - 1) / 3)
local group = groups[group_num]
local group_digits = #num - group_num*3
s = s .. numeral_to_english_less_1000(num:sub(1, group_digits), false, false, false, zero) .. ' '
if links and (((links == 'on' and group_num >= 3) or links:find(group)) and group_num <= 13) then
s = s .. '[[Orders_of_magnitude_(numbers)#10' .. group_num*3 .. '|' .. group .. ']]'
else
s = s .. group
end
num = num:sub(1 + group_digits)
num = num:gsub("^0*", "") -- Trim leading zeros
end
-- Handle final three digits of integer part
if s ~= '' and num ~= '' then
if #num <= 2 and use_and then
s = s .. ' and '
else
s = s .. ' '
end
end
if s == '' or num ~= '' then
s = s .. numeral_to_english_less_1000(num, use_and, ordinal, plural, zero)
elseif ordinal or plural then
-- Round numbers like "one million" take standard suffixes for ordinal/plural
s = s .. standard_suffix(ordinal, plural)
end
-- For decimal places (if any) output "point" followed by spelling out digit by digit
if decimal_places then
s = s .. ' point'
for i = 1, #decimal_places do
s = s .. ' ' .. ones_position[tonumber(decimal_places:sub(i,i))]
end
end
s = s:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace
if ordinal and plural then s = s .. 's' end -- s suffix works for all ordinals
if negative and s ~= zero then s = negative_word .. ' ' .. s end
s = s:gsub("negative zero", "zero")
s = s .. fraction_text
if hyphenate then s = s:gsub("%s", "-") end
if capitalize then s = s:gsub("^%l", string.upper) end
return s
end
local function _numeral_to_english2(args)
local num = tostring(args.num)
num = num:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace
num = num:gsub(",", "") -- Remove commas
num = num:gsub("^<span[^<>]*></span>", "") -- Generated by Template:age
if num ~= '' then -- a fraction may have an empty whole number
if not num:find("^%-?%d*%.?%d*%-?[Ee]?[+%-]?%d*$") then
-- Input not in a valid format, try to eval it as an expr to see
-- if that produces a number (e.g. "3 + 5" will become "8").
local noerr, result = pcall(mw.ext.ParserFunctions.expr, num)
if noerr then
num = result
end
end
end
-- Call helper function passing args
return _numeral_to_english(
num,
args['numerator'],
args['denominator'],
args['capitalize'],
args['use_and'],
args['hyphenate'],
args['ordinal'],
args['plural'],
args['links'],
args['negative_word'],
args['round'],
args['zero'],
args['use_one']
) or ''
end
local p = { -- Functions that can be called from another module
roman_to_numeral = roman_to_numeral,
spell_number = _numeral_to_english,
spell_number2 = _numeral_to_english2,
english_to_ordinal = english_to_ordinal,
english_to_numeral = english_to_numeral,
}
function p._roman_to_numeral(frame) -- Callable via {{#invoke:ConvertNumeric|_roman_to_numeral|VI}}
return roman_to_numeral(frame.args[1])
end
function p._english_to_ordinal(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_ordinal|First}}
return english_to_ordinal(frame.args[1])
end
function p._english_to_numeral(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_numeral|One}}
return english_to_numeral(frame.args[1])
end
function p.numeral_to_english(frame)
local args = frame.args
-- Tail call to helper function passing args from frame
return _numeral_to_english2{
['num'] = args[1],
['numerator'] = args['numerator'],
['denominator'] = args['denominator'],
['capitalize'] = args['case'] == 'U' or args['case'] == 'u',
['use_and'] = args['sp'] ~= 'us',
['hyphenate'] = args['adj'] == 'on',
['ordinal'] = args['ord'] == 'on',
['plural'] = args['pl'] == 'on',
['links'] = args['lk'],
['negative_word'] = args['negative'],
['round'] = args['round'],
['zero'] = args['zero'],
['use_one'] = args['one'] == 'one' -- experiment: using '|one=one' makes fraction 2+1/2 give "two and one-half" instead of "two and a half"
}
end
---- recursive function for p.decToHex
local function decToHexDigit(dec)
local dig = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}
local div = math.floor(dec/16)
local mod = dec-(16*div)
if div >= 1 then return decToHexDigit(div)..dig[mod+1] else return dig[mod+1] end
end -- I think this is supposed to be done with a tail call but first I want something that works at all
---- finds all the decimal numbers in the input text and hexes each of them
function p.decToHex(frame)
local args=frame.args
local parent=frame.getParent(frame)
local pargs={}
if parent then pargs=parent.args end
local text=args[1] or pargs[1] or ""
local minlength=args.minlength or pargs.minlength or 1
minlength=tonumber(minlength)
local prowl=mw.ustring.gmatch(text,"(.-)(%d+)")
local output=""
repeat
local chaff,dec=prowl()
if not(dec) then break end
local hex=decToHexDigit(dec)
while (mw.ustring.len(hex)<minlength) do hex="0"..hex end
output=output..chaff..hex
until false
local chaff=mw.ustring.match(text,"(%D+)$") or ""
return output..chaff
end
return p
dbb876f8710ee1407b421a28b3e9bc5a6ea36cda
Template:Fraction
10
727
1118
1117
2025-08-22T00:55:52Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
<templatestyles src="Fraction/styles.css" /><!--
--><span class="frac"><!--
-->{{#if:{{{3|}}}<!-- if 3
-->|{{{1}}}<span class="sr-only">+</span><span class="num">{{{2}}}</span>⁄<span class="den">{{{3}}}</span><!-- then 1 2/3
-->|{{#if:{{{2|}}}<!-- elseif 2
-->|<span class="num">{{{1}}}</span>⁄<span class="den">{{{2}}}</span><!-- then 1/2
-->|{{#if:{{{1|}}}<!-- elseif 1
-->|<span class="num">1</span>⁄<span class="den">{{{1}}}</span><!-- then 1/1
-->|⁄<!-- else 0, a slash
-->}}<!-- endif 1
-->}}<!-- endif 2
-->}}<!-- endif 3
--></span><noinclude>
{{documentation}}
</noinclude>
92a487359898e00b80676732b41757019446ae53
Template:Fraction/styles.css
10
728
1120
1119
2025-08-22T00:55:52Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
/* {{pp|small=y}} */
.frac {
white-space: nowrap;
}
.frac .num,
.frac .den {
font-size: 80%;
line-height: 0; /* we want this inline */
vertical-align: super;
}
.frac .den {
vertical-align: sub;
}
/* [[Template:Screen reader-only]] is canonical implementation onwiki */
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
/* white-space: nowrap; /* already have nowrap above */
}
b28507c69a3866957f0cad2cbdb76d24154ba271
Template:Sfrac
10
729
1122
1121
2025-08-22T00:55:52Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{ {{{|safesubst:}}}#invoke:Unsubst||$B=<templatestyles src="Sfrac/styles.css" /><span class="sfrac">⁠{{#if:{{{3|}}}|{{{1}}}<span class="sr-only">+</span>}}<!--
--><span class="tion" {{#if:{{{font-size|}}}|style="font-size:{{{font-size}}}"}}><!--
--><span class="num">{{#if:{{{3|}}}|{{{2}}}|{{#if:{{{2|}}}|{{{1}}}|1}}}}</span><!--
--><span class="sr-only">/</span><!--
--><span class="den">{{{3|{{{2|{{{1|1}}}}}}}}}</span><!--
--></span><!--
-->⁠</span>}}<noinclude>
{{documentation}}
<!-- Add categories to /doc subpage, not here. -->
</noinclude>
1a4f22ed67a613ab0f1d9abf9816187efc00f50a
Module:Unsubst
828
730
1124
1123
2025-08-22T00:55:52Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
local checkType = require('libraryUtil').checkType
local p = {}
local BODY_PARAM = '$B'
local specialParams = {
['$params'] = 'parameter list',
['$aliases'] = 'parameter aliases',
['$flags'] = 'flags',
['$B'] = 'template content',
['$template-name'] = 'template invocation name override',
}
function p.main(frame, body)
-- If we are substing, this function returns a template invocation, and if
-- not, it returns the template body. The template body can be specified in
-- the body parameter, or in the template parameter defined in the
-- BODY_PARAM variable. This function can be called from Lua or from
-- #invoke.
-- Return the template body if we aren't substing.
if not mw.isSubsting() then
if body ~= nil then
return body
elseif frame.args[BODY_PARAM] ~= nil then
return frame.args[BODY_PARAM]
else
error(string.format(
"no template content specified (use parameter '%s' from #invoke)",
BODY_PARAM
), 2)
end
end
-- Sanity check for the frame object.
if type(frame) ~= 'table'
or type(frame.getParent) ~= 'function'
or not frame:getParent()
then
error(
"argument #1 to 'main' must be a frame object with a parent " ..
"frame available",
2
)
end
-- Find the invocation name.
local mTemplateInvocation = require('Module:Template invocation')
local name
if frame.args['$template-name'] and '' ~= frame.args['$template-name'] then
name = frame.args['$template-name'] -- override whatever the template name is with this name
else
name = mTemplateInvocation.name(frame:getParent():getTitle())
end
-- Combine passed args with passed defaults
local args = {}
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then
for k, v in pairs( frame:getParent().args ) do
args[k] = v
end
for k, v in pairs( frame.args ) do
if not specialParams[k] then
if v == '__DATE__' then
v = mw.getContentLanguage():formatDate( 'F Y' )
end
args[k] = v
end
end
else
for k, v in pairs( frame.args ) do
if not specialParams[k] then
if v == '__DATE__' then
v = mw.getContentLanguage():formatDate( 'F Y' )
end
args[k] = v
end
end
for k, v in pairs( frame:getParent().args ) do
args[k] = v
end
end
-- Trim parameters, if not specified otherwise
if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then
for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end
end
-- Pull information from parameter aliases
local aliases = {}
if frame.args['$aliases'] then
local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' )
for k, v in ipairs( list ) do
local tmp = mw.text.split( v, '%s*>%s*' )
aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2])
end
end
for k, v in pairs( aliases ) do
if args[k] and ( not args[v] or args[v] == '' ) then
args[v] = args[k]
end
args[k] = nil
end
-- Remove empty parameters, if specified
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then
local tmp = 0
for k, v in ipairs( args ) do
if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then
tmp = k
else
break
end
end
for k, v in pairs( args ) do
if v == '' then
if not (type(k) == 'number' and k < tmp) then args[k] = nil end
end
end
end
-- Order parameters
if frame.args['$params'] then
local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {}
for k, v in ipairs(params) do
v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v
if args[v] then tmp[v], args[v] = args[v], nil end
end
for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end
args = tmp
end
return mTemplateInvocation.invocation(name, args)
end
p[''] = p.main -- For backwards compatibility
return p
7f01ffc8aa2ac4a4772f14c12e0b77e384ecabb6
Module:Template invocation
828
731
1126
1125
2025-08-22T00:55:53Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
-- This module provides functions for making MediaWiki template invocations.
local checkType = require('libraryUtil').checkType
local p = {}
------------------------------------------------------------------------
-- Name: p.name
-- Purpose: Find a template invocation name from a page name or a
-- mw.title object.
-- Description: This function detects whether a string or a mw.title
-- object has been passed in, and uses that to find a
-- template name as it is used in template invocations.
-- Parameters: title - full page name or mw.title object for the
-- template (string or mw.title object)
-- Returns: String
------------------------------------------------------------------------
function p.name(title)
if type(title) == 'string' then
title = mw.title.new(title)
if not title or #title.prefixedText == 0 or #title.interwiki > 0 then
error("invalid title in parameter #1 of function 'name'", 2)
end
elseif type(title) ~= 'table' or type(title.getContent) ~= 'function' then
error("parameter #1 of function 'name' must be a string or a mw.title object", 2)
end
if title.namespace == 10 then
local text = title.text
local check = mw.title.new(text, 10)
-- Exclude the prefix, unless we have something like "Template:Category:Foo", which can't be abbreviated to "Category:Foo".
return check and mw.title.equals(title, check) and text or title.prefixedText
elseif title.namespace == 0 then
return ':' .. title.prefixedText
else
return title.prefixedText
end
end
------------------------------------------------------------------------
-- Name: p.invocation
-- Purpose: Construct a MediaWiki template invocation.
-- Description: This function makes a template invocation from the
-- name and the arguments given. Note that it isn't
-- perfect: we have no way of knowing what whitespace was
-- in the original invocation, the named parameters will be
-- alphabetically sorted, and any parameters with duplicate keys
-- will be removed.
-- Parameters: name - the template name, formatted as it will appear
-- in the invocation. (string)
-- args - a table of template arguments. (table)
-- format - formatting options. (string, optional)
-- Set to "nowiki" to escape, curly braces, pipes and
-- equals signs with their HTML entities. The default
-- is unescaped.
-- Returns: String
------------------------------------------------------------------------
function p.invocation(name, args, format)
checkType('invocation', 1, name, 'string')
checkType('invocation', 2, args, 'table')
checkType('invocation', 3, format, 'string', true)
-- Validate the args table and make a copy to work from. We need to
-- make a copy of the table rather than just using the original, as
-- some of the values may be erased when building the invocation.
local invArgs = {}
for k, v in pairs(args) do
local typek = type(k)
local typev = type(v)
if typek ~= 'string' and typek ~= 'number'
or typev ~= 'string' and typev ~= 'number'
then
error("invalid arguments table in parameter #2 of " ..
"'invocation' (keys and values must be strings or numbers)", 2)
end
invArgs[k] = v
end
-- Get the separators to use.
local seps = {
openb = '{{',
closeb = '}}',
pipe = '|',
equals = '='
}
if format == 'nowiki' then
for k, v in pairs(seps) do
seps[k] = mw.text.nowiki(v)
end
end
-- Build the invocation body with numbered args first, then named.
local ret = {}
ret[#ret + 1] = seps.openb
ret[#ret + 1] = name
for k, v in ipairs(invArgs) do
if type(v) == 'string' and v:find('=', 1, true) then
-- Likely something like 1=foo=bar which needs to be displayed as a named arg.
else
ret[#ret + 1] = seps.pipe
ret[#ret + 1] = v
invArgs[k] = nil -- Erase the key so that we don't add the value twice
end
end
local keys = {} -- sort parameter list; better than arbitrary order
for k, _ in pairs(invArgs) do
keys[#keys + 1] = k
end
table.sort(keys,
function (a, b)
-- Sort with keys of type number first, then string.
if type(a) == type(b) then
return a < b
elseif type(a) == 'number' then
return true
end
end
)
local maybeSpace = '' -- First named parameter should not be separated by a space
for _, v in ipairs(keys) do -- Add named args based on sorted parameter list
ret[#ret + 1] = maybeSpace .. seps.pipe
ret[#ret + 1] = tostring(v)
ret[#ret + 1] = seps.equals
ret[#ret + 1] = invArgs[v]
maybeSpace = ' '
end
ret[#ret + 1] = seps.closeb
return table.concat(ret)
end
return p
1670c64056477574789c5c21349ec2234f60dd9c
Template:Sfrac/styles.css
10
732
1128
1127
2025-08-22T00:55:53Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
/* {{pp|small=y}} */
.sfrac {
white-space: nowrap;
}
.sfrac.tion,
.sfrac .tion {
display: inline-block;
vertical-align: -0.5em;
font-size: 85%;
text-align: center;
}
.sfrac .num {
display: block;
line-height: 1em;
margin: 0.0em 0.1em;
border-bottom: 1px solid;
}
.sfrac .den {
display: block;
line-height: 1em;
margin: 0.1em 0.1em;
}
/* [[Template:Screen reader-only]] is canonical implementation onwiki */
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0); /* removed from CSS */
clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
/* white-space: nowrap; /* already have nowrap above */
}
197429395812c1ab351775e9ab127ae0ef74564e
Coordinates
0
342
1129
455
2025-08-22T00:56:56Z
Sharparam
284703
Use {{tl|val}} again
wikitext
text/x-wiki
{{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}}
'''{{PAGENAME}}''' are used to indicate the player's location in the world.
== Overview ==
The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height).
== Bugs ==
* The coordinates as displayed inside the game on the inventory screen are often incorrect. The game truncates each coordinate value to only show the first four digits. As an example, if the player is at X coordinate {{val|13529}} (five digits), the game will show it as {{val|1352}} (four digits). To get an accurate position, usage of software that can enable the Unreal Engine debug HUD is required. If using the Unreal Engine Unlocker software, enable the debug HUD by using the <code>showdebug</code> command.
== External links ==
* [https://dev.epicgames.com/documentation/en-us/unreal-engine/coordinate-system-and-spaces-in-unreal-engine Coordinate System and Spaces] in the Unreal Engine documentation
[[Category:Game mechanics]]
4b2a35e53034534a2fd7a260f1c18bf681e114ed
Template:Para
10
733
1130
2025-08-22T01:04:13Z
Sharparam
284703
Created page with "<code class="tpl-para" style="word-break:break-word;{{SAFESUBST:<noinclude />#if:{{{plain|}}}|border: none; background-color: inherit;}} {{SAFESUBST:<noinclude />#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}|color: {{SAFESUBST:<noinclude />#if:{{{mxt|}}}{{{green|}}}|#006400|{{SAFESUBST:<noinclude />#if:{{{!mxt|}}}{{{red|}}}|#8B0000|inherit}}}};}} {{SAFESUBST:<noinclude />#if:{{{style|}}}|{{{style}}}}}">|{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{{1}}}=..."
wikitext
text/x-wiki
<code class="tpl-para" style="word-break:break-word;{{SAFESUBST:<noinclude />#if:{{{plain|}}}|border: none; background-color: inherit;}} {{SAFESUBST:<noinclude />#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}|color: {{SAFESUBST:<noinclude />#if:{{{mxt|}}}{{{green|}}}|#006400|{{SAFESUBST:<noinclude />#if:{{{!mxt|}}}{{{red|}}}|#8B0000|inherit}}}};}} {{SAFESUBST:<noinclude />#if:{{{style|}}}|{{{style}}}}}">|{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{{1}}}=}}{{{2|}}}</code><noinclude>
{{Documentation}}
<!--Categories and interwikis go near the bottom of the /doc subpage.-->
</noinclude>
06006deea2ed5d552aab61b4332321ab749ae7e8
Template:Para/doc
10
734
1131
2025-08-22T01:04:53Z
Sharparam
284703
Created page with "== External links == * [[wikipedia:Template:Para|Template and documentation on Wikipedia]] <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== External links ==
* [[wikipedia:Template:Para|Template and documentation on Wikipedia]]
<noinclude>[[Category:Template documentation]]</noinclude>
8ae906ad9a1b93d7d7300c0e02c2e6a8b63d28c7
Template:About/doc
10
735
1132
2025-08-22T01:07:58Z
Sharparam
284703
Created page with "<!-- Categories go where indicated at the bottom of this page, please. --> {{Tl|About}} is a commonly used [[wikipedia:WP:Hatnote|hatnote template]] for linking the reader to other articles with similar titles or concepts that they may have been seeking instead. ==Usage== This template should be [[wikipedia:WP:HATNOTEPLACE|placed]] at the top of an article (but following {{Tlx|Short description}}, if present). The template has several formats, including: *{{Tlx|About}}..."
wikitext
text/x-wiki
<!--
Categories go where indicated at the bottom of this page, please. -->
{{Tl|About}} is a commonly used [[wikipedia:WP:Hatnote|hatnote template]] for linking the reader to other articles with similar titles or concepts that they may have been seeking instead.
==Usage==
This template should be [[wikipedia:WP:HATNOTEPLACE|placed]] at the top of an article (but following {{Tlx|Short description}}, if present). The template has several formats, including:
*{{Tlx|About}} → {{About}}
*{{Tlx|About|Use1}} → {{About|Use1}}
*{{Tlx|About|<nowiki/>|Use2|Article2}} → {{About||Use2|Article2}}
*{{Tlx|About|<nowiki/>|<nowiki/>||Article (disambiguation)}} → {{About|||Article (disambiguation)}}
*{{Tlx|About|Use1|<nowiki/>|Article2}} → {{About|Use1||Article2}}
*{{Tlx|About|Use1|<nowiki/>|Article2|and|Article3}} → {{About|Use1||Article2|and|Article3}}
*{{Tlx|About|Use1|Use2|Article2}} → {{About|Use1|Use2|Article2}}
*{{Tlx|About|Use1|Use2|Article2|and|Article3}} → {{About|Use1|Use2|Article2|and|Article3}}
*{{Tlx|About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}} → {{About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}}
*{{Tlx|About|Use1|Use2|Article2|Use3|Article3}} → {{About|Use1|Use2|Article2|Use3|Article3}}
*{{Tlx|About|Use1|Use2|Article2|other uses}} → {{About|Use1|Use2|Article2|other uses}}
The template {{tl|For-multi}} produces the same hatnote, but without the initial ''This template is about''.
=== Styling in italics ===
Please see [[wikipedia:Wikipedia:Hatnote#Hatnotes with italics in the links]] ([[wikipedia:WP:ITHAT]]) for details about how to use italics in hatnotes.
==Parameters==
Alternately, a {{para|section|yes}} parameter can be added to the {{Tl|About}} template for use at the top of a section. When using this parameter, the wording in the template changes to specify that it is being used in a section:
*{{Tlx|About|Use1|<nowiki>section=yes</nowiki>}} → {{About|Use1|section=yes}}
*{{Tlx|About|Use1|<nowiki/>|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1||Article2|section=yes}}
*{{Tlx|About|Use1|Use2|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|section=yes}}
*{{Tlx|About|Use1|Use2|Article2|and|Article3|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|and|Article3|section=yes}}
*{{Tlx|About|Use1|Use2|Article2|other uses|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|other uses|section=yes}}
A {{para|text}} option adds text to the end; this should only be used when truly necessary, when the other hatnote templates listed below don't suffice.
The {{para|selfref|yes}} option marks the entire hatnote as a Wikipedia self-reference, causing it to be omitted when the page content is reused outside of Wikipedia (see {{tl|self reference}} and [[wikipedia:MOS:SELFREF]] for more details).
For more options, see section "TemplateData" below.
==TemplateData==
<!--{{TemplateData header}}-->
<!-- Should this mention the existence of "and"? It's something of a can of worms, since it only looks as though it only works in certain combinations of the other page 2/3/4 description fields... -->
<templatedata>
{
"description": "This template is a hatnote in the format \"This page is about … For other uses …\".",
"params": {
"1": {
"label": "Page description",
"type": "string",
"description": "What the page this template is placed on is about (\"This page is about …\")",
"suggested": true
},
"2": {
"label": "Other page 1 description",
"type": "string",
"description": "What the first other page is about. If unused or blank, defaults to \"other uses\".",
"suggested": true
},
"3": {
"label": "Other page 1 title",
"type": "wiki-page-name",
"description": "The title of the first other page. If unused, defaults to \"[page title] (disambiguation)\".",
"suggested": true
},
"4": {
"label": "Other page 2 description",
"type": "string",
"description": "What the second other page is about."
},
"5": {
"label": "Other page 2 title",
"type": "wiki-page-name",
"description": "The title of the second other page. If unused or blank and parameter 4 exists, defaults to \"[page title] (disambiguation)\"."
},
"6": {
"label": "Other page 3 description",
"type": "string",
"description": "What the third other page is about."
},
"7": {
"label": "Other page 3 title",
"type": "wiki-page-name",
"description": "The title of the third other page. If unused or blank and parameter 6 exists, defaults to \"[page title] (disambiguation)\"."
},
"8": {
"label": "Other page 4 description",
"type": "string",
"description": "What the fourth other page is about."
},
"9": {
"label": "Other page 4 title",
"type": "wiki-page-name",
"description": "The title of the fourth other page. If unused or blank and parameter 8 exists, defaults to \"[page title] (disambiguation)\"."
},
"section": {
"type": "string",
"description": "Pass \"yes\" in this parameter to get wording appropriate for use at the top of a section.",
"autovalue": "yes"
},
"text": {
"label": "Custom text",
"type": "string",
"description": "Text to be appended to the end."
}
}
}
</templatedata>
==See also==
* [[wikipedia:Wikipedia:Hatnote]]
<!--{{Hatnote templates}}-->
<!-- To add more other pages, continue with this alternating pattern using increasing numbers, starting with 6 for the next page description. -->
<includeonly>{{Sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Disambiguation and redirection hatnote templates]]
}}</includeonly>
979c2e2e08324dcf5adc700fd845b19dfeaacf79
Module:Hatnote
828
338
1133
444
2025-08-22T01:17:45Z
Sharparam
284703
Add support for icon
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref,
icon = args.icon
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
if options.icon then
s = "[[File:" .. options.icon .. "|x22px]]<nowiki> </nowiki>" .. s
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p
d64ac2e25fd54ca6e166cec9072b7aa98428e6a6
Module:About/doc
828
736
1134
2025-08-22T01:21:54Z
Sharparam
284703
Created page with "<!-- Please place categories where indicated at the bottom of this page --> This module implements the {{tl|about}} [[wikipedia:Wikipedia:Hatnote|hatnote]] template. == Usage == *The <code>about</code> function implements the {{tl|about}} template directly, using the frame and applying no options. This should probably only be used in {{tl|about}}. *The <code>_about</code> function can be used from Lua to supply a custom arguments list (its first argument) and/or an opt..."
wikitext
text/x-wiki
<!-- Please place categories where indicated at the bottom of this page -->
This module implements the {{tl|about}} [[wikipedia:Wikipedia:Hatnote|hatnote]] template.
== Usage ==
*The <code>about</code> function implements the {{tl|about}} template directly, using the frame and applying no options. This should probably only be used in {{tl|about}}.
*The <code>_about</code> function can be used from Lua to supply a custom arguments list (its first argument) and/or an options table (its second argument). Options include:
**<code>aboutForm</code> A string that can be used to substitute the form of the initial "about" message. It should include two substitution points: the first for the page type (e.g. "article"), and the second for the description of what the page is about. It should also include a trailing space for easy concatenation or omission. Defaults to <code>'This %s is about %s. '</code>.
**<code>sectionString</code> Gives the page type string for when the named argument <code>section</code> is specified. Defaults to <code>'section'</code>.
== Examples ==
* {{#invoke:about|about|disambiguation}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Hatnote modules]]
}}</includeonly>
ad89dfe0b6218335ce723e879ab0c16dedb02eb3
Module:About
828
339
1135
446
2025-08-22T01:23:37Z
Sharparam
284703
Set an icon
Scribunto
text/plain
local mArguments --initialize lazily
local mHatnote = require('Module:Hatnote')
local mHatList = require('Module:Hatnote list')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
function p.about (frame)
-- A passthrough that gets args from the frame and all
mArguments = require('Module:Arguments')
args = mArguments.getArgs(frame)
return p._about(args)
end
function p._about (args, options)
-- Produces "about" hatnote.
-- Type checks and defaults
checkType('_about', 1, args, 'table', true)
args = args or {}
checkType('_about', 2, options, 'table', true)
options = options or {}
local defaultOptions = {
aboutForm = 'This %s is about %s. ',
PageType = require('Module:Pagetype').main(),
otherText = nil, --included for complete list
sectionString = 'section'
}
for k, v in pairs(defaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Set initial "about" string
local pageType = (args.section and options.sectionString) or options.PageType
local about = ''
if args[1] then
about = string.format(options.aboutForm, pageType, args[1])
end
--Allow passing through certain options
local fsOptions = {
otherText = options.otherText,
extratext = args.text
}
local hnOptions = {
selfref = args.selfref
}
if not args.noicon then hnOptions.icon = args.icon or "Disambig.svg" end
-- Set for-see list
local forSee = mHatList._forSee(args, 2, fsOptions)
-- Concatenate and return
return mHatnote._hatnote(about .. forSee, hnOptions)
end
return p
acef7e76987e5cbb64cae252e876f16e8b980a9a
Module:Hatnote
828
338
1136
1133
2025-08-22T01:25:40Z
Sharparam
284703
Use nbsp instead of nowiki tag
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref,
icon = args.icon
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
if options.icon then
s = "[[File:" .. options.icon .. "|x22px]] " .. s
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p
091300bfb29ce9b01a1d4dc1da72ab20f2626119
File:OrientalSpin.png
6
737
1137
2025-08-22T01:28:42Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_OrientalSpin
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_OrientalSpin
}}
== Licensing ==
{{License|game}}
d8bfd3f92a2c9aea494cf47fe9c8809e50bca9a6
File:OrientalDash.png
6
738
1138
2025-08-22T01:29:29Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_OrientalDash
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_OrientalDash
}}
== Licensing ==
{{License|game}}
b923ea1591e8c5bfa6d06623e2d555c4ae527c36
File:Divine Blessing.png
6
739
1139
2025-08-22T01:30:11Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_DivineBlessing
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_DivineBlessing
}}
== Licensing ==
{{License|game}}
eef9d3c7cbbdc0f9694687aa8f9380456c9dedeb
File:Site-favicon.ico
6
283
1140
308
2025-08-22T01:32:14Z
Sharparam
284703
Changed protection settings for "[[File:Site-favicon.ico]]": Favicon used for the entire site ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite))
wikitext
text/x-wiki
== Licensing ==
{{License|game}}
5fdc0517c60eec1aa02a1fef9763fa88c38be9ad
User:Sharparam/common.js
2
740
1141
2025-08-22T01:36:53Z
Sharparam
284703
Created page with "mw.loader.load( '//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js/load.js&action=raw&ctype=text/javascript' ); // Backlink: [[en:User:Joeytje50/JWB.js/load.js]]"
javascript
text/javascript
mw.loader.load( '//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js/load.js&action=raw&ctype=text/javascript' ); // Backlink: [[en:User:Joeytje50/JWB.js/load.js]]
ac852b5cb6bbc8c580ce7702ab0c747386409016
Blok 6174
0
741
1143
1142
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Blok 6147]]
3ee370bab2292ee469f53ad5d06af212bbb3db85
Captain Yulia
0
742
1145
1144
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Royal Division Captain Yulia]]
944a6e86bec704d704b6109fc690822aa40d60b9
Dual Wield Mastery
0
743
1147
1146
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
[[File:Dual_Wield_Mastery.png|thumb]]
'''{{PAGENAME}}''' is a [[perk]] in {{BFF}}. It improves proficiency with [[dual wield]] [[weapons]].
== Effect ==
Offhand weapons now deal 60% of their damage instead of 35%.
== Upgrades ==
* Critical Chance increases by 1% with each combo point while dual wielding.
* While dual wielding, you do not consume any stamina for melee attacks if at 15 or above combo points.
{{Navbox/Perks}}
[[Category:Perks]]
78e20c9ebd95bf46994bc694995631a11d79d8b6
Improved Diver's Lungs Concoction
0
744
1149
1148
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
== Recipe ==
Obtained by defeating the many-legged creature in [[Deluge]].
a1b23855f2d6d50d291ff7ec5da567ce7c83641d
Librarian
0
745
1151
1150
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''Librarian''' may refer to:
== Common meanings ==
* [[Librarian (armor set)]], a light armor set
* [[Librarian (enemy)]], the enemy in the [[Monastery]]
== See also ==
* [[Librarian Hood]]
* [[Librarian Overcoat]]
* [[Librarian Trousers]]
{{Disambiguation}}
c7eb5b123cb7063d1af9038ba92b3013df3b5b50
Perk
0
746
1153
1152
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Perks]]
22eac196aff02ba31a4bced80e80fcfdc8051202
Perks
0
747
1155
1154
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
'''{{PAGENAME}}''' are powerful passive upgrades in {{BFF}}. The player can have up to four active perks at one time.
{{Navbox/Perks}}
26af41c73ec1c4e20599336d60d88a8378c8c6ab
1180
1155
2025-08-22T09:24:46Z
Sharparam
284703
Add category
wikitext
text/x-wiki
'''{{PAGENAME}}''' are powerful passive upgrades in {{BFF}}. The player can have up to four active perks at one time.
{{Navbox/Perks}}
[[Category:Perks]]
d2a40a35f7371d4439016c2e06a6a0ad6ee3d71e
Ring of Serpent
0
748
1157
1156
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Ring
| image = Ring of Serpent.png
| title = {{PAGENAME}}
| Passives = [[Swift Reflexes]]
| Effect1 = +2 [[Agility]]
}}
== Location ==
Near one of the underwater red lights in [[Deluge]].
{{Navbox/Rings}}
66cfb985c30744dba393ecfef89461918d2773f8
Saracen Shield
0
749
1159
1158
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Saracen Shield.png
| Weight = Heavy
| Abilities = [[Regal Radiance]]
| Mk2_Sharp = 59.5
| Mk2_Blunt = 57.4
| Mk2_Technomancy = 69.3
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== Location ==
{{cords|3760|1142|-1395}}
Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield.
{{Navbox/Shields}}
59fda45f4bdf41eba1f4a2bcf8c2764d16851685
Spiked Shield
0
750
1161
1160
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Spiked Shield.png
| Weight = Heavy
| Passives = [[Spikes]]
| Mk0_Sharp = 48.6
| Mk0_Blunt = 54.6
| Mk0_Technomancy = 49.8
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== Acquisition ==
Dropped by [[Plagued Warden]].
{{Navbox/Shields}}
35d72a537a85e4efbf9cffb04c27d03f7ce129cf
Tall Military Shield
0
751
1163
1162
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Shield
| image = Tall Military Shield.png
| title = {{PAGENAME}}
| Weight = Heavy
| Abilities = [[Improvised Fortification]]
| Mk2_Sharp = 59.5
| Mk2_Blunt = 66.5
| Mk2_Technomancy = 52.5
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] that can be equipped by the player. It is the tall version of [[Military Shield|the Military Shield]].
== Location ==
{{coords|-4043|1327|1056}}
Found in [[Asylum]]. After climbing a set of stars inside the first building after the courtyard, the item is at the top on one of the catwalks.
{{Navbox/Shields}}
181aab1accc7978058774e9cab9eea6c94c3154c
Tech Shield
0
752
1165
1164
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Tech Shield.png
| Weight = Heavy
| Abilities = [[Refraction]]
| Mk2_Sharp = 42.7
| Mk2_Blunt = 47.6
| Mk2_Technomancy = 70
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== Location ==
{{coords|1327|-9333|1892}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After reaching the outdoors area, head up the stairs and take the left path. At the end is a cliff, climb it by standing near it and repeatedly tapping the jump button. Once on top of the cliff, go to the right and you'll see the corpse with the item against a cliff wall.
On the same corpse can also be found the [[Ring of Rammstein]].
{{Navbox/Shields}}
1e64b4aa14aac12ca5c32867c37f664acb36dedf
Vermillion Mirage
0
753
1167
1166
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Royal Division Captain Yulia & Vermillion Mirage]]
a706f52584d29641b5b3d4ebd9403828f396a0e3
Wooden Shield
0
754
1169
1168
2025-08-22T09:16:38Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{Infobox/Shield
| image = Wooden Shield.png
| title = {{PAGENAME}}
| Weight = Light
| Mk0_Sharp = 52.8
| Mk0_Blunt = 46.8
| Mk0_Technomancy = 7.2
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
{{Navbox/Shields}}
a25cde7cfde39f917e98c499b4c23d236886a94f
File:Wooden Shield.png
6
755
1170
2025-08-22T09:17:39Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_WoodenShield
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_WoodenShield
}}
== Licensing ==
{{License|game}}
65508572de4edc9222f8c1c667c5020f6d0fddc4
File:Tech Shield.png
6
756
1171
2025-08-22T09:18:33Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TechShield
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TechShield
}}
== Licensing ==
{{License|game}}
53a27f76eadb3cf7a3d774086d9e55de6edb33b1
File:Tall Military Shield.png
6
757
1172
2025-08-22T09:19:10Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TallMilitaryShield
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TallMilitaryShield
}}
== Licensing ==
{{License|game}}
df5b45ff8cfd7e7372508c13ab75e10f21dc3420
File:Spiked Shield.png
6
758
1173
2025-08-22T09:19:50Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/icon_spikedshield
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/icon_spikedshield
}}
== Licensing ==
{{License|game}}
50d0b50e059bfba7957bc670777b1cb0c168a443
File:Saracen Shield.png
6
759
1174
2025-08-22T09:20:25Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_SaracenShield
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_SaracenShield
}}
== Licensing ==
{{License|game}}
c19959878faaa9e9fa1530b62b6ea1806329b9b1
Template:Navbox/Rings
10
292
1175
376
2025-08-22T09:20:56Z
Sharparam
284703
Add [[Ring of Serpent]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Burning Desire]]
* [[Ring of Casting Speed]]
* [[Ring of Hawk]]
* [[Ring of Rammstein]]
* [[Ring of Serpent]]
* [[Ring of Lesser Talent]]
* [[Ring of Talent]]
* [[Ring of Exceeding Talent]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
1bf7926b4eef3b181e1771fd1c0e79707833bf81
Template:Navbox/Perks
10
760
1176
2025-08-22T09:21:40Z
Sharparam
284703
Created page with "{{Navbox | template = Navbox/Perks | title = [[Perks]] | list1 = * [[Archery Mastery]] * [[Berserker]] * [[Combo Brutality]] * [[Companions]] * [[Debuff Mastery]] * [[Dual Wield Mastery]] * [[Duellist]] * [[Faithful]] * [[Illusionist]] * [[Impenetrable Fortress]] * [[Mindbreaker]] * [[Natural Talent]] * [[Shield Mastery]] * [[Technomancer]] * [[Tinkerer Mastery]] * [[Vampirism]] * [[Vindicator]] * [[Zealot]] }}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Perks
| title = [[Perks]]
| list1 =
* [[Archery Mastery]]
* [[Berserker]]
* [[Combo Brutality]]
* [[Companions]]
* [[Debuff Mastery]]
* [[Dual Wield Mastery]]
* [[Duellist]]
* [[Faithful]]
* [[Illusionist]]
* [[Impenetrable Fortress]]
* [[Mindbreaker]]
* [[Natural Talent]]
* [[Shield Mastery]]
* [[Technomancer]]
* [[Tinkerer Mastery]]
* [[Vampirism]]
* [[Vindicator]]
* [[Zealot]]
}}<noinclude>{{Documentation}}</noinclude>
abe876ef8a1c6f16d735fa1468f3cc9921221f03
Template:Navbox/Perks/doc
10
761
1177
2025-08-22T09:22:09Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
87827f6829955b934e0e8073491c0fef23954bf8
File:Dual Wield Mastery.png
6
762
1178
2025-08-22T09:24:06Z
Sharparam
284703
{{Game image
| path = Game/Textures/Perks/Icons/Dual
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Perks/Icons/Dual
}}
== Licensing ==
{{License|game}}
c570af8c6721a2242f2b71c9db9950d9ee24c748
Category:Perks
14
763
1179
2025-08-22T09:24:30Z
Sharparam
284703
Created page with "[[Perks]] in {{BFF}}."
wikitext
text/x-wiki
[[Perks]] in {{BFF}}.
3f01150d30482ed76f3efc2cc207ab62eefb4b45
Template:Disambiguation (wiki.gg)
10
105
1181
127
2025-08-22T09:27:21Z
Sharparam
284703
Sharparam renamed page [[Template:Disambiguation]] to [[Template:Disambiguation (wiki.gg)]] without leaving a redirect: Switching to a version more similar to WP's Disambiguation template
wikitext
text/x-wiki
<includeonly><!--
-->{{#vardefine:topic|<!-- start vd
-->{{#if:{{{topic|}}} | {{{topic}}} | {{PAGENAME}} }}<!-- end if
-->}}<!-- end vd
-->{{#vardefine:disambig|<!-- start vd
-->{{#if:{{{1|}}}<!-- start custom disambig if
-->|{{{1}}}<!-- start label if -->{{#if:{{{2|}}} | {{!}}{{{2}}} }}<!-- end label if
-->|{{#var:topic}} (disambiguation)<!-- else; use regular disambig
-->}}<!-- end custom disambig if
-->}}<!-- end vd
-->{{Hatnote|<!--
-->This page is about '''{{#var:topic}}'''. For other uses, see [[{{#var:disambig}}]].<!--
-->|icon=Disambig.svg<!--
-->}}<!--
--></includeonly><!--
--><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude>
c4c62e7a1876492eb970ea182cf4ac0bcad97913
Template:Disambiguation (wiki.gg)/doc
10
104
1182
126
2025-08-22T09:27:21Z
Sharparam
284703
Sharparam renamed page [[Template:Disambiguation/doc]] to [[Template:Disambiguation (wiki.gg)/doc]] without leaving a redirect: Switching to a version more similar to WP's Disambiguation template
wikitext
text/x-wiki
<templatedata>
{
"params": {
"1": {
"label": "Disambiguation Page",
"description": "A custom disambiguation page name.",
"example": "Disambiguation Page",
"type": "wiki-page-name"
},
"2": {
"label": "Link Label",
"description": "A label for the custom disambiguation page.",
"example": "Alternative Page Name",
"type": "line"
},
"topic": {
"label": "Custom Topic",
"description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic",
"example": "a custom topic",
"default": "{{PAGENAME}}",
"type": "line"
}
},
"description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.",
"paramOrder": [
"1",
"2",
"topic"
],
"format": "inline"
}
</templatedata>
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Disambiguation}}</nowiki></code> || {{Disambiguation|topic=Example}}
|-
| <code><nowiki>{{Disambiguation|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation|Special:Random|topic=Example}}
|-
| <code><nowiki>{{Disambiguation|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation|Special:Random|Page Label|topic=this particular topic}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The {{tl|Hatnote}} base template.
* The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]].
== Source ==
Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]].
<noinclude>[[Category:Template documentation]]</noinclude>
5fce9c689120c57454571ff0e60a2cd447df5713
1185
1182
2025-08-22T09:30:40Z
Sharparam
284703
Fix examples
wikitext
text/x-wiki
<templatedata>
{
"params": {
"1": {
"label": "Disambiguation Page",
"description": "A custom disambiguation page name.",
"example": "Disambiguation Page",
"type": "wiki-page-name"
},
"2": {
"label": "Link Label",
"description": "A label for the custom disambiguation page.",
"example": "Alternative Page Name",
"type": "line"
},
"topic": {
"label": "Custom Topic",
"description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic",
"example": "a custom topic",
"default": "{{PAGENAME}}",
"type": "line"
}
},
"description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.",
"paramOrder": [
"1",
"2",
"topic"
],
"format": "inline"
}
</templatedata>
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Disambiguation (wiki.gg}}</nowiki></code> || {{Disambiguation (wiki.gg)|topic=Example}}
|-
| <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|topic=Example}}
|-
| <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The {{tl|Hatnote}} base template.
* The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]].
== Source ==
Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]].
<noinclude>[[Category:Template documentation]]</noinclude>
66a58f9b7bd1fcafab8c196a7f377e84c344bd01
1186
1185
2025-08-22T09:30:59Z
Sharparam
284703
/* Examples */ Fix missing paren in example
wikitext
text/x-wiki
<templatedata>
{
"params": {
"1": {
"label": "Disambiguation Page",
"description": "A custom disambiguation page name.",
"example": "Disambiguation Page",
"type": "wiki-page-name"
},
"2": {
"label": "Link Label",
"description": "A label for the custom disambiguation page.",
"example": "Alternative Page Name",
"type": "line"
},
"topic": {
"label": "Custom Topic",
"description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic",
"example": "a custom topic",
"default": "{{PAGENAME}}",
"type": "line"
}
},
"description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.",
"paramOrder": [
"1",
"2",
"topic"
],
"format": "inline"
}
</templatedata>
== Examples ==
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{Disambiguation (wiki.gg)}}</nowiki></code> || {{Disambiguation (wiki.gg)|topic=Example}}
|-
| <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|topic=Example}}
|-
| <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}}
|}
== Dependencies ==
For this template to work properly, you need the following:
* The {{tl|Hatnote}} base template.
* The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]].
== Source ==
Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]].
<noinclude>[[Category:Template documentation]]</noinclude>
b603298f6af054c214e7459e026fa92f9ff23fc2
Template:Disambiguation
10
764
1183
2025-08-22T09:27:49Z
Sharparam
284703
Heavily simplified form of [[wikipedia:Template:Disambiguation]]
wikitext
text/x-wiki
<includeonly>{{#if:{{NAMESPACE}}||[[Category:Disambiguation pages]]}}</includeonly><noinclude>{{Documentation}}</noinclude>
f54474067961aa4345e7a2b4d76d7bf1334f39f9
1188
1183
2025-08-22T09:36:31Z
Sharparam
284703
Add disambiguation magic word
wikitext
text/x-wiki
<includeonly>
{{#if:{{NAMESPACE}}|
|__DISAMBIG__ [[Category:Disambiguation pages]]
}}
</includeonly><noinclude>{{Documentation}}</noinclude>
e47f8fb1d8dcf2b726b5a0246e8a356dad403d06
Template:Disambiguation/doc
10
765
1184
2025-08-22T09:29:42Z
Sharparam
284703
Created page with "Place at the end of disambiguation pages to put them in the proper category. == Usage == {{tl|Disambiguation}} <includeonly>{{Sandbox other||[[Category:Disambiguation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
Place at the end of disambiguation pages to put them in the proper category.
== Usage ==
{{tl|Disambiguation}}
<includeonly>{{Sandbox other||[[Category:Disambiguation templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
5c29d2096ac5de472ee1486183db375da0b06bad
Category:Disambiguation pages
14
766
1187
2025-08-22T09:33:15Z
Sharparam
284703
Created page with "Pages that serve to disambiguate topics/names that have multiple meanings. Places pages into this category by using the {{tl|Disambiguation}} template on a page. == External links == * [[:wikipedia:Category:Disambiguation pages|Disambiguation pages category]] on Wikipedia."
wikitext
text/x-wiki
Pages that serve to disambiguate topics/names that have multiple meanings. Places pages into this category by using the {{tl|Disambiguation}} template on a page.
== External links ==
* [[:wikipedia:Category:Disambiguation pages|Disambiguation pages category]] on Wikipedia.
645e1e0deadd54cd5f0aabe5da7a6a5bc838077d
Template:Infobox/Armor
10
453
1189
1069
2025-08-22T09:39:48Z
Sharparam
284703
Add special handling for librarian armor set
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Weight,Set,Passives
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| helmet = [[Helmet]]
| pauldrons = [[Pauldrons]]
| chestguard = [[Chestguard]]
| legguard = [[Legguard]]
| gauntlet = [[Gauntlet]]
| #default = {{{Type}}}
}}}}
|Set={{#if:{{{Set|}}}|{{#switch:{{lc:{{{Set}}}
| librarian = [[Librarian (armor set)|Librarian]]
| #default = [[{{{Set}}}]]
}}}}}}
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \!
| token = @@@@
| pattern = [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{{Mk0_Sharp|???}}}
|Mk0_Blunt={{{Mk0_Blunt|???}}}
|Mk0_Technomancy={{{Mk0_Technomancy|???}}}
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| helmet = [[Category:Helmets]]
| pauldrons = [[Category:Pauldrons]]
| chestguard = [[Category:Chestguards]]
| legguard = [[Category:Legguards]]
| gauntlet = [[Category:Gauntlets]]
| #default = [[Category:Armor]]
}}{{Armor/CargoStore
|name={{{title|}}}
|setname={{{Set|}}}
|type={{{Type|}}}
|weight={{{Weight|}}}
|sharpMk0={{{Mk0_Sharp|}}}
|bluntMk0={{{Mk0_Blunt|}}}
|technomancyMk0={{{Mk0_Technomancy|}}}
|sharpMk1={{{Mk1_Sharp|}}}
|bluntMk1={{{Mk1_Blunt|}}}
|technomancyMk1={{{Mk1_Technomancy|}}}
|sharpMk2={{{Mk2_Sharp|}}}
|bluntMk2={{{Mk2_Blunt|}}}
|technomancyMk2={{{Mk2_Technomancy|}}}
|sharpMk3={{{Mk3_Sharp|}}}
|bluntMk3={{{Mk3_Blunt|}}}
|technomancyMk3={{{Mk3_Technomancy|}}}
|sharpMk4={{{Mk4_Sharp|}}}
|bluntMk4={{{Mk4_Blunt|}}}
|technomancyMk4={{{Mk4_Technomancy|}}}
|sharpMk5={{{Mk5_Sharp|}}}
|bluntMk5={{{Mk5_Blunt|}}}
|technomancyMk5={{{Mk5_Technomancy|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
d407ded1b1e4484c38086c6409349aed6462786a
1190
1189
2025-08-22T09:40:40Z
Sharparam
284703
Fix misplaces braces
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Weight,Set,Passives
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| helmet = [[Helmet]]
| pauldrons = [[Pauldrons]]
| chestguard = [[Chestguard]]
| legguard = [[Legguard]]
| gauntlet = [[Gauntlet]]
| #default = {{{Type}}}
}}}}
|Set={{#if:{{{Set|}}}|{{#switch:{{lc:{{{Set}}}}}
| librarian = [[Librarian (armor set)|Librarian]]
| #default = [[{{{Set}}}]]
}}}}
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \!
| token = @@@@
| pattern = [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{{Mk0_Sharp|???}}}
|Mk0_Blunt={{{Mk0_Blunt|???}}}
|Mk0_Technomancy={{{Mk0_Technomancy|???}}}
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| helmet = [[Category:Helmets]]
| pauldrons = [[Category:Pauldrons]]
| chestguard = [[Category:Chestguards]]
| legguard = [[Category:Legguards]]
| gauntlet = [[Category:Gauntlets]]
| #default = [[Category:Armor]]
}}{{Armor/CargoStore
|name={{{title|}}}
|setname={{{Set|}}}
|type={{{Type|}}}
|weight={{{Weight|}}}
|sharpMk0={{{Mk0_Sharp|}}}
|bluntMk0={{{Mk0_Blunt|}}}
|technomancyMk0={{{Mk0_Technomancy|}}}
|sharpMk1={{{Mk1_Sharp|}}}
|bluntMk1={{{Mk1_Blunt|}}}
|technomancyMk1={{{Mk1_Technomancy|}}}
|sharpMk2={{{Mk2_Sharp|}}}
|bluntMk2={{{Mk2_Blunt|}}}
|technomancyMk2={{{Mk2_Technomancy|}}}
|sharpMk3={{{Mk3_Sharp|}}}
|bluntMk3={{{Mk3_Blunt|}}}
|technomancyMk3={{{Mk3_Technomancy|}}}
|sharpMk4={{{Mk4_Sharp|}}}
|bluntMk4={{{Mk4_Blunt|}}}
|technomancyMk4={{{Mk4_Technomancy|}}}
|sharpMk5={{{Mk5_Sharp|}}}
|bluntMk5={{{Mk5_Blunt|}}}
|technomancyMk5={{{Mk5_Technomancy|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
018b792ce369ad673cb81326c20732f36e2f4e23
Template:Infobox/Item
10
417
1191
892
2025-08-22T09:43:36Z
Sharparam
284703
Add support for materials
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind=item
| sep=,
| title={{{title|{{PAGENAME}}}}}
| image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections=DescriptionSection
| DescriptionSection=Description
| DescriptionSection_label=Description
| Description_nolabel=yes
}}{{Main other|{{#switch:{{lc:{{{type|}}}}}
| essential = [[Category:Essential items]]
| upgrade = [[Category:Upgrade items]]
| material = [[Category:Materials]]
| #default = [[Category:Items]]
}}}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]</noinclude>
b03b79686bba1206934eab541c6768639949c1cc
Gingko Leaves
0
433
1192
629
2025-08-22T09:44:04Z
Sharparam
284703
Add infobox
wikitext
text/x-wiki
{{Infobox/Item
| type = material
| image = Gingko Leaves.png
}}
'''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]].
== Acquisition ==
Drops from several enemies in the game, as well as found on the ground in certain locations.
== Locations ==
{| class="wikitable"
! Amount !! Area !! Description !! Coordinates
|-
| 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}}
|}
{{Navbox/Materials}}
[[Category:Materials]]
8533bbd6a3afd00d66170a3d89e01407aa5e92ed
1193
1192
2025-08-22T09:44:16Z
Sharparam
284703
Remove unnecessary manual category
wikitext
text/x-wiki
{{Infobox/Item
| type = material
| image = Gingko Leaves.png
}}
'''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]].
== Acquisition ==
Drops from several enemies in the game, as well as found on the ground in certain locations.
== Locations ==
{| class="wikitable"
! Amount !! Area !! Description !! Coordinates
|-
| 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}}
|}
{{Navbox/Materials}}
e55300c158c70d2316f245ac6f97b1ac0490b1bd
File:Gingko Leaves.png
6
767
1194
2025-08-22T09:46:01Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/food__95_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/food__95_
}}
== Licensing ==
{{License|game}}
bb157c358311d9b1cdc8004bfa38c9b860dfa85b
Helmets
0
768
1195
2025-08-22T09:47:41Z
Sharparam
284703
Created page with "'''Helmets''' is armor worn on the head in {{BFF}}. {{Navbox/Armor}} [[Category:Helmets]]"
wikitext
text/x-wiki
'''Helmets''' is armor worn on the head in {{BFF}}.
{{Navbox/Armor}}
[[Category:Helmets]]
eb0f2e082e86b23efbaa2d5aa01598c47acf0423
Pauldrons
0
769
1196
2025-08-22T09:48:03Z
Sharparam
284703
Created page with "'''Pauldrons''' is armor worn on the shoulders in {{BFF}}. {{Navbox/Armor}} [[Category:Pauldrons]]"
wikitext
text/x-wiki
'''Pauldrons''' is armor worn on the shoulders in {{BFF}}.
{{Navbox/Armor}}
[[Category:Pauldrons]]
5fda269f272af445bff53a01c65c204739af1494
Category:Pauldrons
14
770
1197
2025-08-22T09:48:16Z
Sharparam
284703
Created page with "[[Category:Armor]]"
wikitext
text/x-wiki
[[Category:Armor]]
8dbf198b5dcaa87a18100850cc78880444b773ad
Chestguards
0
771
1198
2025-08-22T09:48:42Z
Sharparam
284703
Created page with "'''Chestguards''' is armor worn on the chest/torso in {{BFF}}. {{Navbox/Armor}} [[Category:Armor]]"
wikitext
text/x-wiki
'''Chestguards''' is armor worn on the chest/torso in {{BFF}}.
{{Navbox/Armor}}
[[Category:Armor]]
b5d8ee02000893e7cd4da78ac4eadde3635bda6e
Chestguards
0
771
1199
1198
2025-08-22T09:48:53Z
Sharparam
284703
Fix wrong category
wikitext
text/x-wiki
'''Chestguards''' is armor worn on the chest/torso in {{BFF}}.
{{Navbox/Armor}}
[[Category:Chestguards]]
ae282ffa9370d4795c6d2f312f06ec1d23474018
Legguards
0
772
1200
2025-08-22T09:49:20Z
Sharparam
284703
Created page with "'''Legguards''' is armor worn on the legs in {{BFF}}. {{Navbox/Armor}} [[Category:Legguards]]"
wikitext
text/x-wiki
'''Legguards''' is armor worn on the legs in {{BFF}}.
{{Navbox/Armor}}
[[Category:Legguards]]
b808da558f41bba9aa569af4ea8900afd620cdcd
Gauntlets
0
773
1201
2025-08-22T09:49:44Z
Sharparam
284703
Created page with "'''Gauntlets''' is armor worn on the hands in {{BFF}}. {{Navbox/Armor}} [[Category:Gauntlets]]"
wikitext
text/x-wiki
'''Gauntlets''' is armor worn on the hands in {{BFF}}.
{{Navbox/Armor}}
[[Category:Gauntlets]]
8905bf0ba5f2a4d97cd126387f0907c9b0c14b5e
Category:Gauntlets
14
774
1202
2025-08-22T09:49:56Z
Sharparam
284703
Created page with "[[Category:Armor]]"
wikitext
text/x-wiki
[[Category:Armor]]
8dbf198b5dcaa87a18100850cc78880444b773ad
Armor sets
0
775
1203
2025-08-22T09:51:28Z
Sharparam
284703
Created page with "'''Armor sets''' are collections of armor pieces that fit together and share common names. They do not give any additional or special stats or bonuses for wearing multiple from the same set. {{Navbox/Armor}} [[Category:Armor sets]]"
wikitext
text/x-wiki
'''Armor sets''' are collections of armor pieces that fit together and share common names.
They do not give any additional or special stats or bonuses for wearing multiple from the same set.
{{Navbox/Armor}}
[[Category:Armor sets]]
8010451533ab61de5a922f98b8d3e3a1448d8263
Category:Dual Wields
14
469
1204
887
2025-08-22T09:52:32Z
Sharparam
284703
Remove unnecessary grandparent category
wikitext
text/x-wiki
[[Category:Two-handed weapons]]
797f628182636dd7d53e09a5330ca3c8e98ffe59
Template:Navbox/Consumables
10
286
1205
330
2025-08-22T09:55:57Z
Sharparam
284703
Add [[Improved Diver's Lungs Concoction]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
| group2 = Fluids
| list2 =
* [[Greater Ionization Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Regenerative Fluid]]
* [[Restorative Fluid]]
| group3 = Concoctions
| list3 =
* [[Diver's Lungs Concoction]]
* [[Improved Diver's Lungs Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Fluxshield Concoction]]
* [[Jaeger's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Dreadguard's Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Technomancer's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Forsaken Concoction]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Health Regen]]
* [[Concoction: Flux Regen]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Agility]]
* [[Concoction: Constitution]]
* [[Concoction: Intelligence]]
* [[Concoction: All Attributes]]
* [[Concoction: Zealot's Tears]]
* [[Experience Concoction]]
* [[Mystery Concoction]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
ac97c6dea70846027e525cba958dc4134b76f93e
1234
1205
2025-08-22T23:30:01Z
Sharparam
284703
Add links to fluids and concoctions
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
| group2 = [[Fluids]]
| list2 =
* [[Greater Ionization Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Regenerative Fluid]]
* [[Restorative Fluid]]
| group3 = [[Concoctions]]
| list3 =
* [[Diver's Lungs Concoction]]
* [[Improved Diver's Lungs Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Fluxshield Concoction]]
* [[Jaeger's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Dreadguard's Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Technomancer's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Forsaken Concoction]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Health Regen]]
* [[Concoction: Flux Regen]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Agility]]
* [[Concoction: Constitution]]
* [[Concoction: Intelligence]]
* [[Concoction: All Attributes]]
* [[Concoction: Zealot's Tears]]
* [[Experience Concoction]]
* [[Mystery Concoction]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
143073e2e8ef425ae4d6f6aa288ab2d4ee4c65c2
Improved Diver's Lungs Concoction
0
744
1206
1149
2025-08-22T09:56:38Z
Sharparam
284703
Add more information
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}.
== Recipe ==
Obtained by defeating the many-legged creature in [[Deluge]].
{{Navbox/Consumables}}
[[Category:Concoctions]]
6d7f860f0a4d166821ac9c9f45485fb606abbd78
1229
1206
2025-08-22T23:05:17Z
Sharparam
284703
Add infobox
wikitext
text/x-wiki
{{Infobox/Item
| image = Improved Diver's Lungs Concoction.png
| type = concoction
| Description = Increases maximum lung capacity by {{Duration|s=60|display=60 seconds}} worth of oxygen for {{Duration|s=600|display=600 seconds}}.
}}
'''{{PAGENAME}}''' is a [[Consumables|consumable]] [[Concoctions|concoction]] in {{BFF}}.
== Recipe ==
Obtained by defeating the many-legged creature in [[Deluge]].
{{Navbox/Consumables}}
125ca95a7c845f9d99dc176f7ee336c9eff24a8e
File:Eris.png
6
776
1207
2025-08-22T21:44:24Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/Icon_CrystalBall
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/Icon_CrystalBall
}}
== Licensing ==
{{License|game}}
13791c85c8308f9808f3678aec68d1b5bc0eca95
Eris
0
495
1208
755
2025-08-22T21:45:13Z
Sharparam
284703
Add trivia about internal name
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Eris.png
| Type = Helmet
| Weight = Light
| Passives = Flux Efficiency
| Mk5_Sharp = 730
| Mk5_Blunt = 730
| Mk5_Technomancy = 939
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|2860|-4261|1423}}
Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars.
== Trivia ==
* In the game files this helmet is called "Crystal Ball".
{{Navbox/Armor}}
982b1d7218dccd34133cfadfa4d01d6c42d78782
File:Crude Helmet.png
6
777
1209
2025-08-22T21:46:29Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator2
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator2
}}
== Licensing ==
{{License|game}}
7be523c7e5452991401a644cf5c2c1aeb23fd06d
Crude Helmet
0
489
1210
743
2025-08-22T21:47:01Z
Sharparam
284703
Add trivia about internal name
wikitext
text/x-wiki
{{Infobox/Armor
| image = Crude Helmet.png
| title = {{PAGENAME}}
| Type = Helmet
| Weight = Medium
| Mk2_Sharp = 516
| Mk2_Blunt = 600
| Mk2_Technomancy = 336
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}.
== Location ==
{{coords|-3538|-6027|5477}}
Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and follow the wall until you see a a corpse on a ledge holding the item.
== Trivia ==
* In the game files this helmet is called "Respirator 2".
{{Navbox/Armor}}
b994e21072eccbe0a11ea0897cfb76d018531488
File:Deserts Respirator Helmet.png
6
778
1211
2025-08-22T21:48:21Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator3
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator3
}}
== Licensing ==
{{License|game}}
943066b823dd97a699939deee1bd079a3458703f
Deserts Respirator Helmet
0
492
1212
749
2025-08-22T21:48:50Z
Sharparam
284703
Add trivia about internal name
wikitext
text/x-wiki
{{Infobox/Armor
| title = {{PAGENAME}}
| image = Deserts Respirator Helmet.png
| Type = helmet
| Weight = Medium
| Mk2_Sharp = 545
| Mk2_Blunt = 633
| Mk2_Technomancy = 336
}}
'''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}.
== Location ==
{{coords|1367|6630|-1395}}
Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]].
== Trivia ==
* In the game files this helmet is called "Respirator 3".
{{Navbox/Armor}}
1e5cfba9361c3caecb26137e38805596bed59fd6
File:Citadel Warrior.png
6
779
1213
2025-08-22T22:01:46Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:Librarian.png
6
780
1214
2025-08-22T22:22:08Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:Sentinel.png
6
781
1215
2025-08-22T22:24:24Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:Vengeance.png
6
782
1216
2025-08-22T22:25:59Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Mobius Blade
0
666
1217
1027
2025-08-22T22:30:26Z
Sharparam
284703
Add item description
wikitext
text/x-wiki
{{Infobox/Item
| type = essential
| image = Mobius Blade.png
| Description = An enigmatic relic – a shimmering blade with immense and inexplicable power that operates in ways beyond conventional comprehension. The word Mobius is inscribed in its hilt.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Overview ==
The player can use the blade to kill themselves, allowing them to respawn at the [[homunculus]] they last saved their position at (or a [[Homunculus Mirage]]).
{{Navbox/Essential items}}
afd465d1ec5470c335393e767cb4fc666b131fe2
File:Perk Essence.png
6
783
1218
2025-08-22T22:32:09Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_21
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_21
}}
== Licensing ==
{{License|game}}
2e7311f76def2a759f1e8023d70c2d23a892e4eb
File:Unstable Perk Essence.png
6
784
1219
2025-08-22T22:32:47Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_24
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_24
}}
== Licensing ==
{{License|game}}
8e91bbce8b005be8e383d57d306ccd2b46305482
File:Plagued Blood.png
6
785
1220
2025-08-22T22:34:39Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_50
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_50
}}
== Licensing ==
{{License|game}}
cec79d0946a981f402df171aee3c18f864c078ec
Anomalous Fragment
0
426
1221
615
2025-08-22T22:35:59Z
Sharparam
284703
Set type in infobox and add navbox
wikitext
text/x-wiki
{{Infobox/Item
| type = essential
| title = {{PAGENAME}}
| image = Anomalous Fragment.png
| Description = [[The Handler|Handler]] may convert it to a more useful form.
}}
'''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}.
== Acquisition ==
Drops from [[bosses]] in [[NG+]].
== Usage ==
Used to manufacture [[Greater Anomalous Crystal|Greater Anomalous Crystals]] at [[The Handler]].
{{Navbox/Essential items}}
1d2150fe8c156d69c0f502eab860d67c2c37ee99
Template:Navbox/Essential items
10
663
1222
1023
2025-08-22T22:36:27Z
Sharparam
284703
Add [[Anomalous Fragment]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Essential items
| title = [[Essential items]]
| list1 =
* [[Ability Splinter]]
* [[Anomalous Fragment]]
* [[Handler Echo]]
* [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]])
* [[Mobius Blade]]
* [[Old Key]]
* [[Perk Essence]] ([[Unstable Perk Essence|Unstable]])
* [[Plagued Blood]]
* [[Scanner]]
| group1.1 = [[Upgrade items|Upgrade]]
| list1.1 =
* [[Upgrade Splinter]]
* [[Upgrade Module]]
}}<noinclude>{{Documentation}}</noinclude>
b6acc68ad0aba7b49cdce6e0674bae9ec26fe22d
File:Anomalous Fragment.png
6
786
1223
2025-08-22T22:37:10Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_11
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_11
}}
== Licensing ==
{{License|game}}
e783567ca742b544e6f91ab052f3d7ea549145b6
Category:Concoctions
14
787
1224
2025-08-22T22:38:29Z
Sharparam
284703
Created page with "[[Category:Consumables]]"
wikitext
text/x-wiki
[[Category:Consumables]]
193ccd7fd91966b7687713ee56f8a8ec4b51e614
Category:Consumables
14
788
1225
2025-08-22T22:38:43Z
Sharparam
284703
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Template:Infobox/Item
10
417
1226
1191
2025-08-22T22:40:15Z
Sharparam
284703
Add support for consumables, fluids, and concoctions
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind=item
| sep=,
| title={{{title|{{PAGENAME}}}}}
| image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections=DescriptionSection
| DescriptionSection=Description
| DescriptionSection_label=Description
| Description_nolabel=yes
}}{{Main other|{{#switch:{{lc:{{{type|}}}}}
| essential = [[Category:Essential items]]
| upgrade = [[Category:Upgrade items]]
| material = [[Category:Materials]]
| consumable = [[Category:Consumables]]
| fluid = [[Category:Fluids]]
| concoction = [[Category:Concoctions]]
| #default = [[Category:Items]]
}}}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]</noinclude>
893d7291a9f8b061cc61e1758dcd1198d548dc65
Template:Infobox/Item/doc
10
464
1227
693
2025-08-22T22:56:16Z
Sharparam
284703
Add TemplateData
wikitext
text/x-wiki
== TemplateData ==
<templatedata>
{
"description": "Infobox used for items of various kinds that don't have a specialized infobox.",
"format": "block",
"params": {
"title": {
"label": "Title",
"description": "Title/name of the item. If not given it will use the name of the page the infobox is used on (usually results in the desired name).",
"type": "line",
"required": false,
"default": "{{PAGENAME}}",
"example": "Health Potion"
},
"image": {
"label": "Image",
"description": "Game image for the item.",
"type": "wiki-file-name",
"required": true,
"example": "Health Potion.png"
},
"type": {
"label": "Type",
"description": "Item type. Supported values are 'consumable', 'essential', 'upgrade', 'material', 'fluid', and 'concoction'. Other values or not specifying it makes the infobox fallback to treating it as a generic item. Even for generic items, it is recommended to supply this parameter and simply specify it as 'item'.",
"type": "line",
"required": false,
"suggested": true,
"default": "item",
"example": "consumable",
"suggestedvalues": [
"item",
"concoction",
"consumable",
"essential",
"fluid",
"material",
"upgrade"
]
},
"Description": {
"label": "Description",
"description": "In-game description of the item, if available. Do not use this field for your own description of an item, that belongs in the article body instead.",
"type": "string",
"required": false,
"example": "Restores a portion of your health."
}
}
}
</templatedata>
== Examples ==
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| type = consumable
| Description = This item will do something fancy when you use it!
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| type = consumable
| Description = This item will do something fancy when you use it!
}}
</syntaxhighlight>
ca8b0fcbede569135444bbac9669e398fa06f6a2
Template:Duration/doc
10
789
1228
2025-08-22T23:02:45Z
Sharparam
284703
Created page with "== Examples == * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30}}</syntaxhighlight> → {{Duration|3:30}} * <syntaxhighlight lang="wikitext" inline>{{Duration|h=1|m=2|s=3}}</syntaxhighlight> → {{Duration|h=1|m=2|s=3}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3|2|1}}</syntaxhighlight> → {{Duration|3|2|1}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30:00|display=A really long time!}}</syntaxhighlight> → {{Duration|3:30:00..."
wikitext
text/x-wiki
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Duration|3:30}}</syntaxhighlight> → {{Duration|3:30}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|h=1|m=2|s=3}}</syntaxhighlight> → {{Duration|h=1|m=2|s=3}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|3|2|1}}</syntaxhighlight> → {{Duration|3|2|1}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|3:30:00|display=A really long time!}}</syntaxhighlight> → {{Duration|3:30:00|display=A really long time!}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|PT3H30M12S}}</syntaxhighlight> → {{Duration|PT3H30M12S}}
d920850f2db2a205afa2cefb501d9231c694b609
Concoctions
0
790
1230
2025-08-22T23:07:28Z
Sharparam
284703
Created page with "'''Concoctions''' are a type of [[Consumables|consumable]] in {{BFF}}. While [[fluids]] give instant restoration or short duration buffs, concoctions tend to give buffs like stat increases for a longer period of time. {{Navbox/Consumables}} [[Category:Concoctions]]"
wikitext
text/x-wiki
'''Concoctions''' are a type of [[Consumables|consumable]] in {{BFF}}. While [[fluids]] give instant restoration or short duration buffs, concoctions tend to give buffs like stat increases for a longer period of time.
{{Navbox/Consumables}}
[[Category:Concoctions]]
4f232b80e8f16735421b1daa0047d19dfd388747
File:Improved Diver's Lungs Concoction.png
6
791
1231
2025-08-22T23:08:14Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_56
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_56
}}
== Licensing ==
{{License|game}}
b1b2ea2d8e30048616cf00a2afa76912557f63b8
Module:Duration
828
412
1232
585
2025-08-22T23:18:53Z
Sharparam
284703
Improve parsing of duration
Scribunto
text/plain
---Duration module
---@module DurationModule
---@alias p
local getArgs = require('Module:Arguments').getArgs
local ARG_OPTS = {
wrappers = {
"Template:Duration"
}
}
---@class Duration
---@field h
---@field m
---@field s
---@type Duration
local ZERO = { h = 0, m = 0, s = 0 }
---@type int[][]
local LOOKUP = {
[1] = { 0, 0, 1 },
[2] = { 0, 1, 2 },
[3] = { 1, 2, 3 }
}
local p = {}
---@param args any
---@return Duration
local function parseDuration(args)
local h = tonumber(args.h or args[1])
local m = tonumber(args.m or args[2])
local s = tonumber(args.s or args[3])
if h or m or s then
h = h or 0
m = m or 0
s = s or 0
else
local input = args[1]
if not input or input == "" then return ZERO end
local parts = {}
for part in string.gmatch(input, "%d+") do
parts[#parts + 1] = tonumber(part) or 0
end
local size = #parts
h = parts[LOOKUP[size][1]] or 0
m = parts[LOOKUP[size][2]] or 0
s = parts[LOOKUP[size][3]] or 0
end
local seconds = h * 60 * 60 + m * 60 + s
local hours = math.floor(total_seconds / 60 / 60)
seconds = seconds - hours * 60 * 60
local minutes = math.floor(total_seconds / 60)
seconds = seconds - minutes * 60
return {
h = hours,
m = minutes,
s = seconds
} --[[@as Duration]]
end
---@param duration Duration
---@return string
local function toisostring(duration)
return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s)
end
---@param duration Duration
---@return string
local function todisplaystring(duration)
if duration.h > 0 then
return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s)
end
return string.format("%02d:%02d", duration.m, duration.s)
end
---@param frame any
---@return any
function p.main(frame)
local args = getArgs(frame, ARG_OPTS)
return p._main(args, function(s) return frame:preprocess(s) end)
end
function p._main(args, preprocess)
preprocess = preprocess or function(s) return s end
local duration = parseDuration(args)
local iso = toisostring(duration)
local display
local is_custom_display = false
if args.display then
display = preprocess(args.display)
is_custom_display = true
else
display = todisplaystring(duration)
end
local elem = mw.html.create('time')
:attr('datetime', iso)
:addClass('duration')
:wikitext(display)
if is_custom_display then
elem:attr('title', todisplaystring(duration))
:addClass('dotted')
end
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles', args = { src = 'Module:Duration/styles.css' }
} .. tostring(elem)
end
return p
03ec8d76a08d2df423bef69d7af5c53b74fe7036
1233
1232
2025-08-22T23:21:26Z
Sharparam
284703
Fix typo
Scribunto
text/plain
---Duration module
---@module DurationModule
---@alias p
local getArgs = require('Module:Arguments').getArgs
local ARG_OPTS = {
wrappers = {
"Template:Duration"
}
}
---@class Duration
---@field h
---@field m
---@field s
---@type Duration
local ZERO = { h = 0, m = 0, s = 0 }
---@type int[][]
local LOOKUP = {
[1] = { 0, 0, 1 },
[2] = { 0, 1, 2 },
[3] = { 1, 2, 3 }
}
local p = {}
---@param args any
---@return Duration
local function parseDuration(args)
local h = tonumber(args.h or args[1])
local m = tonumber(args.m or args[2])
local s = tonumber(args.s or args[3])
if h or m or s then
h = h or 0
m = m or 0
s = s or 0
else
local input = args[1]
if not input or input == "" then return ZERO end
local parts = {}
for part in string.gmatch(input, "%d+") do
parts[#parts + 1] = tonumber(part) or 0
end
local size = #parts
h = parts[LOOKUP[size][1]] or 0
m = parts[LOOKUP[size][2]] or 0
s = parts[LOOKUP[size][3]] or 0
end
local seconds = h * 60 * 60 + m * 60 + s
local hours = math.floor(seconds / 60 / 60)
seconds = seconds - hours * 60 * 60
local minutes = math.floor(seconds / 60)
seconds = seconds - minutes * 60
return {
h = hours,
m = minutes,
s = seconds
} --[[@as Duration]]
end
---@param duration Duration
---@return string
local function toisostring(duration)
return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s)
end
---@param duration Duration
---@return string
local function todisplaystring(duration)
if duration.h > 0 then
return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s)
end
return string.format("%02d:%02d", duration.m, duration.s)
end
---@param frame any
---@return any
function p.main(frame)
local args = getArgs(frame, ARG_OPTS)
return p._main(args, function(s) return frame:preprocess(s) end)
end
function p._main(args, preprocess)
preprocess = preprocess or function(s) return s end
local duration = parseDuration(args)
local iso = toisostring(duration)
local display
local is_custom_display = false
if args.display then
display = preprocess(args.display)
is_custom_display = true
else
display = todisplaystring(duration)
end
local elem = mw.html.create('time')
:attr('datetime', iso)
:addClass('duration')
:wikitext(display)
if is_custom_display then
elem:attr('title', todisplaystring(duration))
:addClass('dotted')
end
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles', args = { src = 'Module:Duration/styles.css' }
} .. tostring(elem)
end
return p
1e05aa6ebf1e3a52baee275fe149a5e5b80d51c5
Fluids
0
792
1235
2025-08-22T23:31:32Z
Sharparam
284703
Created page with "'''Fluids''' are a type of [[Consumables|consumable]] in {{BFF}}. They typically give instant restoration of resources like [[health]] and [[flux]], or a short buff that restores it over time, unlike [[concoctions]] that tend to give longer buffs to stats. {{Navbox/Consumables}}"
wikitext
text/x-wiki
'''Fluids''' are a type of [[Consumables|consumable]] in {{BFF}}. They typically give instant restoration of resources like [[health]] and [[flux]], or a short buff that restores it over time, unlike [[concoctions]] that tend to give longer buffs to stats.
{{Navbox/Consumables}}
f032454331c9c43545909d07ee277b137f8372e1
1236
1235
2025-08-22T23:31:42Z
Sharparam
284703
Add category
wikitext
text/x-wiki
'''Fluids''' are a type of [[Consumables|consumable]] in {{BFF}}. They typically give instant restoration of resources like [[health]] and [[flux]], or a short buff that restores it over time, unlike [[concoctions]] that tend to give longer buffs to stats.
{{Navbox/Consumables}}
[[Category:Fluids]]
88b1f660d7f977146d02c2dc2713d8f2d220f19f
Category:Fluids
14
793
1237
2025-08-22T23:31:56Z
Sharparam
284703
Created page with "[[Category:Consumables]]"
wikitext
text/x-wiki
[[Category:Consumables]]
193ccd7fd91966b7687713ee56f8a8ec4b51e614
Materials
0
431
1238
625
2025-08-22T23:36:27Z
Sharparam
284703
Add acquisition notes
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items.
== Acquisition ==
Materials are dropped by enemies or found on the ground. [[Essence|Essences]] can also be extracted from [[Anomalous Crystals]], although it requires destroying the crystal.
{{Navbox/Materials}}
54925fc2f73f55d978246de626db57b71ee98da4
1243
1238
2025-08-22T23:46:12Z
Sharparam
284703
Add info on UI quirks
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items.
== Overview ==
After collecting more than 999 of a material, the inventory will simply show the count as "999+". To see the actual amount of the material, go to the crafting tab and look at an item that uses it in its recipe.
== Acquisition ==
Materials are dropped by enemies or found on the ground. [[Essence|Essences]] can also be extracted from [[Anomalous Crystals]], although it requires destroying the crystal.
{{Navbox/Materials}}
16c03274cbdefa879852d2add32a15681dc36535
Essence
0
794
1239
2025-08-22T23:40:05Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Essence.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. == Acquisition == Can be extracted from [[Anomalous crystals]], destroying the crystal in the process. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Essence.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
== Acquisition ==
Can be extracted from [[Anomalous crystals]], destroying the crystal in the process.
{{Navbox/Materials}}
89adde888d87bb8704953166b5a42b3da2da95c5
File:Essence.png
6
795
1240
2025-08-22T23:40:45Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/lantern__10_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/lantern__10_
}}
== Licensing ==
{{License|game}}
1822b1d8229259ef1d6c5275b994fad589558960
Sludge
0
796
1241
2025-08-22T23:43:52Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Sludge.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. == Acquisition == Dropped by enemies and found on the ground in certain locations. Compared to other materials, sludge is very plentiful and a player is likely to have thousands of it while only having dozens or hundreds of other materials. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Sludge.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
== Acquisition ==
Dropped by enemies and found on the ground in certain locations.
Compared to other materials, sludge is very plentiful and a player is likely to have thousands of it while only having dozens or hundreds of other materials.
{{Navbox/Materials}}
db6f64f0e318a3fef7e2730138aac402316df24c
File:Sludge.png
6
797
1242
2025-08-22T23:44:24Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/goldpile__3_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/goldpile__3_
}}
== Licensing ==
{{License|game}}
9ea5dcd2eae75a87ae6111f20d1f12be6504c498
Fractal Fungus
0
798
1244
2025-08-23T00:38:08Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Fractal Fungus.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Fractal Fungus.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
{{Navbox/Materials}}
605f3cf626e7517db3043a7f06c86c76de08e1f9
Gravicle Dust
0
799
1245
2025-08-23T00:38:27Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Gravicle Dust.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Gravicle Dust.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
{{Navbox/Materials}}
860212f45dfe29e748e9794188e92c013a052bdd
Machinite
0
800
1246
2025-08-23T00:38:38Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Machinite.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Machinite.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
{{Navbox/Materials}}
e1d39616d0055f9ba158fb4e237c2c665ae90cc6
Neurilium
0
801
1247
2025-08-23T00:38:54Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Neurilium.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Neurilium.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
{{Navbox/Materials}}
e2a91027e9404b8aef5aae8792babcd1c717437c
Rustvine
0
802
1248
2025-08-23T00:39:05Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Rustvine.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Rustvine.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
{{Navbox/Materials}}
e4bb7f054f0694d1bd88a934d6eab29383826649
Spectral Ash
0
803
1249
2025-08-23T00:39:15Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Spectral Ash.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Spectral Ash.png
| type = material
}}
'''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}.
{{Navbox/Materials}}
79ee0d1ee2797a3b441ed037f13a4850be4c42e0
File:Gravicle Dust.png
6
804
1250
2025-08-23T00:40:32Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ingredient__20_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ingredient__20_
}}
== Licensing ==
{{License|game}}
d1957f752190c71a990c31b1cd3d067caddef177
File:Machinite.png
6
805
1251
2025-08-23T00:41:34Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ore__15_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ore__15_
}}
== Licensing ==
{{License|game}}
c2c900b1ef60bea290f7405aefd7e3bb314ca512
File:Neurilium.png
6
806
1252
2025-08-23T00:42:04Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ingredient__193_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ingredient__193_
}}
== Licensing ==
{{License|game}}
37cc40dd2d2e96e3ec7f3366ec45bc45962f3ac9
File:Rustvine.png
6
807
1253
2025-08-23T00:42:31Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/food__99_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/food__99_
}}
== Licensing ==
{{License|game}}
a36bbaaa71585eaf4240caf83773d35bc7a59887
File:Spectral Ash.png
6
808
1254
2025-08-23T00:43:02Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ingredient__74_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ingredient__74_
}}
== Licensing ==
{{License|game}}
59d0e0e8fc788687ecc5e368dd6640fe050d0685
File:Fractal Fungus.png
6
809
1255
2025-08-23T00:43:29Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ingredient__4_
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ingredient__4_
}}
== Licensing ==
{{License|game}}
a5301c278a338e04b74203c2b2d0448ab3e8c3f0
Template:Navbox/Consumables
10
286
1256
1234
2025-08-23T00:52:44Z
Sharparam
284703
Add more consumables
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Asylum Brew]]
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
* [[Piercing Arrow Pack]]
| group2 = [[Fluids]]
| list2 =
* [[Greater Ionization Fluid]]
* [[Greater Regenerative Fluid]]
* [[Greater Restorative Fluid]]
* [[Ionization Fluid]]
* [[Lesser Ionization Fluid]]
* [[Lesser Restorative Fluid]]
* [[Mystery Concoction]]
* [[Regenerative Fluid]]
* [[Restorative Fluid]]
| group3 = [[Concoctions]]
| list3 =
* [[Diver's Lungs Concoction]]
* [[Dreadguard's Concoction]]
* [[Experience Concoction]]
* [[Fluxshield Concoction]]
* [[Forsaken Concoction]]
* [[Greater Dreadguard's Concoction]]
* [[Greater Jaeger's Concoction]]
* [[Greater Technomancer's Concoction]]
* [[Improved Diver's Lungs Concoction]]
* [[Indestructible Concoction]]
* [[Jaeger's Concoction]]
* [[Mystery Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Technomancer's Concoction]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Agility]]
* [[Concoction: All Attributes]]
* [[Concoction: Berserker's Tenacity]]
* [[Concoction: Constitution]]
* [[Concoction: Flux Regen]]
* [[Concoction: Health Regen]]
* [[Concoction: Intelligence]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Powerful Immune System]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Zealot's Tears]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
0cf54c50606d4658229eeca534b614c602feb4ac
Template:Navbox/Items
10
285
1257
1025
2025-08-23T00:54:59Z
Sharparam
284703
Add ammunition
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Items
| title = [[Items]]
| group1 = [[Essential items|Essential]]
| list1 = {{Navbox/Essential items|child}}
| group2 = [[Ammunition]]
| list2 = {{Navbox/Ammunition|child}}
| group3 = [[Anomalous crystals]]
| list3 = {{Navbox/Anomalous crystals|child}}
| group4 = [[Consumables]]
| list4 = {{Navbox/Consumables|child}}
| group5 = [[Equipment]]
| list5 = {{Navbox/Equipment|child}}
| group6 = [[Materials]]
| list6 = {{Navbox/Materials|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
5153392b72f92ebc1a99e6f1772e7a128a25784e
Template:Navbox/Ammunition
10
810
1258
2025-08-23T00:57:06Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | template = Navbox/Ammunition | title = [[Ammunition]] | list1 = * [[Metal Arrows]] * [[Piercing Arrow]] * [[Shock Arrows]] }}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Ammunition
| title = [[Ammunition]]
| list1 =
* [[Metal Arrows]]
* [[Piercing Arrow]]
* [[Shock Arrows]]
}}<noinclude>{{Documentation}}</noinclude>
f87d2ad23704598b8ed6727d82e1a6f74f671cf4
Template:Navbox/Ammunition/doc
10
811
1259
2025-08-23T00:57:40Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
a072d936de3f697ea20b212186fc4bf85674e635
Template:Navbox
10
45
1260
53
2025-08-23T00:59:19Z
Sharparam
284703
Protected "[[Template:Navbox]]": Widely transcluded: Basic template used by all navbox templates. Edit the relevant specific navbox template instead. (Also, this simply calls the Lua module so there's little reason to edit this basic template.) ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
<includeonly>{{#invoke:Navbox|main}}</includeonly><noinclude>[[Category:Navigation templates]] {{documentation}}</noinclude>
11355a4514de8aa6c0ae686240591d267101c58c
Template:Navbox/Essential items
10
663
1261
1222
2025-08-23T01:00:26Z
Sharparam
284703
Add [[Broken Arrow]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Essential items
| title = [[Essential items]]
| list1 =
* [[Ability Splinter]]
* [[Anomalous Fragment]]
* [[Broken Arrow]]
* [[Handler Echo]]
* [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]])
* [[Mobius Blade]]
* [[Old Key]]
* [[Perk Essence]] ([[Unstable Perk Essence|Unstable]])
* [[Plagued Blood]]
* [[Scanner]]
| group1.1 = [[Upgrade items|Upgrade]]
| list1.1 =
* [[Upgrade Splinter]]
* [[Upgrade Module]]
}}<noinclude>{{Documentation}}</noinclude>
a0b32a5211b92c2883d548badf73e8b9a242bd79
Broken Arrow
0
812
1262
2025-08-23T01:02:40Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Broken Arrow.png | type = essential | Description = An even more common kind of arrow – a broken one. }} '''{{PAGENAME}}''' is an [[Items|item]] in {{BFF}}. Its only purpose is to be crafted into [[Metal Arrows]], at a rate of three broken arrows for one metal arrow. {{Navbox/Essential items}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Broken Arrow.png
| type = essential
| Description = An even more common kind of arrow – a broken one.
}}
'''{{PAGENAME}}''' is an [[Items|item]] in {{BFF}}. Its only purpose is to be crafted into [[Metal Arrows]], at a rate of three broken arrows for one metal arrow.
{{Navbox/Essential items}}
e31b3d8e33a64fbf4ee756f13613a02441313b11
File:Broken Arrow.png
6
813
1263
2025-08-23T01:03:05Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/BrokenArrow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/BrokenArrow
}}
== Licensing ==
{{License|game}}
2d63b0638f2ac03b835bb73d15bc884a05b8a2d5
Ammunition
0
814
1264
2025-08-23T01:04:47Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' are items that can be show with [[longbows]]. {{Navbox/Ammunition}} [[Category:Ammunition]]"
wikitext
text/x-wiki
'''{{PAGENAME}}''' are items that can be show with [[longbows]].
{{Navbox/Ammunition}}
[[Category:Ammunition]]
bcca4dcdcefb3efa4007fae163ea1d5dcf5596dc
Category:Ammunition
14
815
1265
2025-08-23T01:04:58Z
Sharparam
284703
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Metal Arrows
0
816
1266
2025-08-23T01:06:39Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Metal Arrows.png | type = ammunition | Description = A common and replaceable projectile. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Metal Arrows.png
| type = ammunition
| Description = A common and replaceable projectile.
}}
'''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}.
{{Navbox/Ammunition}}
cbe6a8a057aa88f1bce95efa8dd6063b69c77e33
1272
1266
2025-08-23T01:14:18Z
Sharparam
284703
Add navbox for longbows
wikitext
text/x-wiki
{{Infobox/Item
| image = Metal Arrows.png
| type = ammunition
| Description = A common and replaceable projectile.
}}
'''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}.
{{Navbox/Ammunition}}
{{Navbox/Longbows|state=collapsed}}
3c57de54bbddc8e4e2c1313ff2f80c6ed10435f3
File:Metal Arrows.png
6
817
1267
2025-08-23T01:07:03Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/Basicarrow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/Basicarrow
}}
== Licensing ==
{{License|game}}
2280dbdb249a77507d41195c58c5bb0d58a94202
Template:Infobox/Item
10
417
1268
1226
2025-08-23T01:07:47Z
Sharparam
284703
Add support for [[Ammunition]]
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind=item
| sep=,
| title={{{title|{{PAGENAME}}}}}
| image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections=DescriptionSection
| DescriptionSection=Description
| DescriptionSection_label=Description
| Description_nolabel=yes
}}{{Main other|{{#switch:{{lc:{{{type|}}}}}
| ammo
| ammunition = [[Category:Ammunition]]
| essential = [[Category:Essential items]]
| upgrade = [[Category:Upgrade items]]
| material = [[Category:Materials]]
| consumable = [[Category:Consumables]]
| fluid = [[Category:Fluids]]
| concoction = [[Category:Concoctions]]
| #default = [[Category:Items]]
}}}}</includeonly><noinclude>
{{Documentation}}
[[Category:Infobox templates]]</noinclude>
15e673304251e5c68c7123d77ca24910b676c118
Template:Infobox/Item/doc
10
464
1269
1227
2025-08-23T01:08:16Z
Sharparam
284703
Add doc for ammunition type
wikitext
text/x-wiki
== TemplateData ==
<templatedata>
{
"description": "Infobox used for items of various kinds that don't have a specialized infobox.",
"format": "block",
"params": {
"title": {
"label": "Title",
"description": "Title/name of the item. If not given it will use the name of the page the infobox is used on (usually results in the desired name).",
"type": "line",
"required": false,
"default": "{{PAGENAME}}",
"example": "Health Potion"
},
"image": {
"label": "Image",
"description": "Game image for the item.",
"type": "wiki-file-name",
"required": true,
"example": "Health Potion.png"
},
"type": {
"label": "Type",
"description": "Item type. Supported values are 'ammunition', 'consumable', 'essential', 'upgrade', 'material', 'fluid', and 'concoction'. Other values or not specifying it makes the infobox fallback to treating it as a generic item. Even for generic items, it is recommended to supply this parameter and simply specify it as 'item'.",
"type": "line",
"required": false,
"suggested": true,
"default": "item",
"example": "consumable",
"suggestedvalues": [
"item",
"ammunition",
"concoction",
"consumable",
"essential",
"fluid",
"material",
"upgrade"
]
},
"Description": {
"label": "Description",
"description": "In-game description of the item, if available. Do not use this field for your own description of an item, that belongs in the article body instead.",
"type": "string",
"required": false,
"example": "Restores a portion of your health."
}
}
}
</templatedata>
== Examples ==
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| type = consumable
| Description = This item will do something fancy when you use it!
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Item
| image = Fancy item.png
| title = Fancy item
| type = consumable
| Description = This item will do something fancy when you use it!
}}
</syntaxhighlight>
b7072508bd1ef0424021e2fd29e396de42abd452
Template:Navbox/Longbows
10
818
1270
2025-08-23T01:13:03Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Longbows | title = [[Longbows]] | list1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged bow]] }}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Longbows
| title = [[Longbows]]
| list1 =
* [[Arcane Bow]]
* [[Longbow]]
* [[Taskmaster]]
* [[Winged bow]]
}}<noinclude>{{Documentation}}</noinclude>
a52bb6aa077c6e7d02ee5f21a9d706b0ad698d7e
Template:Navbox/Longbows/doc
10
819
1271
2025-08-23T01:13:35Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
a072d936de3f697ea20b212186fc4bf85674e635
Template:Navbox/Ranged weapons
10
820
1273
2025-08-23T01:17:39Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | state = {{{state|}}} | group1 = [[Longbows]] | list1 = {{Navbox/Longbows|child}} | group2 = [[Staves]] | list2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| group1 = [[Longbows]]
| list1 = {{Navbox/Longbows|child}}
| group2 = [[Staves]]
| list2 =
* [[Asklepios]]
* [[Blessed Crosier]]
* [[Evolved Staff]]
* [[Mechanomad Staff]]
* [[Vermillion Staff]]
}}<noinclude>{{Documentation}}</noinclude>
6173db7c4376edf846d8951786b78f364a3ebc83
1274
1273
2025-08-23T01:18:17Z
Sharparam
284703
Fix missing params
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Ranged weapons
| title = [[Ranged weapons]]
| group1 = [[Longbows]]
| list1 = {{Navbox/Longbows|child}}
| group2 = [[Staves]]
| list2 =
* [[Asklepios]]
* [[Blessed Crosier]]
* [[Evolved Staff]]
* [[Mechanomad Staff]]
* [[Vermillion Staff]]
}}<noinclude>{{Documentation}}</noinclude>
a00bcfa757ece76ed674698fb0404ad2f82a5788
Template:Navbox/Weapons
10
438
1275
1059
2025-08-23T01:18:56Z
Sharparam
284703
Switch to child navbox for ranged weapons
wikitext
text/x-wiki
<!-- Weapons must be listed in alphabetical order! -->
{{Navbox
| {{{1|}}}
| template = Navbox/Weapons
| title = [[Weapons]]
| group1 = [[One-handed weapons|One-handed]]
| list1 =
* [[Arming Sword]]
* [[Industrial Axe]]
* [[Industrial Mace]]
* [[Iron Pipe]]
* [[Longsword]]
* [[Machinist's Hammer]]
* [[Morning Star]]
* [[Paladin Mace]]
* [[Ratagan Sabre]]
* [[Scimitar]]
* [[Soul Breaker]]
* [[Tire Iron]]
* [[Torch]]
* [[Woodchopper]]
| group2 = [[Two-handed weapons|Two-handed]]
| list2 =
* [[Anastasia]]
* [[Claymore]]
* [[Crescent Axe]]
* [[Faussart]]
* [[Halberd]]
* [[Mechanical Tenderizer]]
* [[Nodachi]]
* [[Royal Claymore]]
* [[Rusty Claymore]]
* [[Solaris]]
* [[Soul Reaper]]
* [[Valtiel]]
| group2.1 = [[Dual Wields]]
| list2.1 =
* [[Blades of Atropos]]
* [[Daggers]]
* [[Kamas]]
* [[Katanas]]
* [[Khopeshs]]
* [[Lacerators]]
| group2.2 = [[Twinblades]]
| list2.2 =
* [[Twinblade]]
| group2.3 = [[Greatweapons]]
| list2.3 =
* [[Armor Buster]]
* [[Divine Greataxe]]
* [[Eviscerator]]
* [[Greathammer]]
| group3 = [[Ranged weapons|Ranged]]
| list3 = {{Navbox/Ranged weapons|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
cb065e4fb7e8abbaa07e27234536a0d85b22d837
Template:Navbox/Ranged weapons/doc
10
821
1276
2025-08-23T01:19:38Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
a072d936de3f697ea20b212186fc4bf85674e635
Piercing Arrow
0
822
1277
2025-08-23T01:20:47Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Piercing Arrow.png | type = ammunition | Description = A projectile that ignores up to 2000 armor rating. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Piercing Arrow.png
| type = ammunition
| Description = A projectile that ignores up to 2000 armor rating.
}}
'''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}.
{{Navbox/Ammunition}}
{{Navbox/Longbows|state=collapsed}}
ee55b68eda821ca46afd9433e29d4ca3626e7134
File:Piercing Arrow.png
6
823
1278
2025-08-23T01:21:22Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/PiercingArrow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/PiercingArrow
}}
== Licensing ==
{{License|game}}
d15e7e54bdb589d6cf5e48b2ef48acb409190de0
Shock Arrows
0
824
1279
2025-08-23T01:22:53Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Shock Arrows.png | type = ammunition | Description = A projectile that stuns most enemies for {{Duration|s=7|display=7 seconds}}. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Shock Arrows.png
| type = ammunition
| Description = A projectile that stuns most enemies for {{Duration|s=7|display=7 seconds}}.
}}
'''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}.
{{Navbox/Ammunition}}
{{Navbox/Longbows|state=collapsed}}
d236e07c75607e37cacee19e8b7681057d8e4d11
File:Shock Arrows.png
6
825
1280
2025-08-23T01:23:19Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ShockArrow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ShockArrow
}}
== Licensing ==
{{License|game}}
c34d8433913650912573eb234b0b0dc8a2c47818
Template:Hlist
10
826
1282
1281
2025-08-23T01:31:50Z
Sharparam
284703
1 revision imported
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
9e3824c2e3c0e0dbef2f37556ac0b994987fecf9
Template:Hlist/styles.css
10
827
1284
1283
2025-08-23T01:31:51Z
Sharparam
284703
1 revision imported
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
8c9dd9c9c00f30eead17fe10f51d183333e81f33
Module:List
828
828
1286
1285
2025-08-23T01:31:51Z
Sharparam
284703
1 revision imported
Scribunto
text/plain
local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')
local p = {}
local listTypes = {
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true
}
function p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes and TemplateStyles
data.classes = {}
data.templatestyles = ''
if listType == 'horizontal' or listType == 'horizontal_ordered' then
table.insert(data.classes, 'hlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Hlist/styles.css' }
}
elseif listType == 'unbulleted' then
table.insert(data.classes, 'plainlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Plainlist/styles.css' }
}
end
table.insert(data.classes, args.class)
-- Main div style
data.style = args.style
-- Indent for horizontal lists
if listType == 'horizontal' or listType == 'horizontal_ordered' then
local indent = tonumber(args.indent)
indent = indent and indent * 1.6 or 0
if indent > 0 then
data.marginLeft = indent .. 'em'
end
end
-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listStyleType = args.list_style_type or args['list-style-type']
data.type = args['type']
-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
if data.type
and not data.listStyleType
and not tostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType = data.type
data.type = nil
end
end
-- List tag type
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listTag = 'ol'
else
data.listTag = 'ul'
end
-- Start number for ordered lists
data.start = args.start
if listType == 'horizontal_ordered' then
-- Apply fix to get start numbers working with horizontal ordered lists.
local startNum = tonumber(data.start)
if startNum then
data.counterReset = 'listitem ' .. tostring(startNum - 1)
end
end
-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle = args.list_style
-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle = args.item_style or args.li_style
data.items = {}
for _, num in ipairs(mTableTools.numKeys(args)) do
local item = {}
item.content = args[num]
item.style = args['item' .. tostring(num) .. '_style']
or args['item_style' .. tostring(num)]
item.value = args['item' .. tostring(num) .. '_value']
or args['item_value' .. tostring(num)]
table.insert(data.items, item)
end
return data
end
function p.renderList(data)
-- Renders the list HTML.
-- Return the blank string if there are no list items.
if type(data.items) ~= 'table' or #data.items < 1 then
return ''
end
-- Render the main div tag.
local root = mw.html.create('div')
for _, class in ipairs(data.classes or {}) do
root:addClass(class)
end
root:css{['margin-left'] = data.marginLeft}
if data.style then
root:cssText(data.style)
end
-- Render the list tag.
local list = root:tag(data.listTag or 'ul')
list
:attr{start = data.start, type = data.type}
:css{
['counter-reset'] = data.counterReset,
['list-style-type'] = data.listStyleType
}
if data.listStyle then
list:cssText(data.listStyle)
end
-- Render the list items
for _, t in ipairs(data.items or {}) do
local item = list:tag('li')
if data.itemStyle then
item:cssText(data.itemStyle)
end
if t.style then
item:cssText(t.style)
end
item
:attr{value = t.value}
:wikitext(t.content)
end
return data.templatestyles .. tostring(root)
end
function p.renderTrackingCategories(args)
local isDeprecated = false -- Tracks deprecated parameters.
for k, v in pairs(args) do
k = tostring(k)
if k:find('^item_style%d+$') or k:find('^item_value%d+$') then
isDeprecated = true
break
end
end
local ret = ''
if isDeprecated then
ret = ret .. '[[Category:List templates with deprecated parameters]]'
end
return ret
end
function p.makeList(listType, args)
if not listType or not listTypes[listType] then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
), 2)
end
checkType('makeList', 2, args, 'table')
local data = p.makeListData(listType, args)
local list = p.renderList(data)
local trackingCategories = p.renderTrackingCategories(args)
return list .. trackingCategories
end
for listType in pairs(listTypes) do
p[listType] = function (frame)
local mArguments = require('Module:Arguments')
local origArgs = mArguments.getArgs(frame, {
frameOnly = ((frame and frame.args and frame.args.frameonly or '') ~= ''),
valueFunc = function (key, value)
if not value or not mw.ustring.find(value, '%S') then return nil end
if mw.ustring.find(value, '^%s*[%*#;:]') then
return value
else
return value:match('^%s*(.-)%s*$')
end
return nil
end
})
-- Copy all the arguments to a new table, for faster indexing.
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.makeList(listType, args)
end
end
return p
44af96bdee7ebfa2ecf19acd4461d7a35c75856a
Template:Navbox/Rings
10
292
1287
1175
2025-08-23T01:44:43Z
Sharparam
284703
Add more rings
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Arcane|Arcane]]
* [[Ring of Blessed Hand|Blessed Hand]]
* [[Ring of Burning Desire|Burning Desire]]
* [[Ring of Casting Speed|Casting Speed]]
* [[Ring of Colossus|Colossus]]
* [[Ring of Command|Command]]
* [[Ring of Decay|Decay]]
* [[Ring of Degravitas|Degravitas]]
* [[Ring of Entropy|Entropy]]
* [[Ring of Giant|Giant]]
* [[Ring of Gluttony|Gluttony]]
* [[Ring of Gravitas|Gravitas]]
* [[Ring of Hawk|Hawk]]
* [[Ring of Minor Lifesteal|Minor Lifesteal]]
* [[Ring of Potential|Potential]]
** [[Ring of Minor Potential|Minor]]
* [[Ring of Penetration|Penetration]]
* [[Ring of Power|Power]]
* [[Ring of Rammstein|Rammstein]]
* [[The Scholar's Ring|Scholar]]
* [[Ring of Serpent|Serpent]]
* [[Ring of Silence|Silence]]
* [[Ring of Slumber|Slumber]]
* [[Ring of Speed|Speed]]
* [[Ring of Stamina|Stamina]]
** [[Ring of Lesser Stamina|Lesser]]
* [[Ring of Talent|Talent]]
** [[Ring of Lesser Talent|Lesser]]
** [[Ring of Exceeding Talent|Exceeding]]
* [[Ring of Travel|Travel]]
* Vitality
** [[Ring of Minor Vitality|Minor]]
** [[Ring of Greater Vitality|Greater]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
2260a141cd1e5e4eeef17c8a4924046ea2dadb61
Template:Navbox/Amulets
10
441
1288
648
2025-08-23T01:47:03Z
Sharparam
284703
Add more amulets
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Amulets
| title = [[Amulets]]
| list1 =
* [[Amulet of Arcane]]
* [[Amulet of Arcane Protection]]
* [[Amulet of Divine Might]]
* [[Amulet of Evasion]]
* [[Amulet of Flux Leech]]
* [[Amulet of Recovery]]
* [[Amulet of Stability]]
* [[Amulet of Vitality]]
** [[Amulet of Minor Vitality|Minor]]
* [[Tactician's Amulet]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
efc0dd0f4023e758ff3aef9dd09becfd9d54cbcd
Template:Navbox/Locations
10
293
1289
383
2025-08-23T01:48:24Z
Sharparam
284703
Use proper sublists
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]]
** [[Monastery#Lower|Lower]]
** [[Monastery#Upper|Upper]]
* [[Blok 6147]]
* [[Rain District]]
** [[Rain District#Sewers|Sewers]]
** [[Rain District#Center|Center]]
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]]
** [[Uranopolis#Tower Complex|Tower Complex]]
** [[Uranopolis#Lone Tower|Lone Tower]]
* [[Ghost Town]]
** [[Ghost Town#Floor 13|Floor 13]]
** [[Ghost Town#Floor 1|Floor 1]]
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly]]
* [[Unknown (location)|Unknown]]
* [[Vermillion Fields]]
** [[Vermillion Fields#Plaza|Plaza]]
** [[Vermillion Fields#Temple|Temple]]
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
3d0740e2cdedd61bc5d5a8b9e839a3fc4e3c69ee
Template:Navbox/Armor
10
439
1290
646
2025-08-23T01:54:03Z
Sharparam
284703
Add more helmets
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| group3 = [[Chestguards]]
| list3 =
* [[Citadel Warrior Chest]]
* [[Corrupted Cuirass]]
* [[Librarian Overcoat]]
* [[Sentinel Chest]]
| group4 = [[Legguards]]
| list4 =
* [[Librarian Trousers]]
* [[Sentinel Legguard]]
| group5 = [[Gauntlets]]
| list5 =
* [[Sentinel Gauntlets]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
bcd48e9c7633d725db1a89ef1b7dfb45647860d7
1291
1290
2025-08-23T01:56:48Z
Sharparam
284703
Add more pauldrons
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Citadel Warrior Chest]]
* [[Corrupted Cuirass]]
* [[Librarian Overcoat]]
* [[Sentinel Chest]]
| group4 = [[Legguards]]
| list4 =
* [[Librarian Trousers]]
* [[Sentinel Legguard]]
| group5 = [[Gauntlets]]
| list5 =
* [[Sentinel Gauntlets]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
c436c20073411ed82436959f407d120e73a84cb6
1292
1291
2025-08-23T02:00:38Z
Sharparam
284703
Add more chestguards
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Bone Cuirass]]
* [[Citadel Defender Chest]]
* [[Citadel Warrior Chest]]
* [[Contractor Chestpiece]]
* [[Corrupted Cuirass]]
* [[Crow Cuirass]]
* [[Desert Corp Cuirass]]
* [[Hunter Coat]]
* [[Hunter Garb]]
* [[Librarian Overcoat]]
* [[Ranger Chestguard]]
* [[Reinforced Bone Cuirass]]
* [[Restless Cuirass]]
* [[Ronin Cuirass]]
* [[Sentinel Chest]]
* [[Spectre Cuirass]]
* [[Stalker's Cuirass]]
* [[Technomancer Chestpiece]]
* [[Templar Chestpiece]]
* [[Titan Slayer Cuirass]]
* [[Utility Uniform Jacket]]
* [[Zealot Chestpiece]]
| group4 = [[Legguards]]
| list4 =
* [[Librarian Trousers]]
* [[Sentinel Legguard]]
| group5 = [[Gauntlets]]
| list5 =
* [[Sentinel Gauntlets]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
7a8603530e7b9ce9a79bf61c3ce2fb047c5ee4d4
1293
1292
2025-08-23T02:03:56Z
Sharparam
284703
Add more legguards
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Bone Cuirass]]
* [[Citadel Defender Chest]]
* [[Citadel Warrior Chest]]
* [[Contractor Chestpiece]]
* [[Corrupted Cuirass]]
* [[Crow Cuirass]]
* [[Desert Corp Cuirass]]
* [[Hunter Coat]]
* [[Hunter Garb]]
* [[Librarian Overcoat]]
* [[Ranger Chestguard]]
* [[Reinforced Bone Cuirass]]
* [[Restless Cuirass]]
* [[Ronin Cuirass]]
* [[Sentinel Chest]]
* [[Spectre Cuirass]]
* [[Stalker's Cuirass]]
* [[Technomancer Chestpiece]]
* [[Templar Chestpiece]]
* [[Titan Slayer Cuirass]]
* [[Utility Uniform Jacket]]
* [[Zealot Chestpiece]]
| group4 = [[Legguards]]
| list4 =
* [[Bone Legs]]
* [[Citadel Defender Legguards]]
* [[Citadel Warrior Legguards]]
* [[Contractor Legs]]
* [[Crow Legguard]]
* [[Desert Corp Legs]]
* [[Hunter Legguards]]
* [[Librarian Trousers]]
* [[Ranger Pants]]
* [[Reinforced Bone Legguard]]
* [[Restless Legguard]]
* [[Ronin Pants]]
* [[Sentinel Legguard]]
* [[Spectre Pants]]
* [[Stalker's Pants]]
* [[Technomancer Legs]]
* [[Templar Legs]]
* [[Titan Slayer Legs]]
* [[Utility Uniform Pants]]
* [[Zealot Legs]]
| group5 = [[Gauntlets]]
| list5 =
* [[Sentinel Gauntlets]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
2b369a603af9b6fb14a83d6348476e1f03f2f0bc
1294
1293
2025-08-23T02:07:51Z
Sharparam
284703
Add more gauntlets (Spectre Gauntlets and Ronin Gauntlets are typod in-game as "Spectre Gauntlent" and "Ronin Gauntlent")
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Bone Cuirass]]
* [[Citadel Defender Chest]]
* [[Citadel Warrior Chest]]
* [[Contractor Chestpiece]]
* [[Corrupted Cuirass]]
* [[Crow Cuirass]]
* [[Desert Corp Cuirass]]
* [[Hunter Coat]]
* [[Hunter Garb]]
* [[Librarian Overcoat]]
* [[Ranger Chestguard]]
* [[Reinforced Bone Cuirass]]
* [[Restless Cuirass]]
* [[Ronin Cuirass]]
* [[Sentinel Chest]]
* [[Spectre Cuirass]]
* [[Stalker's Cuirass]]
* [[Technomancer Chestpiece]]
* [[Templar Chestpiece]]
* [[Titan Slayer Cuirass]]
* [[Utility Uniform Jacket]]
* [[Zealot Chestpiece]]
| group4 = [[Legguards]]
| list4 =
* [[Bone Legs]]
* [[Citadel Defender Legguards]]
* [[Citadel Warrior Legguards]]
* [[Contractor Legs]]
* [[Crow Legguard]]
* [[Desert Corp Legs]]
* [[Hunter Legguards]]
* [[Librarian Trousers]]
* [[Ranger Pants]]
* [[Reinforced Bone Legguard]]
* [[Restless Legguard]]
* [[Ronin Pants]]
* [[Sentinel Legguard]]
* [[Spectre Pants]]
* [[Stalker's Pants]]
* [[Technomancer Legs]]
* [[Templar Legs]]
* [[Titan Slayer Legs]]
* [[Utility Uniform Pants]]
* [[Zealot Legs]]
| group5 = [[Gauntlets]]
| list5 =
* [[Bone Gloves]]
* [[Citadel Defender Gauntlets]]
* [[Citadel Warrior Gauntlets]]
* [[Contractor Gloves]]
* [[Desert Corp Gloves]]
* [[Hunter Gloves]]
* [[Ranger Gloves]]
* [[Reinforced Bone Gauntlets]]
* [[Restless Gauntlets]]
* [[Ronin Gauntlets]]
* [[Sentinel Gauntlets]]
* [[Spectre Gauntlets]]
* [[Stalker's Gloves]]
* [[Technomancer Gloves]]
* [[Templar Gloves]]
* [[Titan Slayer Gloves]]
* [[Utility Uniform Gloves]]
* [[Zealot Gloves]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Citadel Warrior]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Sentinel]]
* [[Techpriest]]
* [[Vengeance]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
8f606cebd5eeb2a0564bad423eafcfc863c00d70
1295
1294
2025-08-23T02:11:09Z
Sharparam
284703
Add more armor sets
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Bone Cuirass]]
* [[Citadel Defender Chest]]
* [[Citadel Warrior Chest]]
* [[Contractor Chestpiece]]
* [[Corrupted Cuirass]]
* [[Crow Cuirass]]
* [[Desert Corp Cuirass]]
* [[Hunter Coat]]
* [[Hunter Garb]]
* [[Librarian Overcoat]]
* [[Ranger Chestguard]]
* [[Reinforced Bone Cuirass]]
* [[Restless Cuirass]]
* [[Ronin Cuirass]]
* [[Sentinel Chest]]
* [[Spectre Cuirass]]
* [[Stalker's Cuirass]]
* [[Technomancer Chestpiece]]
* [[Templar Chestpiece]]
* [[Titan Slayer Cuirass]]
* [[Utility Uniform Jacket]]
* [[Zealot Chestpiece]]
| group4 = [[Legguards]]
| list4 =
* [[Bone Legs]]
* [[Citadel Defender Legguards]]
* [[Citadel Warrior Legguards]]
* [[Contractor Legs]]
* [[Crow Legguard]]
* [[Desert Corp Legs]]
* [[Hunter Legguards]]
* [[Librarian Trousers]]
* [[Ranger Pants]]
* [[Reinforced Bone Legguard]]
* [[Restless Legguard]]
* [[Ronin Pants]]
* [[Sentinel Legguard]]
* [[Spectre Pants]]
* [[Stalker's Pants]]
* [[Technomancer Legs]]
* [[Templar Legs]]
* [[Titan Slayer Legs]]
* [[Utility Uniform Pants]]
* [[Zealot Legs]]
| group5 = [[Gauntlets]]
| list5 =
* [[Bone Gloves]]
* [[Citadel Defender Gauntlets]]
* [[Citadel Warrior Gauntlets]]
* [[Contractor Gloves]]
* [[Desert Corp Gloves]]
* [[Hunter Gloves]]
* [[Ranger Gloves]]
* [[Reinforced Bone Gauntlets]]
* [[Restless Gauntlets]]
* [[Ronin Gauntlets]]
* [[Sentinel Gauntlets]]
* [[Spectre Gauntlets]]
* [[Stalker's Gloves]]
* [[Technomancer Gloves]]
* [[Templar Gloves]]
* [[Titan Slayer Gloves]]
* [[Utility Uniform Gloves]]
* [[Zealot Gloves]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Bone]]
* [[Citadel Defender]]
* [[Citadel Warrior]]
* [[Contractor]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Ranger]]
* [[Reinforced Bone]]
* [[Restless]]
* [[Ronin (armor set)|Ronin]]
* [[Sentinel]]
* [[Spectre (armor set)|Spectre]]
* [[Technomancer (armor set)|Technomancer]]
* [[Techpriest]]
* [[Templar (armor set)|Templar]]
* [[Titan Slayer (armor set)||Titan Slayer]]
* [[Utility Uniform]]
* [[Vengeance]]
* [[Zealot (armor set)|Zealot]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
da89db5cbaeed06ced302a71316862655899bbbb
1296
1295
2025-08-23T02:12:27Z
Sharparam
284703
Add more armor sets
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Bone Cuirass]]
* [[Citadel Defender Chest]]
* [[Citadel Warrior Chest]]
* [[Contractor Chestpiece]]
* [[Corrupted Cuirass]]
* [[Crow Cuirass]]
* [[Desert Corp Cuirass]]
* [[Hunter Coat]]
* [[Hunter Garb]]
* [[Librarian Overcoat]]
* [[Ranger Chestguard]]
* [[Reinforced Bone Cuirass]]
* [[Restless Cuirass]]
* [[Ronin Cuirass]]
* [[Sentinel Chest]]
* [[Spectre Cuirass]]
* [[Stalker's Cuirass]]
* [[Technomancer Chestpiece]]
* [[Templar Chestpiece]]
* [[Titan Slayer Cuirass]]
* [[Utility Uniform Jacket]]
* [[Zealot Chestpiece]]
| group4 = [[Legguards]]
| list4 =
* [[Bone Legs]]
* [[Citadel Defender Legguards]]
* [[Citadel Warrior Legguards]]
* [[Contractor Legs]]
* [[Crow Legguard]]
* [[Desert Corp Legs]]
* [[Hunter Legguards]]
* [[Librarian Trousers]]
* [[Ranger Pants]]
* [[Reinforced Bone Legguard]]
* [[Restless Legguard]]
* [[Ronin Pants]]
* [[Sentinel Legguard]]
* [[Spectre Pants]]
* [[Stalker's Pants]]
* [[Technomancer Legs]]
* [[Templar Legs]]
* [[Titan Slayer Legs]]
* [[Utility Uniform Pants]]
* [[Zealot Legs]]
| group5 = [[Gauntlets]]
| list5 =
* [[Bone Gloves]]
* [[Citadel Defender Gauntlets]]
* [[Citadel Warrior Gauntlets]]
* [[Contractor Gloves]]
* [[Desert Corp Gloves]]
* [[Hunter Gloves]]
* [[Ranger Gloves]]
* [[Reinforced Bone Gauntlets]]
* [[Restless Gauntlets]]
* [[Ronin Gauntlets]]
* [[Sentinel Gauntlets]]
* [[Spectre Gauntlets]]
* [[Stalker's Gloves]]
* [[Technomancer Gloves]]
* [[Templar Gloves]]
* [[Titan Slayer Gloves]]
* [[Utility Uniform Gloves]]
* [[Zealot Gloves]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Bone]]
* [[Citadel Defender]]
* [[Citadel Warrior]]
* [[Contractor]]
* [[Corrupted (armor set)|Corrupted]]
* [[Crow]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Ranger]]
* [[Reinforced Bone]]
* [[Restless]]
* [[Ronin (armor set)|Ronin]]
* [[Sentinel]]
* [[Spectre (armor set)|Spectre]]
* [[Stalker]]
* [[Technomancer (armor set)|Technomancer]]
* [[Techpriest]]
* [[Templar (armor set)|Templar]]
* [[Titan Slayer (armor set)||Titan Slayer]]
* [[Utility Uniform]]
* [[Vengeance]]
* [[Zealot (armor set)|Zealot]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
90a515a818cacbaa40d4aceba71440c722489d1d
1297
1296
2025-08-23T02:12:44Z
Sharparam
284703
Fix extra pipe
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Bone Cuirass]]
* [[Citadel Defender Chest]]
* [[Citadel Warrior Chest]]
* [[Contractor Chestpiece]]
* [[Corrupted Cuirass]]
* [[Crow Cuirass]]
* [[Desert Corp Cuirass]]
* [[Hunter Coat]]
* [[Hunter Garb]]
* [[Librarian Overcoat]]
* [[Ranger Chestguard]]
* [[Reinforced Bone Cuirass]]
* [[Restless Cuirass]]
* [[Ronin Cuirass]]
* [[Sentinel Chest]]
* [[Spectre Cuirass]]
* [[Stalker's Cuirass]]
* [[Technomancer Chestpiece]]
* [[Templar Chestpiece]]
* [[Titan Slayer Cuirass]]
* [[Utility Uniform Jacket]]
* [[Zealot Chestpiece]]
| group4 = [[Legguards]]
| list4 =
* [[Bone Legs]]
* [[Citadel Defender Legguards]]
* [[Citadel Warrior Legguards]]
* [[Contractor Legs]]
* [[Crow Legguard]]
* [[Desert Corp Legs]]
* [[Hunter Legguards]]
* [[Librarian Trousers]]
* [[Ranger Pants]]
* [[Reinforced Bone Legguard]]
* [[Restless Legguard]]
* [[Ronin Pants]]
* [[Sentinel Legguard]]
* [[Spectre Pants]]
* [[Stalker's Pants]]
* [[Technomancer Legs]]
* [[Templar Legs]]
* [[Titan Slayer Legs]]
* [[Utility Uniform Pants]]
* [[Zealot Legs]]
| group5 = [[Gauntlets]]
| list5 =
* [[Bone Gloves]]
* [[Citadel Defender Gauntlets]]
* [[Citadel Warrior Gauntlets]]
* [[Contractor Gloves]]
* [[Desert Corp Gloves]]
* [[Hunter Gloves]]
* [[Ranger Gloves]]
* [[Reinforced Bone Gauntlets]]
* [[Restless Gauntlets]]
* [[Ronin Gauntlets]]
* [[Sentinel Gauntlets]]
* [[Spectre Gauntlets]]
* [[Stalker's Gloves]]
* [[Technomancer Gloves]]
* [[Templar Gloves]]
* [[Titan Slayer Gloves]]
* [[Utility Uniform Gloves]]
* [[Zealot Gloves]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Bone]]
* [[Citadel Defender]]
* [[Citadel Warrior]]
* [[Contractor]]
* [[Corrupted (armor set)|Corrupted]]
* [[Crow]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Ranger]]
* [[Reinforced Bone]]
* [[Restless]]
* [[Ronin (armor set)|Ronin]]
* [[Sentinel]]
* [[Spectre (armor set)|Spectre]]
* [[Stalker]]
* [[Technomancer (armor set)|Technomancer]]
* [[Techpriest]]
* [[Templar (armor set)|Templar]]
* [[Titan Slayer (armor set)|Titan Slayer]]
* [[Utility Uniform]]
* [[Vengeance]]
* [[Zealot (armor set)|Zealot]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
a1d9f80f3b1043def39295dc0d2dca65b7f9ed7b
Template:Infobox/Armor
10
453
1298
1190
2025-08-23T02:19:06Z
Sharparam
284703
Add more armor set special cases
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=armor
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Weight,Set,Passives
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| helm
| helmet = [[Helmet]]
| pauldron
| pauldrons = [[Pauldrons]]
| chestguard = [[Chestguard]]
| legguard
| legguards = [[Legguard]]
| gauntlet
| gauntlets = [[Gauntlet]]
| #default = {{{Type}}}
}}}}
|Set={{#if:{{{Set|}}}|{{#switch:{{lc:{{{Set}}}}}
| corrupted = [[Corrupted (armor set)|Corrupted]]
| librarian = [[Librarian (armor set)|Librarian]]
| ronin = [[Ronin (armor set)|Ronin]]
| spectre = [[Spectre (armor set)|Spectre]]
| technomancer = [[Technomancer (armor set)|Technomancer]]
| templar = [[Templar (armor set)|Templar]]
| titan slayer = [[Titan Slayer (armor set)|Titan Slayer]]
| zealot = [[Zealot (armor set)|Zealot]]
| #default = [[{{{Set}}}]]
}}}}
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \!
| token = @@@@
| pattern = [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|tabs=
Mk0,
Mk1,
Mk2,
Mk3,
Mk4,
Mk5
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{{Mk0_Sharp|???}}}
|Mk0_Blunt={{{Mk0_Blunt|???}}}
|Mk0_Technomancy={{{Mk0_Technomancy|???}}}
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| helmet = [[Category:Helmets]]
| pauldrons = [[Category:Pauldrons]]
| chestguard = [[Category:Chestguards]]
| legguard = [[Category:Legguards]]
| gauntlet = [[Category:Gauntlets]]
| #default = [[Category:Armor]]
}}{{Armor/CargoStore
|name={{{title|}}}
|setname={{{Set|}}}
|type={{{Type|}}}
|weight={{{Weight|}}}
|sharpMk0={{{Mk0_Sharp|}}}
|bluntMk0={{{Mk0_Blunt|}}}
|technomancyMk0={{{Mk0_Technomancy|}}}
|sharpMk1={{{Mk1_Sharp|}}}
|bluntMk1={{{Mk1_Blunt|}}}
|technomancyMk1={{{Mk1_Technomancy|}}}
|sharpMk2={{{Mk2_Sharp|}}}
|bluntMk2={{{Mk2_Blunt|}}}
|technomancyMk2={{{Mk2_Technomancy|}}}
|sharpMk3={{{Mk3_Sharp|}}}
|bluntMk3={{{Mk3_Blunt|}}}
|technomancyMk3={{{Mk3_Technomancy|}}}
|sharpMk4={{{Mk4_Sharp|}}}
|bluntMk4={{{Mk4_Blunt|}}}
|technomancyMk4={{{Mk4_Technomancy|}}}
|sharpMk5={{{Mk5_Sharp|}}}
|bluntMk5={{{Mk5_Blunt|}}}
|technomancyMk5={{{Mk5_Technomancy|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
4c54a45d5856aaf6e4c9585671b66a336362a99b
Ronin Gauntlets
0
829
1299
2025-08-23T02:21:04Z
Sharparam
284703
Created page with "{{Infobox/Armor | image = Ronin Gauntlets.png | Type = Gauntlets | Weight = Light | Set = Ronin | Mk4_Sharp = 320 | Mk4_Blunt = 320 | Mk4_Technomancy = 199 }} '''Ronin Gauntlets''' are [[gauntlets]] [[armor]] found in {{BFF}}. == Bugs == * In-game, the item has a typo and is called "Ronin Gauntlent". {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| image = Ronin Gauntlets.png
| Type = Gauntlets
| Weight = Light
| Set = Ronin
| Mk4_Sharp = 320
| Mk4_Blunt = 320
| Mk4_Technomancy = 199
}}
'''Ronin Gauntlets''' are [[gauntlets]] [[armor]] found in {{BFF}}.
== Bugs ==
* In-game, the item has a typo and is called "Ronin Gauntlent".
{{Navbox/Armor}}
506b17c7646045e0f174601826e93201781b7489
Ronin Gauntlent
0
830
1300
2025-08-23T02:21:26Z
Sharparam
284703
Redirected page to [[Ronin Gauntlets]]
wikitext
text/x-wiki
#REDIRECT [[Ronin Gauntlets]]
5c27736bd21d2b919da298f74934ced3e325c077
Spectre Gauntlets
0
831
1301
2025-08-23T02:23:15Z
Sharparam
284703
Created page with "{{Infobox/Armor | image = Spectre Gauntlets.png | Type = Gauntlets | Weight = Light | Set = Spectre | Mk2_Sharp = 166 | Mk2_Blunt = 166 | Mk2_Technomancy = 364 }} '''{{PAGENAME}}''' are [[gauntlets]] [[armor]] found in {{BFF}}. == Bugs == * In-game, the item has a typo and is called "Spectre Gauntlent". {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Infobox/Armor
| image = Spectre Gauntlets.png
| Type = Gauntlets
| Weight = Light
| Set = Spectre
| Mk2_Sharp = 166
| Mk2_Blunt = 166
| Mk2_Technomancy = 364
}}
'''{{PAGENAME}}''' are [[gauntlets]] [[armor]] found in {{BFF}}.
== Bugs ==
* In-game, the item has a typo and is called "Spectre Gauntlent".
{{Navbox/Armor}}
cbde60c139aa72b99538a54ff08d455e3e831b93
File:Spectre Gauntlets.png
6
832
1302
2025-08-23T02:24:06Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/icon_spectregauntlet
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/icon_spectregauntlet
}}
== Licensing ==
{{License|game}}
809b44d5f3a0d45f28cf1eac39078f6b5851494f
File:Ronin Gauntlets.png
6
833
1303
2025-08-23T02:24:46Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/icon_roningauntlet
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armor/icon_roningauntlet
}}
== Licensing ==
{{License|game}}
243c54f0195a7379f152837e67f02d3ad8ce6f92
Template:Navbox/Weapons
10
438
1304
1275
2025-08-23T02:28:46Z
Sharparam
284703
Add more weapons
wikitext
text/x-wiki
<!-- Weapons must be listed in alphabetical order! -->
{{Navbox
| {{{1|}}}
| template = Navbox/Weapons
| title = [[Weapons]]
| group1 = [[One-handed weapons|One-handed]]
| list1 =
* [[Arming Sword]]
* [[Industrial Axe]]
* [[Industrial Mace]]
* [[Iron Pipe]]
* [[Longsword]]
* [[Machinist's Hammer]]
* [[Morning Star]]
* [[Paladin Mace]]
* [[Ratagan Sabre]]
* [[Scimitar]]
* [[Soul Breaker]]
* [[Tire Iron]]
* [[Torch]]
* [[Woodchopper]]
| group2 = [[Two-handed weapons|Two-handed]]
| list2 =
* [[Anastasia]]
* [[Claymore]]
* [[Crescent Axe]]
* [[Faussart]]
* [[Halberd]]
* [[Mechanical Tenderizer]]
* [[Nodachi]]
* [[Royal Claymore]]
* [[Rusty Claymore]]
* [[Solaris]]
* [[Soul Reaper]]
* [[Valtiel]]
| group2.1 = [[Dual Wields]]
| list2.1 =
* [[Blades of Atropos]]
* [[Daggers]]
* [[Kamas]]
* [[Katanas]]
* [[Khopeshs]]
* [[Lacerators]]
| group2.2 = [[Twinblades]]
| list2.2 =
* [[Marrow]]
* [[Twinblade]]
| group2.3 = [[Greatweapons]]
| list2.3 =
* [[Armor Buster]]
* [[Divine Greataxe]]
* [[Eviscerator]]
* [[Greathammer]]
* [[Titan Slayer Greatsword]]
| group3 = [[Ranged weapons|Ranged]]
| list3 = {{Navbox/Ranged weapons|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
be21d6c7ce009c6251403dbd8cd31af5e72ff0b7
Template:Navbox/Consumables
10
286
1305
1256
2025-08-23T02:34:04Z
Sharparam
284703
Add more consumables
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Asylum Brew]]
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
* [[Piercing Arrow Pack]]
| group2 = [[Fluids]]
| list2 =
* [[Ionization Fluid]]
** [[Lesser Ionization Fluid|Lesser]]
** [[Greater Ionization Fluid|Greater]]
* [[Mystery Concoction]]
* [[Regenerative Fluid]]
** [[Greater Regenerative Fluid|Greater]]
* [[Restorative Fluid]]
** [[Lesser Restorative Fluid|Lesser]]
** [[Greater Restorative Fluid|Greater]]
| group3 = [[Concoctions]]
| list3 =
* [[Diver's Lungs Concoction]]
** * [[Improved Diver's Lungs Concoction|Improved]]
* [[Dreadguard's Concoction]]
** [[Greater Dreadguard's Concoction|Greater]]
* [[Experience Concoction]]
* [[Fluxshield Concoction]]
* [[Forsaken Concoction]]
** [[Greater Forsaken Concoction|Greater]]
* [[Indestructible Concoction]]
* [[Jaeger's Concoction]]
** [[Greater Jaeger's Concoction|Greater]]
* [[Mystery Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Technomancer's Concoction]]
** [[Greater Technomancer's Concoction|Greater]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Agility]]
* [[Concoction: All Attributes]]
* [[Concoction: Berserker's Tenacity]]
* [[Concoction: Constitution]]
* [[Concoction: Flux Regen]]
* [[Concoction: Health Regen]]
* [[Concoction: Intelligence]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Powerful Immune System]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Zealot's Tears]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
9dade871e30ecba44927d6ec0d33ecebdc66ff4b
1306
1305
2025-08-23T02:34:18Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Asylum Brew]]
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
* [[Piercing Arrow Pack]]
| group2 = [[Fluids]]
| list2 =
* [[Ionization Fluid]]
** [[Lesser Ionization Fluid|Lesser]]
** [[Greater Ionization Fluid|Greater]]
* [[Mystery Concoction]]
* [[Regenerative Fluid]]
** [[Greater Regenerative Fluid|Greater]]
* [[Restorative Fluid]]
** [[Lesser Restorative Fluid|Lesser]]
** [[Greater Restorative Fluid|Greater]]
| group3 = [[Concoctions]]
| list3 =
* [[Diver's Lungs Concoction]]
** [[Improved Diver's Lungs Concoction|Improved]]
* [[Dreadguard's Concoction]]
** [[Greater Dreadguard's Concoction|Greater]]
* [[Experience Concoction]]
* [[Fluxshield Concoction]]
* [[Forsaken Concoction]]
** [[Greater Forsaken Concoction|Greater]]
* [[Indestructible Concoction]]
* [[Jaeger's Concoction]]
** [[Greater Jaeger's Concoction|Greater]]
* [[Mystery Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Technomancer's Concoction]]
** [[Greater Technomancer's Concoction|Greater]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Agility]]
* [[Concoction: All Attributes]]
* [[Concoction: Berserker's Tenacity]]
* [[Concoction: Constitution]]
* [[Concoction: Flux Regen]]
* [[Concoction: Health Regen]]
* [[Concoction: Intelligence]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Powerful Immune System]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Zealot's Tears]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
6b066a11cab7ab8aef0b4d4e59c636e529dd0b3e
Template:Navbox/Amulets
10
441
1307
1288
2025-08-23T02:36:27Z
Sharparam
284703
Add more amulets
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Amulets
| title = [[Amulets]]
| list1 =
* [[Amulet of Arcane]]
* [[Amulet of Arcane Protection]]
* [[Amulet of Divine Might]]
* [[Amulet of Evasion]]
* [[Amulet of Flux Leech]]
* [[Amulet of Focus]]
* [[Amulet of Recovery]]
* [[Amulet of Stability]]
* [[Amulet of Vitality]]
** [[Amulet of Minor Vitality|Minor]]
* [[Bulwark Amulet]]
* [[Nimble Amulet]]
* [[Piercing Amulet]]
* [[Tactician's Amulet]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
8d160988dbf0290bbb606baaea462fee7463d094
1322
1307
2025-08-23T03:04:44Z
Sharparam
284703
Add [[Amulet of Wandering]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Amulets
| title = [[Amulets]]
| list1 =
* [[Amulet of Arcane]]
* [[Amulet of Arcane Protection]]
* [[Amulet of Divine Might]]
* [[Amulet of Evasion]]
* [[Amulet of Flux Leech]]
* [[Amulet of Focus]]
* [[Amulet of Recovery]]
* [[Amulet of Stability]]
* [[Amulet of Vitality]]
** [[Amulet of Minor Vitality|Minor]]
* [[Amulet of Wandering]]
* [[Bulwark Amulet]]
* [[Nimble Amulet]]
* [[Piercing Amulet]]
* [[Tactician's Amulet]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
ec6c5c481f8f8a31910ca17e40470fc3bd9ed245
File:Tactician's Amulet.png
6
834
1308
2025-08-23T02:38:10Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace32_512
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace32_512
}}
== Licensing ==
{{License|game}}
59bfa39ec0da37d87eccd2eab635b17fa49deabc
Tactician's Amulet
0
518
1309
800
2025-08-23T02:43:04Z
Sharparam
284703
Add overview
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Tactician's Amulet.png
| Effects = Removes invincibility frames
| Passives = Vulnerable Dodge
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
== Overview ==
In its base form, the amulet simply removes invincibility frames while increasing the distance covered when dashing and dodging.
However, at [[The Handler]], it can be used in [[manufacturing]] to craft one of four other amulets:
* [[Amulet of Focus]]
* [[Bulwark Amulet]]
* [[Nimble Amulet]]
* [[Piercing Amulet]]
Since only one [[Tactician's Amulet]] can be obtained per [[New Game Plus|NG cycle]], it is beneficial to craft one of the above amulets before starting the next cycle, as a new Tactician's Amulet can only be picked up if it's not in the player's inventory already (all of the crafted variants inherit the base effects of this amulet).
{{Navbox/Amulets}}
dacac9fdf121e0684ede31bfafe489603f22a78c
Template:Infobox/Amulet
10
564
1310
883
2025-08-23T02:47:09Z
Sharparam
284703
Add sections for effects and passives
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|main
| kind = amulet
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections = Basic Info
| Basic Info = Effects,Passives
| Effects = {{#listmap:
| list = {{{Effects|}}}
| outsep = \n
| token = @@@@
| pattern = * @@@@
| intro = \{\{Plainlist\!
| outro = \}\}
}}
| Passives = {{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
}}
{{Main other|[[Category:Amulets]]}}</includeonly>
<noinclude>{{Documentation}}</noinclude>
bb53ff620ce14ed2d3683541d7ece2871df0da5f
Template:Infobox/Passive
10
835
1311
2025-08-23T02:50:53Z
Sharparam
284703
Created page with "<includeonly>{{#invoke:Infobox|main | kind = passive | sep = , | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections = DescriptionSection | DescriptionSection = Description | DescriptionSection_label = Description | Description_nolabel = yes }}{{Main other|[[Category:Passives]]}}</includeonly><!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind = passive
| sep = ,
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections = DescriptionSection
| DescriptionSection = Description
| DescriptionSection_label = Description
| Description_nolabel = yes
}}{{Main other|[[Category:Passives]]}}</includeonly><!--
--><noinclude>{{Documentation}}</noinclude>
dfaec1c39c1b442f2ae1c8c6796f881932298cf3
Template:Infobox/Passive/doc
10
836
1312
2025-08-23T02:52:30Z
Sharparam
284703
Created page with "== Examples == {{Infobox/Passive | title = Example Passive | image = Example Passive.png | Description = Increases your stats to ungodly amounts. }} <syntaxhighlight lang="wikitext"> {{Infobox/Passive | title = Example Passive | image = Example Passive.png | Description = Increases your stats to ungodly amounts. }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== Examples ==
{{Infobox/Passive
| title = Example Passive
| image = Example Passive.png
| Description = Increases your stats to ungodly amounts.
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Passive
| title = Example Passive
| image = Example Passive.png
| Description = Increases your stats to ungodly amounts.
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
0d7069df917ddb42da6611a4af4fcda6cd978ea5
Vulnerable Dodge
0
837
1313
2025-08-23T02:54:03Z
Sharparam
284703
Created page with "{{Infobox/Passive | image = Vulnerable Dodge.png | Description = Increases the distance of dodges and dashes but removes invulnerability frames. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}}"
wikitext
text/x-wiki
{{Infobox/Passive
| image = Vulnerable Dodge.png
| Description = Increases the distance of dodges and dashes but removes invulnerability frames.
}}
'''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}.
{{Navbox/Passives}}
c774d8e6960f89fc80ac704c449f055d907dbf7f
1317
1313
2025-08-23T02:58:33Z
Sharparam
284703
Update image
wikitext
text/x-wiki
{{Infobox/Passive
| image = Universal Passive.png
| Description = Increases the distance of dodges and dashes but removes invulnerability frames.
}}
'''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}.
{{Navbox/Passives}}
11762e3138684cec8a8616597fb1704d9bdc2b56
Template:Navbox/Passives
10
838
1314
2025-08-23T02:55:02Z
Sharparam
284703
Created page with "{{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Passives | title = [[Passives]] | list = * [[Vulnerable Dodge]] }}<noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Passives
| title = [[Passives]]
| list =
* [[Vulnerable Dodge]]
}}<noinclude>{{Documentation}}</noinclude>
1d9aa0a9800b46db02fc440036ec626d8caa4ab5
Template:Navbox/Passives/doc
10
839
1315
2025-08-23T02:55:42Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>
87827f6829955b934e0e8073491c0fef23954bf8
File:Universal Passive.png
6
840
1316
2025-08-23T02:58:09Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Passive_Universal2
}}
This icon is used for several passive abilities in the game.
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Passive_Universal2
}}
This icon is used for several passive abilities in the game.
== Licensing ==
{{License|game}}
6bab71931e37905933cfd1119c55b620985cb04a
Amulet of Arcane Protection
0
516
1318
796
2025-08-23T03:01:16Z
Sharparam
284703
Fix infobox parameters
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Amulet of Arcane Protection.png
| Effects = +1500 [[Technomancy]] armor rating.
| Passives = Techno-Defiance
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
== Location ==
{{coords|4158|-2902|1459}}
Found near the top side of a shortcut ladder in [[Uranopolis]].
{{Navbox/Amulets}}
af3eb8594ad71b370b85017c7913cee955ba3591
File:Amulet of Arcane Protection.png
6
841
1319
2025-08-23T03:02:25Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace68_512
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace68_512
}}
== Licensing ==
{{License|game}}
4f036d0b23a09dd85f8c3f14dd62335dd75fc5a0
Amulet of Evasion
0
517
1320
798
2025-08-23T03:02:49Z
Sharparam
284703
Fix infobox parameters
wikitext
text/x-wiki
{{Infobox/Amulet
| title = {{PAGENAME}}
| image = Amulet of Evasion.png
| Passives = Extended Evasion
}}
'''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}.
== Location ==
{{coords|1251|-8419|551}}
Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right, behind a building.
{{Navbox/Amulets}}
4d3fe784a7954d14811807b628f35ce7b9a209b7
File:Amulet of Evasion.png
6
842
1321
2025-08-23T03:03:29Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace30_512
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace30_512
}}
== Licensing ==
{{License|game}}
0d1e6efa1700da514e282787ea2ace8e7908f4bc
Template:Navbox/Rings
10
292
1323
1287
2025-08-23T03:05:49Z
Sharparam
284703
Add [[Ring of Lifesteal]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Rings
| title = [[Rings]]
| list1=
* [[Ring of Arcane|Arcane]]
* [[Ring of Blessed Hand|Blessed Hand]]
* [[Ring of Burning Desire|Burning Desire]]
* [[Ring of Casting Speed|Casting Speed]]
* [[Ring of Colossus|Colossus]]
* [[Ring of Command|Command]]
* [[Ring of Decay|Decay]]
* [[Ring of Degravitas|Degravitas]]
* [[Ring of Entropy|Entropy]]
* [[Ring of Giant|Giant]]
* [[Ring of Gluttony|Gluttony]]
* [[Ring of Gravitas|Gravitas]]
* [[Ring of Hawk|Hawk]]
* [[Ring of Lifesteal|Lifesteal]]
** [[Ring of Minor Lifesteal|Minor]]
* [[Ring of Potential|Potential]]
** [[Ring of Minor Potential|Minor]]
* [[Ring of Penetration|Penetration]]
* [[Ring of Power|Power]]
* [[Ring of Rammstein|Rammstein]]
* [[The Scholar's Ring|Scholar]]
* [[Ring of Serpent|Serpent]]
* [[Ring of Silence|Silence]]
* [[Ring of Slumber|Slumber]]
* [[Ring of Speed|Speed]]
* [[Ring of Stamina|Stamina]]
** [[Ring of Lesser Stamina|Lesser]]
* [[Ring of Talent|Talent]]
** [[Ring of Lesser Talent|Lesser]]
** [[Ring of Exceeding Talent|Exceeding]]
* [[Ring of Travel|Travel]]
* Vitality
** [[Ring of Minor Vitality|Minor]]
** [[Ring of Greater Vitality|Greater]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
bdc1ecefbf4e035927c18284c74a4cacd77078b4
Template:Navbox/Armor
10
439
1324
1297
2025-08-23T03:07:35Z
Sharparam
284703
Add [[Vengeance]] armor pieces
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Armor
| title = [[Armor]]
| group1 = [[Helmets]]
| list1 =
* [[Bone Helmet]]
* [[Citadel Defender Helmet]]
* [[Citadel Warrior Helmet]]
* [[Contractor Helmet]]
* [[Crude Helmet]]
* [[Desert Corp Helmet]]
* [[Deserts Respirator Helmet]]
* [[Elipse Helmet]]
* [[Eris]]
* [[Hunter Mask]]
* [[Hunter Prowler Mask]]
* [[Hunter Veteran Mask]]
* [[Iron Helmet]]
* [[Librarian Hood]]
* [[Mechacenturion]]
* [[Plagued Revenant Helmet]]
* [[Ranger Helmet]]
* [[Reinforced Bone Helmet]]
* [[Restless Helmet]]
* [[Ronin Helmet]]
* [[Sentinel Helmet]]
* [[Skullface Helmet]]
* [[Spectre Helmet]]
* [[Stalker's Hood]]
* [[Technomancer Helmet]]
* [[Techpriest Helmet]]
* [[Templar Helmet]]
* [[Titan Slayer Helmet]]
* [[Vengeance Helmet]]
* [[Visage Respirator Helmet]]
* [[Zealot Helmet]]
| group2 = [[Pauldrons]]
| list2 =
* [[Bone Shoulders]]
* [[Citadel Defender Shoulders]]
* [[Citadel Warrior Shoulders]]
* [[Crow Shoulders]]
* [[Desert Corp Shoulders]]
* [[Hunter Pauldrons]]
* [[Hunter Shoulders]]
* [[Ranger Shoulders]]
* [[Reinforced Bone Shoulders]]
* [[Restless Shoulders]]
* [[Ronin Shoulders]]
* [[Spectre Shoulders]]
* [[Templar Shoulders]]
* [[Titan Slayer Shoulders]]
* [[Zealot Overcoat]]
| group3 = [[Chestguards]]
| list3 =
* [[Bone Cuirass]]
* [[Citadel Defender Chest]]
* [[Citadel Warrior Chest]]
* [[Contractor Chestpiece]]
* [[Corrupted Cuirass]]
* [[Crow Cuirass]]
* [[Desert Corp Cuirass]]
* [[Hunter Coat]]
* [[Hunter Garb]]
* [[Librarian Overcoat]]
* [[Ranger Chestguard]]
* [[Reinforced Bone Cuirass]]
* [[Restless Cuirass]]
* [[Ronin Cuirass]]
* [[Sentinel Chest]]
* [[Spectre Cuirass]]
* [[Stalker's Cuirass]]
* [[Technomancer Chestpiece]]
* [[Templar Chestpiece]]
* [[Titan Slayer Cuirass]]
* [[Utility Uniform Jacket]]
* [[Vengeance Cuirass]]
* [[Zealot Chestpiece]]
| group4 = [[Legguards]]
| list4 =
* [[Bone Legs]]
* [[Citadel Defender Legguards]]
* [[Citadel Warrior Legguards]]
* [[Contractor Legs]]
* [[Crow Legguard]]
* [[Desert Corp Legs]]
* [[Hunter Legguards]]
* [[Librarian Trousers]]
* [[Ranger Pants]]
* [[Reinforced Bone Legguard]]
* [[Restless Legguard]]
* [[Ronin Pants]]
* [[Sentinel Legguard]]
* [[Spectre Pants]]
* [[Stalker's Pants]]
* [[Technomancer Legs]]
* [[Templar Legs]]
* [[Titan Slayer Legs]]
* [[Utility Uniform Pants]]
* [[Vengeance Legs]]
* [[Zealot Legs]]
| group5 = [[Gauntlets]]
| list5 =
* [[Bone Gloves]]
* [[Citadel Defender Gauntlets]]
* [[Citadel Warrior Gauntlets]]
* [[Contractor Gloves]]
* [[Desert Corp Gloves]]
* [[Hunter Gloves]]
* [[Ranger Gloves]]
* [[Reinforced Bone Gauntlets]]
* [[Restless Gauntlets]]
* [[Ronin Gauntlets]]
* [[Sentinel Gauntlets]]
* [[Spectre Gauntlets]]
* [[Stalker's Gloves]]
* [[Technomancer Gloves]]
* [[Templar Gloves]]
* [[Titan Slayer Gloves]]
* [[Utility Uniform Gloves]]
* [[Vengeance Gauntlets]]
* [[Zealot Gloves]]
| group6 = [[Armor sets|Sets]]
| list6 =
* [[Bone]]
* [[Citadel Defender]]
* [[Citadel Warrior]]
* [[Contractor]]
* [[Corrupted (armor set)|Corrupted]]
* [[Crow]]
* [[Desert Corp]]
* [[Librarian (armor set)|Librarian]]
* [[Ranger]]
* [[Reinforced Bone]]
* [[Restless]]
* [[Ronin (armor set)|Ronin]]
* [[Sentinel]]
* [[Spectre (armor set)|Spectre]]
* [[Stalker]]
* [[Technomancer (armor set)|Technomancer]]
* [[Techpriest]]
* [[Templar (armor set)|Templar]]
* [[Titan Slayer (armor set)|Titan Slayer]]
* [[Utility Uniform]]
* [[Vengeance]]
* [[Zealot (armor set)|Zealot]]
| group7 = [[Shields]]
| list7 = {{Navbox/Shields|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
daaa58c3a186b831e3a3961cbe57bf86dbe72b04
Intelligence
0
843
1325
2025-08-23T03:19:49Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[flux]] and [[technomancy]] damage. == Overview == Maximum flux increases by 5 between levels 6 and 100, then drops to 2 until level 200. After level 200, maximum flux will increase by 1 for each level. The damage increase varies as the attribute is increased, see the table for details. After intelligence reaches level 200, damage will no longer increase, making the hardcap for bonus damag..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[flux]] and [[technomancy]] damage.
== Overview ==
Maximum flux increases by 5 between levels 6 and 100, then drops to 2 until level 200. After level 200, maximum flux will increase by 1 for each level.
The damage increase varies as the attribute is increased, see the table for details. After intelligence reaches level 200, damage will no longer increase, making the hardcap for bonus damage 830%.
{| class="wikitable sortable sticky-header-multi hover-highlight mw-collapsible mw-collapsed" style="text-align: right;"
|-
! class="unsortable" scope="col" rowspan="2" | Intelligence
! class="unsortable" scope="col" rowspan="2" | Max flux
! class="unsortable" scope="col" rowspan="2" | +Tech dmg
! class="unsortable" scope="col" colspan="2" | Increments
|-
! class="unsortable" scope="col" | Max flux
! class="unsortable" scope="col" | +Tech dmg
|-
| 0 || 90 || 80% || 0 || 0%
|-
| 1 || 90 || 80% || 0 || 0%
|-
| 2 || 90 || 80% || 0 || 0%
|-
| 3 || 90 || 80% || 0 || 0%
|-
| 4 || 90 || 80% || 0 || 0%
|-
| 5 || 90 || 80% || 0 || 0%
|-
| 6 || 95 || 83% || 5 || 3%
|-
| 7 || 100 || 86% || 5 || 3%
|-
| 8 || 105 || 89% || 5 || 3%
|-
| 9 || 110 || 92% || 5 || 3%
|-
| 10 || 115 || 95% || 5 || 3%
|-
| 11 || 120 || 99% || 5 || 4%
|-
| 12 || 125 || 103% || 5 || 4%
|-
| 13 || 130 || 107% || 5 || 4%
|-
| 14 || 135 || 111% || 5 || 4%
|-
| 15 || 140 || 115% || 5 || 4%
|-
| 16 || 145 || 120% || 5 || 5%
|-
| 17 || 150 || 125% || 5 || 5%
|-
| 18 || 155 || 130% || 5 || 5%
|-
| 19 || 160 || 135% || 5 || 5%
|-
| 20 || 165 || 140% || 5 || 5%
|-
| 21 || 170 || 150% || 5 || 10%
|-
| 22 || 175 || 160% || 5 || 10%
|-
| 23 || 180 || 170% || 5 || 10%
|-
| 24 || 185 || 180% || 5 || 10%
|-
| 25 || 190 || 190% || 5 || 10%
|-
| 26 || 195 || 200% || 5 || 10%
|-
| 27 || 200 || 210% || 5 || 10%
|-
| 28 || 205 || 220% || 5 || 10%
|-
| 29 || 210 || 230% || 5 || 10%
|-
| 30 || 215 || 240% || 5 || 10%
|-
| 31 || 220 || 252% || 5 || 12%
|-
| 32 || 225 || 264% || 5 || 12%
|-
| 33 || 230 || 276% || 5 || 12%
|-
| 34 || 235 || 288% || 5 || 12%
|-
| 35 || 240 || 300% || 5 || 12%
|-
| 36 || 245 || 312% || 5 || 12%
|-
| 37 || 250 || 324% || 5 || 12%
|-
| 38 || 255 || 336% || 5 || 12%
|-
| 39 || 260 || 348% || 5 || 12%
|-
| 40 || 265 || 360% || 5 || 12%
|-
| 41 || 270 || 372% || 5 || 12%
|-
| 42 || 275 || 384% || 5 || 12%
|-
| 43 || 280 || 396% || 5 || 12%
|-
| 44 || 285 || 408% || 5 || 12%
|-
| 45 || 290 || 420% || 5 || 12%
|-
| 46 || 295 || 432% || 5 || 12%
|-
| 47 || 300 || 444% || 5 || 12%
|-
| 48 || 305 || 456% || 5 || 12%
|-
| 49 || 310 || 468% || 5 || 12%
|-
| 50 || 315 || 480% || 5 || 12%
|-
| 51 || 320 || 483% || 5 || 3%
|-
| 52 || 325 || 486% || 5 || 3%
|-
| 53 || 330 || 489% || 5 || 3%
|-
| 54 || 335 || 492% || 5 || 3%
|-
| 55 || 340 || 495% || 5 || 3%
|-
| 56 || 345 || 498% || 5 || 3%
|-
| 57 || 350 || 501% || 5 || 3%
|-
| 58 || 355 || 504% || 5 || 3%
|-
| 59 || 360 || 507% || 5 || 3%
|-
| 60 || 365 || 510% || 5 || 3%
|-
| 61 || 370 || 513% || 5 || 3%
|-
| 62 || 375 || 516% || 5 || 3%
|-
| 63 || 380 || 519% || 5 || 3%
|-
| 64 || 385 || 522% || 5 || 3%
|-
| 65 || 390 || 525% || 5 || 3%
|-
| 66 || 395 || 528% || 5 || 3%
|-
| 67 || 400 || 531% || 5 || 3%
|-
| 68 || 405 || 534% || 5 || 3%
|-
| 69 || 410 || 537% || 5 || 3%
|-
| 70 || 415 || 540% || 5 || 3%
|-
| 71 || 420 || 543% || 5 || 3%
|-
| 72 || 425 || 546% || 5 || 3%
|-
| 73 || 430 || 549% || 5 || 3%
|-
| 74 || 435 || 552% || 5 || 3%
|-
| 75 || 440 || 555% || 5 || 3%
|-
| 76 || 445 || 558% || 5 || 3%
|-
| 77 || 450 || 561% || 5 || 3%
|-
| 78 || 455 || 564% || 5 || 3%
|-
| 79 || 460 || 567% || 5 || 3%
|-
| 80 || 465 || 570% || 5 || 3%
|-
| 81 || 470 || 573% || 5 || 3%
|-
| 82 || 475 || 576% || 5 || 3%
|-
| 83 || 480 || 579% || 5 || 3%
|-
| 84 || 485 || 582% || 5 || 3%
|-
| 85 || 490 || 585% || 5 || 3%
|-
| 86 || 495 || 588% || 5 || 3%
|-
| 87 || 500 || 591% || 5 || 3%
|-
| 88 || 505 || 594% || 5 || 3%
|-
| 89 || 510 || 597% || 5 || 3%
|-
| 90 || 515 || 600% || 5 || 3%
|-
| 91 || 520 || 603% || 5 || 3%
|-
| 92 || 525 || 606% || 5 || 3%
|-
| 93 || 530 || 609% || 5 || 3%
|-
| 94 || 535 || 612% || 5 || 3%
|-
| 95 || 540 || 615% || 5 || 3%
|-
| 96 || 545 || 618% || 5 || 3%
|-
| 97 || 550 || 621% || 5 || 3%
|-
| 98 || 555 || 624% || 5 || 3%
|-
| 99 || 560 || 627% || 5 || 3%
|-
| 100 || 565 || 630% || 5 || 3%
|-
| 101 || 567 || 632% || 2 || 2%
|-
| 102 || 569 || 634% || 2 || 2%
|-
| 103 || 571 || 636% || 2 || 2%
|-
| 104 || 573 || 638% || 2 || 2%
|-
| 105 || 575 || 640% || 2 || 2%
|-
| 106 || 577 || 642% || 2 || 2%
|-
| 107 || 579 || 644% || 2 || 2%
|-
| 108 || 581 || 646% || 2 || 2%
|-
| 109 || 583 || 648% || 2 || 2%
|-
| 110 || 585 || 650% || 2 || 2%
|-
| 111 || 587 || 652% || 2 || 2%
|-
| 112 || 589 || 654% || 2 || 2%
|-
| 113 || 591 || 656% || 2 || 2%
|-
| 114 || 593 || 658% || 2 || 2%
|-
| 115 || 595 || 660% || 2 || 2%
|-
| 116 || 597 || 662% || 2 || 2%
|-
| 117 || 599 || 664% || 2 || 2%
|-
| 118 || 601 || 666% || 2 || 2%
|-
| 119 || 603 || 668% || 2 || 2%
|-
| 120 || 605 || 670% || 2 || 2%
|-
| 121 || 607 || 672% || 2 || 2%
|-
| 122 || 609 || 674% || 2 || 2%
|-
| 123 || 611 || 676% || 2 || 2%
|-
| 124 || 613 || 678% || 2 || 2%
|-
| 125 || 615 || 680% || 2 || 2%
|-
| 126 || 617 || 682% || 2 || 2%
|-
| 127 || 619 || 684% || 2 || 2%
|-
| 128 || 621 || 686% || 2 || 2%
|-
| 129 || 623 || 688% || 2 || 2%
|-
| 130 || 625 || 690% || 2 || 2%
|-
| 131 || 627 || 692% || 2 || 2%
|-
| 132 || 629 || 694% || 2 || 2%
|-
| 133 || 631 || 696% || 2 || 2%
|-
| 134 || 633 || 698% || 2 || 2%
|-
| 135 || 635 || 700% || 2 || 2%
|-
| 136 || 637 || 702% || 2 || 2%
|-
| 137 || 639 || 704% || 2 || 2%
|-
| 138 || 641 || 706% || 2 || 2%
|-
| 139 || 643 || 708% || 2 || 2%
|-
| 140 || 645 || 710% || 2 || 2%
|-
| 141 || 647 || 712% || 2 || 2%
|-
| 142 || 649 || 714% || 2 || 2%
|-
| 143 || 651 || 716% || 2 || 2%
|-
| 144 || 653 || 718% || 2 || 2%
|-
| 145 || 655 || 720% || 2 || 2%
|-
| 146 || 657 || 722% || 2 || 2%
|-
| 147 || 659 || 724% || 2 || 2%
|-
| 148 || 661 || 726% || 2 || 2%
|-
| 149 || 663 || 728% || 2 || 2%
|-
| 150 || 665 || 730% || 2 || 2%
|-
| 151 || 667 || 732% || 2 || 2%
|-
| 152 || 669 || 734% || 2 || 2%
|-
| 153 || 671 || 736% || 2 || 2%
|-
| 154 || 673 || 738% || 2 || 2%
|-
| 155 || 675 || 740% || 2 || 2%
|-
| 156 || 677 || 742% || 2 || 2%
|-
| 157 || 679 || 744% || 2 || 2%
|-
| 158 || 681 || 746% || 2 || 2%
|-
| 159 || 683 || 748% || 2 || 2%
|-
| 160 || 685 || 750% || 2 || 2%
|-
| 161 || 687 || 752% || 2 || 2%
|-
| 162 || 689 || 754% || 2 || 2%
|-
| 163 || 691 || 756% || 2 || 2%
|-
| 164 || 693 || 758% || 2 || 2%
|-
| 165 || 695 || 760% || 2 || 2%
|-
| 166 || 697 || 762% || 2 || 2%
|-
| 167 || 699 || 764% || 2 || 2%
|-
| 168 || 701 || 766% || 2 || 2%
|-
| 169 || 703 || 768% || 2 || 2%
|-
| 170 || 705 || 770% || 2 || 2%
|-
| 171 || 707 || 772% || 2 || 2%
|-
| 172 || 709 || 774% || 2 || 2%
|-
| 173 || 711 || 776% || 2 || 2%
|-
| 174 || 713 || 778% || 2 || 2%
|-
| 175 || 715 || 780% || 2 || 2%
|-
| 176 || 717 || 782% || 2 || 2%
|-
| 177 || 719 || 784% || 2 || 2%
|-
| 178 || 721 || 786% || 2 || 2%
|-
| 179 || 723 || 788% || 2 || 2%
|-
| 180 || 725 || 790% || 2 || 2%
|-
| 181 || 727 || 792% || 2 || 2%
|-
| 182 || 729 || 794% || 2 || 2%
|-
| 183 || 731 || 796% || 2 || 2%
|-
| 184 || 733 || 798% || 2 || 2%
|-
| 185 || 735 || 800% || 2 || 2%
|-
| 186 || 737 || 802% || 2 || 2%
|-
| 187 || 739 || 804% || 2 || 2%
|-
| 188 || 741 || 806% || 2 || 2%
|-
| 189 || 743 || 808% || 2 || 2%
|-
| 190 || 745 || 810% || 2 || 2%
|-
| 191 || 747 || 812% || 2 || 2%
|-
| 192 || 749 || 814% || 2 || 2%
|-
| 193 || 751 || 816% || 2 || 2%
|-
| 194 || 753 || 818% || 2 || 2%
|-
| 195 || 755 || 820% || 2 || 2%
|-
| 196 || 757 || 822% || 2 || 2%
|-
| 197 || 759 || 824% || 2 || 2%
|-
| 198 || 761 || 826% || 2 || 2%
|-
| 199 || 763 || 828% || 2 || 2%
|-
| 200 || 765 || 830% || 2 || 2%
|}
[[Category:Attributes]]
904a952540b7b412f5d5b7f4b0504f5a22f5ddda
Constitution
0
844
1326
2025-08-23T03:26:18Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[health]] and stagger resistance. == Overview == Maximum health starts at 200, with each additional level increasing it by 0, 25, or 50 (see the table for details). After level 65, maximum health increases by 25 for each level. Stagger resistance starts at 5%. Level 6 gives the first increase to stagger resistance by 0.5%, which continues until 45, after which it drops to 0, making the har..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[health]] and stagger resistance.
== Overview ==
Maximum health starts at 200, with each additional level increasing it by 0, 25, or 50 (see the table for details). After level 65, maximum health increases by 25 for each level.
Stagger resistance starts at 5%. Level 6 gives the first increase to stagger resistance by 0.5%, which continues until 45, after which it drops to 0, making the hardcap for bonus stagger resist 25%.
{| class="wikitable sortable sticky-header-multi hover-highlight mw-collapsible mw-collapsed" style="text-align: right;"
|-
! class="unsortable" scope="col" rowspan="2" | Constitution
! class="unsortable" scope="col" rowspan="2" | Max HP
! class="unsortable" scope="col" rowspan="2" | +Stagger res
! class="unsortable" scope="col" colspan="2" | Increments
|-
! class="unsortable" scope="col" | Max HP
! class="unsortable" scope="col" | +Stagger res
|-
| 0 || {{fnum|200}} || 5.0% || 50 || 5.0%
|-
| 1 || {{fnum|200}} || 5.0% || 0 || 0.0%
|-
| 2 || {{fnum|225}} || 5.0% || 25 || 0.0%
|-
| 3 || {{fnum|250}} || 5.0% || 25 || 0.0%
|-
| 4 || {{fnum|275}} || 5.0% || 25 || 0.0%
|-
| 5 || {{fnum|300}} || 5.0% || 25 || 0.0%
|-
| 6 || {{fnum|325}} || 5.5% || 25 || 0.5%
|-
| 7 || {{fnum|350}} || 6.0% || 25 || 0.5%
|-
| 8 || {{fnum|400}} || 6.5% || 50 || 0.5%
|-
| 9 || {{fnum|425}} || 7.0% || 25 || 0.5%
|-
| 10 || {{fnum|475}} || 7.5% || 50 || 0.5%
|-
| 11 || {{fnum|500}} || 8.0% || 25 || 0.5%
|-
| 12 || {{fnum|525}} || 8.5% || 25 || 0.5%
|-
| 13 || {{fnum|575}} || 9.0% || 50 || 0.5%
|-
| 14 || {{fnum|600}} || 9.5% || 25 || 0.5%
|-
| 15 || {{fnum|650}} || 10.0% || 50 || 0.5%
|-
| 16 || {{fnum|700}} || 10.5% || 50 || 0.5%
|-
| 17 || {{fnum|750}} || 11.0% || 50 || 0.5%
|-
| 18 || {{fnum|800}} || 11.5% || 50 || 0.5%
|-
| 19 || {{fnum|850}} || 12.0% || 50 || 0.5%
|-
| 20 || {{fnum|900}} || 12.5% || 50 || 0.5%
|-
| 21 || {{fnum|925}} || 13.0% || 25 || 0.5%
|-
| 22 || {{fnum|950}} || 13.5% || 25 || 0.5%
|-
| 23 || {{fnum|975}} || 14.0% || 25 || 0.5%
|-
| 24 || {{fnum|1000}} || 14.5% || 25 || 0.5%
|-
| 25 || {{fnum|1050}} || 15.0% || 50 || 0.5%
|-
| 26 || {{fnum|1075}} || 15.5% || 25 || 0.5%
|-
| 27 || {{fnum|1100}} || 16.0% || 25 || 0.5%
|-
| 28 || {{fnum|1125}} || 16.5% || 25 || 0.5%
|-
| 29 || {{fnum|1150}} || 17.0% || 25 || 0.5%
|-
| 30 || {{fnum|1200}} || 17.5% || 50 || 0.5%
|-
| 31 || {{fnum|1225}} || 18.0% || 25 || 0.5%
|-
| 32 || {{fnum|1250}} || 18.5% || 25 || 0.5%
|-
| 33 || {{fnum|1275}} || 19.0% || 25 || 0.5%
|-
| 34 || {{fnum|1300}} || 19.5% || 25 || 0.5%
|-
| 35 || {{fnum|1325}} || 20.0% || 25 || 0.5%
|-
| 36 || {{fnum|1350}} || 20.5% || 25 || 0.5%
|-
| 37 || {{fnum|1375}} || 21.0% || 25 || 0.5%
|-
| 38 || {{fnum|1400}} || 21.5% || 25 || 0.5%
|-
| 39 || {{fnum|1425}} || 22.0% || 25 || 0.5%
|-
| 40 || {{fnum|1475}} || 22.5% || 50 || 0.5%
|-
| 41 || {{fnum|1500}} || 23.0% || 25 || 0.5%
|-
| 42 || {{fnum|1525}} || 23.5% || 25 || 0.5%
|-
| 43 || {{fnum|1550}} || 24.0% || 25 || 0.5%
|-
| 44 || {{fnum|1575}} || 24.5% || 25 || 0.5%
|-
| 45 || {{fnum|1600}} || 25.0% || 25 || 0.5%
|-
| 46 || {{fnum|1600}} || 25.0% || 0 || 0.0%
|-
| 47 || {{fnum|1625}} || 25.0% || 25 || 0.0%
|-
| 48 || {{fnum|1650}} || 25.0% || 25 || 0.0%
|-
| 49 || {{fnum|1650}} || 25.0% || 0 || 0.0%
|-
| 50 || {{fnum|1675}} || 25.0% || 25 || 0.0%
|-
| 51 || {{fnum|1700}} || 25.0% || 25 || 0.0%
|-
| 52 || {{fnum|1700}} || 25.0% || 0 || 0.0%
|-
| 53 || {{fnum|1700}} || 25.0% || 0 || 0.0%
|-
| 54 || {{fnum|1700}} || 25.0% || 0 || 0.0%
|-
| 55 || {{fnum|1725}} || 25.0% || 25 || 0.0%
|-
| 56 || {{fnum|1725}} || 25.0% || 0 || 0.0%
|-
| 57 || {{fnum|1725}} || 25.0% || 0 || 0.0%
|-
| 58 || {{fnum|1725}} || 25.0% || 0 || 0.0%
|-
| 59 || {{fnum|1750}} || 25.0% || 25 || 0.0%
|-
| 60 || {{fnum|1750}} || 25.0% || 0 || 0.0%
|-
| 61 || {{fnum|1750}} || 25.0% || 0 || 0.0%
|-
| 62 || {{fnum|1750}} || 25.0% || 0 || 0.0%
|-
| 63 || {{fnum|1750}} || 25.0% || 0 || 0.0%
|-
| 64 || {{fnum|1750}} || 25.0% || 0 || 0.0%
|-
| 65 || {{fnum|1775}} || 25.0% || 25 || 0.0%
|}
[[Category:Attributes]]
c3723f75964d29317b224f3d07316e154a7e63a1
Level
0
707
1327
1096
2025-08-23T03:32:35Z
Sharparam
284703
Add some data for level 30
wikitext
text/x-wiki
{{stub}}
'''{{PAGENAME}}''' is a measure of a player's experience.
== Overview ==
The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects.
The amount of experience points required to reach further levels will regularly increase, although not with every level.
Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2.
The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]].
{| class="wikitable sticky-header hover-highlight" style="text-align: right;"
|-
! scope="col" | Level
! scope="col" | EXP to next
! scope="col" | Cost increase
! scope="col" | Total EXP
! scope="col" | Attribute points
! scope="col" | Total attr points
|-
| 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}} || 0 || 0
|-
| 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}} || 2 || 2
|-
| 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}} || 2 || 4
|-
| 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}} || 2 || 6
|-
| 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}} || 2 || 8
|-
| 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}} || 4 || 12
|-
| 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}} || 2 || 14
|-
| 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}} || 2 || 16
|-
| 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}} || 2 || 18
|-
| 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}} || 2 || 20
|-
| 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}} || 4 || 24
|-
| 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}} || 2 || 26
|-
| 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}} || 2 || 28
|-
| 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}} || 2 || 30
|-
| 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}} || 2 || 32
|-
| 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}} || 4 || 36
|-
| 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}} || 2 || 38
|-
| 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}} || 2 || 40
|-
| 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}} || 2 || 42
|-
| 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}} || 2 || 44
|-
| 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}} || 4 || 48
|-
| 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}} || 2 || 50
|-
| 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}} || 2 || 52
|-
| 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}} || 2 || 54
|-
| 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}} || 2 || 56
|-
| 25 || {{fnum|103420}} || {{fnum|78420}} || {{fnum|430950}} || 6 || 62
|-
| 26 || {{fnum|103430}} || {{fnum|10}} || {{fnum|534370}} || 3 || 65
|-
| 27 || {{fnum|103430}} || {{fnum|0}} || {{fnum|637800}} || 3 || 68
|-
| 28 || {{fnum|103430}} || {{fnum|0}} || {{fnum|741230}} || 3 || 71
|-
| 29 || {{fnum|103430}} || {{fnum|0}} || {{fnum|844660}} || 3 || 74
|-
| 30 || ??? || ??? || {{fnum|948090}} || 6 || 80
|}
[[Category:Game mechanics]]
f6cf6898dcaffb864de12f0ab74a8307f0f83552
Asylum
0
357
1328
477
2025-08-23T04:09:39Z
Sharparam
284703
Add NPC section
wikitext
text/x-wiki
[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls.
}}
== NPCs ==
* [[Inquisitor Commander Alexius]]
{{Navbox/Locations}}
[[Category:Locations]]
f3f760da6e54723bfa17a9677d0604c115bc10b4
1329
1328
2025-08-23T04:10:21Z
Sharparam
284703
Add area boss
wikitext
text/x-wiki
[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls.
}}
== NPCs ==
* [[Inquisitor Commander Alexius]]
== Bosses ==
* [[Plagued Nemesis]]
{{Navbox/Locations}}
[[Category:Locations]]
579690e518d2f45738b4a9969fa23aba0a82777f
MediaWiki:Common.css
8
235
1330
259
2025-08-23T16:43:34Z
Sharparam
284703
Configure accent and content border color for dark theme
css
text/css
/* CSS placed here will be applied to all skins */
/******************************************************************************************
********************************* Start user-edit variables *******************************
******************************************************************************************/
/*****************************************
****** START BASIC DESIGN VARIABLES ******
----------------------------------------*/
:root {
--wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif;
--wiki-sidebar-heading-font-family: sans-serif;
--wiki-content-border-radius: 0px;
--wiki-sidebar-border-radius: 0px;
}
/*----------------------------------------
******* END BASIC DESIGN VARIABLES *******
*****************************************/
/*****************************************
****** START BASIC COLOR VARIABLES *******
----------------------------------------*/
:root,
/* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=light, */
/* individual themes are prefixed with .theme- instead */
.view-light {
/**********************
* Probably edit these * [ LIGHT VIEW ]
***********************/
--wiki-body-background-color: #F6F6F6;
--wiki-body-background-image: url(filepath://Site-background.jpg);
--wiki-content-background-color: #ffffff;
--wiki-content-background-opacity: 100%;
--wiki-content-border-color: #a7d7f9;
--wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ LIGHT VIEW ] */
--wiki-accent-color: #3366cc;
--wiki-accent-label-color: #ffffff;
--wiki-accent-link-color: #D5FB51;
--wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
}
/* end light styles */
/* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=dark, */
/* individual themes are prefixed with .theme- instead */
.view-dark {
/**********************
* Probably edit these * [ DARK VIEW ]
***********************/
--wiki-body-background-color: #171717;
--wiki-body-background-image: url(filepath://Site-background-dark.jpg);
--wiki-content-background-color: #202020;
--wiki-content-background-opacity: 90%;
/* DEFAULT: --wiki-content-border-color: #991A51; */
--wiki-content-border-color: hsl(0deg 0% 60%);
--wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ DARK VIEW ] */
/* DEFAULT: --wiki-accent-color: #ff4d9d; */
--wiki-accent-color: hsl(0deg 0% 75%);
--wiki-accent-label-color: #000;
--wiki-accent-link-color: #1e1e43;
--wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
}
/* End dark styles */
/*----------------------------------------
******* END BASIC COLOR VARIABLES ********
*****************************************/
/*****************************************
**** START ADVANCED COLOR VARIABLES ******
----------------------------------------*/
:root,
.view-light {
/*******************
* Maybe edit these * [ LIGHT VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #111111;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #ba0000;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ LIGHT VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ LIGHT VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #bf0017;
--wiki-warning-color: #b05f30;
--wiki-success-color: #0c742f;
/**/
/***********************************
* Likely do not need to edit these * [ LIGHT VIEW ]
************************************/
--wiki-body-dynamic-color: #000000;
--wiki-body-dynamic-color--inverted: #ffffff;
--wiki-body-dynamic-color--secondary: #333333;
--wiki-body-dynamic-color--secondary--inverted: #cccccc;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #ffffff;
--wiki-content-dynamic-color: #000000;
--wiki-content-dynamic-color--inverted: #ffffff;
--wiki-content-dynamic-color--secondary: #333333;
--wiki-content-dynamic-color--secondary--inverted: #cccccc;
/* [ LIGHT VIEW ] */
--wiki-alert-label-color: #ffffff;
--wiki-warning-label-color: #ffffff;
--wiki-success-label-color: #ffffff;
--wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */
/**/
}
.view-dark {
/*******************
* Maybe edit these * [ DARK VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #ededed;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #FC5B4F;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ DARK VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ DARK VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #ff576a;
--wiki-warning-color: #cf721c;
--wiki-success-color: #13aa45;
/**/
/***********************************
* Likely do not need to edit these * [ DARK VIEW ]
************************************/
--wiki-body-dynamic-color: #ffffff;
--wiki-body-dynamic-color--inverted: #000000;
--wiki-body-dynamic-color--secondary: #cccccc;
--wiki-body-dynamic-color--secondary--inverted: #333333;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #000;
--wiki-content-dynamic-color: #ffffff;
--wiki-content-dynamic-color--inverted: #000000;
--wiki-content-dynamic-color--secondary: #cccccc;
--wiki-content-dynamic-color--secondary--inverted: #333333;
/* [ DARK VIEW ] */
--wiki-alert-label-color: #000000;
--wiki-warning-label-color: #000000;
--wiki-success-label-color: #000000;
--wiki-icon-general-filter: invert(100%);
}
/*----------------------------------------
***** END ADVANCED COLOR VARIABLES *******
*****************************************/
/*****************************************
**** START ADVANCED DESIGN VARIABLES *****
----------------------------------------*/
:root {
/***********************
start logo position
----------------------*/
--wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */
--wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */
--wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */
--wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */
--wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */
/*-----------------------
end logo position
***********************/
--wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */
--wiki-body-font-family: sans-serif;
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-width: 1px;
--wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */
--wiki-sidebar-portal-spacing: 0px;
--wiki-sidebar-border-width: var(--wiki-content-border-width);
--wiki-navigation-border-radius: 0px; /* border radius of tabs */
/*******************
* Maybe edit these * [ DESIGN ]
********************/
--wiki-logo-filter: none;
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-top-radius: var(--wiki-content-border-radius);
--wiki-content-border-style: solid;
--wiki-content-border-image: none;
--wiki-content-backdrop-filter: none;
--wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */
--wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */
--wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-margin: 0.5em;
--wiki-sidebar-list-item-padding: 0.25em 0.25rem;
--wiki-sidebar-list-padding: 0.25rem;
--wiki-sidebar-list-item-background--hover: none; /* background of hover item */
--wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */
--wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */
--wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-box-background-color: var(--wiki-content-background-color);
--wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content));
--wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
--wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
/* nav tabs style. The vector gradient is default.
* If you want to customize the style of tabs, it's easier to start with the following settings:
* --wiki-navigation-background-image: none;
* --wiki-navigation-selected-background-image: none;
* --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px );
* --wiki-navigation-selected-border-bottom-background: none;
* --wiki-navigation-tab-spacing: 0.25em;
* --wiki-navigation-tab-padding-top: 0.5em;
* --wiki-navigation-tab-padding-bottom: 0.5em;
*/
--wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */
--wiki-navigation-tab-padding-top: 1.25em;
--wiki-navigation-tab-padding-x: 0.75em;
--wiki-navigation-tab-padding-bottom: 4px;
--wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */
--wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */
--wiki-navigation-border-image: none;
--wiki-navigation-selected-border-image: var(--wiki-navigation-border-image);
--wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%);
--wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x;
--wiki-navigation-background-position: left bottom, right bottom, left bottom;
--wiki-navigation-background-size: 1px 100%, 1px 100%, 100%;
--wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%);
--wiki-navigation-selected-background-repeat: no-repeat, no-repeat;
--wiki-navigation-selected-background-position: left bottom, right bottom;
--wiki-navigation-selected-background-size: 1px 100%, 1px 100%;
--wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px);
/* affects the dropdown menu under More */
--wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color);
--wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color);
--wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */
--wiki-navigation-dropdown-border-width: 1px;
--wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius);
--wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */
--wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */
--wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */
--wiki-navigation-dropdown-border-image: none;
--wiki-navigation-dropdown-backdrop-filter: none;
--wiki-navigation-dropdown-box-shadow: none; /* box shadow */
/* styles of the footer */
--wiki-spacing-before-footer: 0px;
--wiki-footer-border-image: none;
/* padding on body element */
--wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */
--wiki-left-spacing: 0.5em;
--wiki-right-spacing: 1em;
--wiki-bottom-spacing: 2em;
/* end design variables */
}
/*----------------------------------------
***** END ADVANCED DESIGN VARIABLES ******
*****************************************/
/*******************************
**** START SHARED VARIABLES ****
**** tl;dr: don't edit this ****
********************************/
/*
These variables are rarely touched, usually inherit other variables, and are shared on all themes.
In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision,
understand what you are doing, and *know* that what you are trying to do is not accomplished by changing
another variable in the above sections.
Since these are by default shared across all themes, if you support multiple themes you'll probably want to
separate the variables you want to modify here into .view-x blocks like above. If you don't understand
what that means or how to do that then you probably shouldn't be modifying this section.
*/
:root {
--wiki-content-border-bottom-width: var(--wiki-content-border-width);
--wiki-content-border-bottom-style: var(--wiki-content-border-style);
--wiki-content-border-bottom-color: var(--wiki-content-border-color);
--wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%);
--wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color));
--wiki-content-text-color--hover: var(--wiki-content-text-color);
/* heading */
--wiki-content-heading-border-bottom-width: 1px;
--wiki-content-heading-border-style: solid;
--wiki-content-heading-font-weight: normal;
--wiki-content-heading-font-style: normal;
--wiki-content-heading-text-transform: none;
--wiki-content-heading-line-height: normal;
--wiki-content-heading-text-shadow: none;
/* first heading (h1) */
--wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width);
--wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family);
--wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight);
--wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style);
--wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform);
--wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-firstheading-color: var(--wiki-content-heading-color);
--wiki-content-firstheading-text-shadow: none;
/* sub-heading (h3, h4, h5, h6) */
--wiki-content-subheading-border-bottom-width: 0px;
--wiki-content-subheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-subheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-subheading-font-family: var(--wiki-body-font-family);
--wiki-content-subheading-font-weight: bold;
--wiki-content-subheading-font-style: normal;
--wiki-content-subheading-text-transform: none;
--wiki-content-subheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-subheading-color: var(--wiki-content-heading-color);
--wiki-content-subheading-text-shadow: none;
/* heading size */
--wiki-content-firstheading-font-size: 1.8em;
--wiki-content-heading-h2-font-size: 1.5em;
--wiki-content-heading-h3-font-size: 1.2em;
--wiki-content-heading-h4-font-size: 114%;
--wiki-content-heading-h5-font-size: 108%;
--wiki-content-heading-h6-font-size: 100%;
--wiki-content-toc-background: var(--wiki-content-background-color--secondary);
--wiki-content-toc-border-width: 1px;
--wiki-content-toc-border-style: solid;
--wiki-content-toc-border-color: var(--wiki-content-border-color);
--wiki-content-toc-border-radius: 0px;
--wiki-content-toc-border-image: none;
--wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000;
--wiki-content-catlinks-background: var(--wiki-content-background-color--secondary);
--wiki-content-catlinks-border-width: 1px;
--wiki-content-catlinks-border-style: solid;
--wiki-content-catlinks-border-color: var(--wiki-content-border-color);
--wiki-content-catlinks-border-radius: 0px;
--wiki-content-catlinks-border-image: none;
--wiki-content-catlinks-box-shadow: none;
--wiki-content-filetoc-background: var(--wiki-content-background-color--secondary);
--wiki-content-filetoc-border-width: 1px;
--wiki-content-filetoc-border-style: solid;
--wiki-content-filetoc-border-color: var(--wiki-content-border-color);
--wiki-content-filetoc-border-radius: 0px;
--wiki-content-filetoc-border-image: none;
--wiki-content-filetoc-box-shadow: none;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
--wiki-sidebar-padding: 0px;
--wiki-sidebar-background-color: var(--wiki-content-background-color);
--wiki-sidebar-background-opacity: var(--wiki-content-background-opacity);
--wiki-sidebar-background-image: none;
--wiki-sidebar-background-position: center;
--wiki-sidebar-background-repeat: repeat;
--wiki-sidebar-background-size: auto;
--wiki-sidebar-filter: none;
--wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-sidebar-border-color: var(--wiki-content-border-color);
--wiki-sidebar-border-style: solid;
--wiki-sidebar-border-image: none;
--wiki-sidebar-link-color: var(--wiki-content-link-color);
--wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-sidebar-heading-color: var(--wiki-content-heading-color);
--wiki-sidebar-heading-font-weight: normal;
--wiki-sidebar-heading-font-style: normal;
--wiki-sidebar-heading-text-transform: none;
--wiki-sidebar-heading-line-height: normal;
--wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem;
--wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-text-shadow: none;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter);
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-box-padding: 0px;
--wiki-sidebar-box-background: none;
--wiki-sidebar-box-border: 0px;
--wiki-sidebar-box-border-image: none;
--wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color));
--wiki-footer-border-width: var(--wiki-content-border-width);
--wiki-footer-border-style: var(--wiki-content-border-style);
--wiki-footer-border-color: var(--wiki-content-border-color);
--wiki-footer-background-color: var(--wiki-content-background-color);
--wiki-footer-background-opacity: var(--wiki-content-background-opacity);
--wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-footer-text-color: var(--wiki-content-text-color);
--wiki-footer-link-color: var(--wiki-content-link-color);
--wiki-footer-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-footer-border-radius: var(--wiki-content-border-radius);
--wiki-navigation-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-background-color--hover: var(--wiki-navigation-background-color);
--wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity);
--wiki-navigation-background-image--hover: var(--wiki-navigation-background-image);
--wiki-navigation-background-position--hover: var(--wiki-navigation-background-position);
--wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat);
--wiki-navigation-background-size--hover: var(--wiki-navigation-background-size);
--wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover);
--wiki-navigation-transform--hover: none;
--wiki-navigation-selected-border-style: solid;
--wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-border-style: solid;
--wiki-navigation-border-color--hover: var(--wiki-navigation-border-color);
--wiki-navigation-border-image--hover: var(--wiki-navigation-border-image);
--wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style);
--wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px));
--wiki-navigation-icon-size: 1em;
--wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x);
--wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */
--wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color);
--wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-dropdown-offset: 0px; /* vertical offset */
--wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-search-background-image: none;
--wiki-navigation-search-background-position: 0;
--wiki-navigation-search-background-size: auto;
--wiki-navigation-search-background-repeat: repeat;
--wiki-navigation-search-backdrop-filter: none;
--wiki-navigation-search-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-search-border-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-border-style: solid;
--wiki-navigation-search-border-width: 1px;
--wiki-navigation-search-border-radius: 2px;
--wiki-navigation-search-border-image: none;
--wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image);
--wiki-navigation-search-box-shadow: none;
--wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow);
--wiki-navigation-search-text-color: var(--wiki-content-text-color);
--wiki-navigation-search-font-size: var(--wiki-navigation-font-size);
--wiki-navigation-search-height: 2em;
--wiki-navigation-search-button-color: currentColor;
--wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color);
--wiki-navigation-search-button-color-opacity: 80%;
--wiki-navigation-search-button-color-opacity--hover: 95%;
--wiki-navigation-search-bottom-spacing: 3px;
--wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent);
--wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */
}
/*** mobile adjustments ***/
@media screen and (max-width: 720px) {
body.has-vector-mobile-menu{
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-margin: 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-margin: 0px 0px -0.5em 0px;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-background-opacity: 100%;
--wiki-navigation-search-border-width: 1px;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
}
}
/*****************************
**** END SHARED VARIABLES ****
******************************/
/******************************************************************************************
********************************* End user-edit variables *********************************
******************************************************************************************/
/******************************
* Fallback for older browsers *
* DONT EDIT THIS *
*******************************/
@supports not (color:color-mix(in srgb, #000, transparent)) {
.view-dark,
.view-light,
:root {
--wiki-content-text-mix-color: var(--wiki-content-text-color);
--wiki-content-text-mix-color-95: var(--wiki-content-background-color);
--wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted);
--wiki-content-border-color--secondary: var(--wiki-content-border-color);
--wiki-content-border-color--accent: var(--wiki-accent-color);
--wiki-accent-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-highlight-background-color: transparent;
}
}
/*****************************
* End older browser fallback *
******************************/
/*****************************
* PortableInfoboxes *
******************************/
:root {
--pi-background: var(--wiki-content-background-color);
--pi-secondary-background: var(--wiki-accent-color);
--pi-secondary-background-label: var(--wiki-accent-label-color);
--pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent);
}
.portable-infobox .pi-title,
.portable-infobox .pi-header {
text-align: center;
font-size: 1.5em;
background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent);
color: var(--pi-secondary-background-label);
}
.portable-infobox .pi-data,
.portable-infobox .pi-group {
background: var(--wiki-content-background-color--secondary);
}
.portable-infobox .pi-image {
padding: 8px;
}
.pi-image-thumbnail {
max-width: 100%;
}
.pi-caption {
color: var(--wiki-content-text-mix-color);
}
.pi-section-navigation .pi-section-tab.pi-section-active,
.pi-section-navigation .pi-section-tab.current,
.pi-media-collection .pi-tab-link.current {
background: var(--pi-secondary-background);
color: var(--pi-secondary-background-label);
}
.pi-collapse > .pi-item:first-child {
cursor: pointer;
}
/* overqualify these to overwrite normal content heading styles */
.mw-body .portable-infobox h2,
.mw-body .portable-infobox h3 {
border-bottom: 0;
font-family: inherit;
font-weight: 700;
margin: 0;
}
/*****************************
* End PortableInfoboxes *
******************************/
/*******************
* Main page layout *
********************/
#mp-container {
display: grid;
gap: 10px;
}
@media screen and (max-width: 990px) {
/* for mobile screens */
#mp-container {
grid-template-areas:var(--main-page-layout--mobile);
grid-template-columns:var(--main-page-layout-columns--mobile, 100%);
}
.mp-box.mp-hide-on-mobile {
display: none;
}
}
@media screen and (min-width: 990px) and (max-width: 1350px) {
/* for narrow screens, between 990px and 1350px */
#mp-container {
grid-template-areas:var(--main-page-layout--tablet);
grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr);
}
.mp-box.mp-hide-on-tablet {
display: none;
}
}
@media screen and (min-width: 1350px) {
/* for all other screens, 1350px and wider */
#mp-container {
grid-template-areas:var(--main-page-layout--desktop);
grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr);
}
.mp-box.mp-hide-on-desktop {
display: none;
}
}
.mp-box {
position: relative;
display: flex;
flex-flow: column nowrap;
width: 100%;
box-sizing: border-box;
background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent);
border: 1px solid var(--wiki-content-border-color);
padding: 0px;
}
.mp-body {
height: 100%;
display: flex;
padding: 0.5em;
flex-flow: column nowrap;
}
.mp-box.centered-content .mp-body {
height: 100%;
display: flex;
flex-flow: column nowrap;
justify-content: space-evenly;
}
.mp-box.has-floating-image {
display: block;
}
.mp-box.has-floating-image .mp-body {
height: unset;
display: block;
}
/* overqualified to override normal heading styles */
.mw-body .mp-box h2 {
text-align: center;
font-weight: bold;
font-family: var(--wiki-content-heading-font-family);
overflow: initial;
border-bottom: 1px solid var(--wiki-content-border-color);
font-size: 150%;
margin: 0;
padding: 5px 0;
color: var(--wiki-content-heading-color);
}
#mp-box-welcome {
text-align: center;
position: relative;
overflow: hidden;
}
#mp-box-welcome h2 {
font-size: 200%;
}
#mp-welcome {
display: flex;
flex-flow: column nowrap;
position: relative;
height: 100%;
z-index: 2;
box-sizing: border-box;
}
#mp-welcome .welcome-subtitle {
height: 100%;
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent);
padding: 0.5em;
}
#mp-banner {
position: absolute;
width: 100%;
height: 100%;
filter: blur(5px);
z-index: -1;
background: url(/images/e/e0/MP_banner.jpg);
background-size: cover;
background-repeat: no-repeat;
background-position: top center;
}
.view-dark #mp-banner {
filter: blur(5px) brightness(50%);
}
.view-light #mp-banner {
filter: blur(5px) contrast(50%);
}
/* [[Template:MP_link]] */
.mp-links {
--gap: 10px;
}
.mp-links > ul {
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin: 2px;
gap: var(--gap);
}
.mp-links > ul > li {
display: flex;
flex-flow: column nowrap;
align-items: stretch;
text-align: center;
box-sizing: border-box;
flex: max(calc(50% - var(--gap)), 5em) 1 1;
outline: 1px solid var(--wiki-content-link-color);
transition: 0.1s ease-in;
}
.mp-links > ul > li:hover {
background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent);
}
.mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;}
.mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;}
.mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;}
.mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;}
.mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;}
.mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;}
.mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;}
.mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;}
.mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;}
.mp-links > ul > li:hover a {
text-decoration: underline;
}
.mp-links > ul > li > a {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
flex: 1 1 auto;
box-sizing: border-box;
padding: 5px;
}
.mp-links > ul > li > a:first-child {
height: 100%;
}
.mp-links > ul > li > a:last-child:not(:first-child) {
height: unset;
}
.mp-links.stretch,
.mp-links.stretch > ul {
height: 100%;
}
.mp-links.side-image li {
flex-flow: row nowrap;
}
.mp-links.plain > ul > li {
outline-color: transparent;
}
/***********************
* End main page layout *
************************/
/*********************************************************************************************************************
* Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) *
**********************************************************************************************************************/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so: */
.hlist dt:not(:last-child)::after {
content: ":\20";
}
.hlist dd:not(:last-child)::after,
.hlist li:not(:last-child)::after {
/* "space, Middle Dot, space"
We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters.
The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */
/* content: "\20\00B7\20"; font-weight: bold; */
/* "space • space"
There may (and likely) be an extra whitespace between <li>s,
therefore we have to use a space character as last character of this sequence.
By this way, the last space and the next whitespce will collapse as a single space,
to make the whitespace on both sides of the middle dot the same width.
*/
content: "\20\A0\2022\A0\20";
font-weight: inherit;
}
/* Add parentheses around nested lists */
.hlist dd ol::before,
.hlist dd ul::before,
.hlist dd dl::before,
.hlist dt ol::before,
.hlist dt ul::before,
.hlist dt dl::before,
.hlist li ol::before,
.hlist li ul::before,
.hlist li dl::before {
content: "\20(";
font-weight: inherit;
}
.hlist dd ol::after,
.hlist dd ul::after,
.hlist dd dl::after,
.hlist dt ol::after,
.hlist dt ul::after,
.hlist dt dl::after,
.hlist li ol::after,
.hlist li ul::after,
.hlist li dl::after {
content: ")";
font-weight: inherit;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) ".\20";
}
/* Progressive enhancement:
* try to make the dot always follow the list item in same line
*/
.hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) {
display: inline-block;
}
/********************************************
* End semantically-correct horizontal lists *
*********************************************/
/*** Miscellaneous ***/
.responsive-image {
max-width: 100%;
height: auto;
}
.view-dark .invert-on-dark,
.view-light .invert-on-light {
filter: invert(100%);
}
.pixelated {
image-rendering: pixelated;
}
@media screen and (min-width: 720px) {
.mobileonly {
display: none;
}
}
@media screen and (max-width: 720px) {
.nomobile {
display: none;
}
}
/*** Utility classes for standard MW galleries ***/
/* it's important that spaced comes before centered in the sheet */
.gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin-left: unset;
}
.gallery.centered {
text-align: center;
}
/**************************
* Start Modular Templates *
**************************/
/********* [[Template:Ambox]] *********/
.ambox {
--ambox-color: var(--wiki-accent-color);
border: 1px solid var(--wiki-content-border-color);
border-left: 10px solid var(--ambox-color);
border-radius: 2px;
display: flex;
align-items: center;
gap: .6em;
margin: 1em 0;
padding: 3px .6em;
background-color: var(--wiki-content-background-color--secondary);
box-shadow: 2px 2px 5px 0px #0002;
}
@media (min-width: 720px) {
.ambox {
margin-inline: 10%;
}
}
.ambox.tiny {
padding: .04rem .5em;
margin-inline: 0;
width: fit-content;
}
.ambox + .ambox {
margin-top: -.6em;
}
.ambox-content {
flex: 1;
}
.ambox-content p {
margin: .15em 0;
}
.ambox-title {
font-weight: bold;
}
/********* [[Template:Hatnote]] *********/
.hatnote {
padding: 1px 0 1px 1.6em;
margin-bottom: 0.5em;
font-style: italic;
border-top: 1px solid var(--wiki-content-border-color--secondary);
border-bottom: 1px solid var(--wiki-content-border-color--secondary);
}
.hatnote.icon {
padding-left: 0;
}
/********* [[Template:Spoiler]] *********/
.spoiler-content {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent);
transition: all 0.3s;
cursor: pointer;
overflow: auto;
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
.spoiler-content {
background-color: var(--wiki-content-dynamic-color--secondary);
}
}
.spoiler-content > * {
pointer-events: none;
opacity: 0;
transition: all 0.3s;
}
.spoiler-content.show {
background-color: transparent;
}
.spoiler-content.show > * {
pointer-events: unset;
opacity: 1;
}
/********* [[Template:Link icon]] *********/
.link-icon {
--link-icon-line-height: 1.5em;
--link-icon-size: 1.5em;
display: inline-flex;
align-items: center;
height: var(--link-icon-line-height);
vertical-align: bottom;
}
.link-icon .regular {
align-self: center;
}
.link-icon .regular a {
display: flex;
}
.link-icon .regular img {
height: var(--link-icon-size);
max-width: var(--link-icon-size);
}
.link-icon .fallback {
outline: 1px solid var(--wiki-content-text-color);
border-radius: 50%;
text-align: center;
width: var(--link-icon-size);
line-height: var(--link-icon-size);
}
.link-icon.notext,
.link-icon.notext .fallback {
display: inline-block;
}
/********* [[Template:Quote]] *********/
.quote {
background: var(--wiki-content-background-color--secondary);
border-radius: 5px;
border: 2px solid var(--wiki-content-border-color);
margin: .5em 0;
padding: .5em;
overflow-y: hidden;
}
.quote .block {
display: block;
}
.quote .title {
font-size: large;
font-weight: bold;
}
.quote .content {
font-style: italic;
}
.quote .author {
font-weight: bold;
text-align: end;
}
.quote .marks-wrapper {
display: flex;
gap: 5px;
}
.quote .marks-wrapper::before,
.quote .marks-wrapper::after {
font-size: 100px;
line-height: 0px;
}
.quote .marks-wrapper::before {
content: "\201C";
margin-top: 40px;
}
.quote .marks-wrapper::after {
content: "\201D";
align-self: end;
margin-bottom: -10px;
}
.client-js .mw-charinsert-item {
display: none;
}
/************************
* End Modular Templates *
*************************/
/*****************************
* Used by [[Template:Color]] *
******************************/
.color__splotch {
display: inline-block;
height: 1em;
width: 1em;
box-sizing: border-box;
vertical-align: text-top;
border-radius: 50%;
border: 1px solid var(--wiki-content-text-color);
}
/*********************
* End Template:Color *
**********************/
/*********************************
* Used by [[Template:TOC limit]] *
**********************************/
.toclimit-2 .toclevel-1 ul,
.toclimit-3 .toclevel-2 ul,
.toclimit-4 .toclevel-3 ul,
.toclimit-5 .toclevel-4 ul,
.toclimit-6 .toclevel-5 ul,
.toclimit-7 .toclevel-6 ul {
display: none;
}
/*************************
* End Template:TOC limit *
**************************/
/*********************************
* Used by [[Template:TOC right]] *
**********************************/
@media all and (min-width: 720px) {
.tocright {
float: right;
clear: right;
margin: 0 0 0.5em 1em;
}
}
/*************************
* End Template:TOC right *
**************************/
23b1aa2ed7d9d5de6f1c3b3f7f2d01379b0f3907
1331
1330
2025-08-23T16:49:46Z
Sharparam
284703
Adjust content border color for dark theme
css
text/css
/* CSS placed here will be applied to all skins */
/******************************************************************************************
********************************* Start user-edit variables *******************************
******************************************************************************************/
/*****************************************
****** START BASIC DESIGN VARIABLES ******
----------------------------------------*/
:root {
--wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif;
--wiki-sidebar-heading-font-family: sans-serif;
--wiki-content-border-radius: 0px;
--wiki-sidebar-border-radius: 0px;
}
/*----------------------------------------
******* END BASIC DESIGN VARIABLES *******
*****************************************/
/*****************************************
****** START BASIC COLOR VARIABLES *******
----------------------------------------*/
:root,
/* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=light, */
/* individual themes are prefixed with .theme- instead */
.view-light {
/**********************
* Probably edit these * [ LIGHT VIEW ]
***********************/
--wiki-body-background-color: #F6F6F6;
--wiki-body-background-image: url(filepath://Site-background.jpg);
--wiki-content-background-color: #ffffff;
--wiki-content-background-opacity: 100%;
--wiki-content-border-color: #a7d7f9;
--wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ LIGHT VIEW ] */
--wiki-accent-color: #3366cc;
--wiki-accent-label-color: #ffffff;
--wiki-accent-link-color: #D5FB51;
--wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
}
/* end light styles */
/* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=dark, */
/* individual themes are prefixed with .theme- instead */
.view-dark {
/**********************
* Probably edit these * [ DARK VIEW ]
***********************/
--wiki-body-background-color: #171717;
--wiki-body-background-image: url(filepath://Site-background-dark.jpg);
--wiki-content-background-color: #202020;
--wiki-content-background-opacity: 90%;
/* DEFAULT: --wiki-content-border-color: #991A51; */
--wiki-content-border-color: hsl(0deg 0% 30%);
--wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ DARK VIEW ] */
/* DEFAULT: --wiki-accent-color: #ff4d9d; */
--wiki-accent-color: hsl(0deg 0% 75%);
--wiki-accent-label-color: #000;
--wiki-accent-link-color: #1e1e43;
--wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
}
/* End dark styles */
/*----------------------------------------
******* END BASIC COLOR VARIABLES ********
*****************************************/
/*****************************************
**** START ADVANCED COLOR VARIABLES ******
----------------------------------------*/
:root,
.view-light {
/*******************
* Maybe edit these * [ LIGHT VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #111111;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #ba0000;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ LIGHT VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ LIGHT VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #bf0017;
--wiki-warning-color: #b05f30;
--wiki-success-color: #0c742f;
/**/
/***********************************
* Likely do not need to edit these * [ LIGHT VIEW ]
************************************/
--wiki-body-dynamic-color: #000000;
--wiki-body-dynamic-color--inverted: #ffffff;
--wiki-body-dynamic-color--secondary: #333333;
--wiki-body-dynamic-color--secondary--inverted: #cccccc;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #ffffff;
--wiki-content-dynamic-color: #000000;
--wiki-content-dynamic-color--inverted: #ffffff;
--wiki-content-dynamic-color--secondary: #333333;
--wiki-content-dynamic-color--secondary--inverted: #cccccc;
/* [ LIGHT VIEW ] */
--wiki-alert-label-color: #ffffff;
--wiki-warning-label-color: #ffffff;
--wiki-success-label-color: #ffffff;
--wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */
/**/
}
.view-dark {
/*******************
* Maybe edit these * [ DARK VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #ededed;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #FC5B4F;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ DARK VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ DARK VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #ff576a;
--wiki-warning-color: #cf721c;
--wiki-success-color: #13aa45;
/**/
/***********************************
* Likely do not need to edit these * [ DARK VIEW ]
************************************/
--wiki-body-dynamic-color: #ffffff;
--wiki-body-dynamic-color--inverted: #000000;
--wiki-body-dynamic-color--secondary: #cccccc;
--wiki-body-dynamic-color--secondary--inverted: #333333;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #000;
--wiki-content-dynamic-color: #ffffff;
--wiki-content-dynamic-color--inverted: #000000;
--wiki-content-dynamic-color--secondary: #cccccc;
--wiki-content-dynamic-color--secondary--inverted: #333333;
/* [ DARK VIEW ] */
--wiki-alert-label-color: #000000;
--wiki-warning-label-color: #000000;
--wiki-success-label-color: #000000;
--wiki-icon-general-filter: invert(100%);
}
/*----------------------------------------
***** END ADVANCED COLOR VARIABLES *******
*****************************************/
/*****************************************
**** START ADVANCED DESIGN VARIABLES *****
----------------------------------------*/
:root {
/***********************
start logo position
----------------------*/
--wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */
--wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */
--wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */
--wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */
--wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */
/*-----------------------
end logo position
***********************/
--wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */
--wiki-body-font-family: sans-serif;
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-width: 1px;
--wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */
--wiki-sidebar-portal-spacing: 0px;
--wiki-sidebar-border-width: var(--wiki-content-border-width);
--wiki-navigation-border-radius: 0px; /* border radius of tabs */
/*******************
* Maybe edit these * [ DESIGN ]
********************/
--wiki-logo-filter: none;
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-top-radius: var(--wiki-content-border-radius);
--wiki-content-border-style: solid;
--wiki-content-border-image: none;
--wiki-content-backdrop-filter: none;
--wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */
--wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */
--wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-margin: 0.5em;
--wiki-sidebar-list-item-padding: 0.25em 0.25rem;
--wiki-sidebar-list-padding: 0.25rem;
--wiki-sidebar-list-item-background--hover: none; /* background of hover item */
--wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */
--wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */
--wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-box-background-color: var(--wiki-content-background-color);
--wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content));
--wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
--wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
/* nav tabs style. The vector gradient is default.
* If you want to customize the style of tabs, it's easier to start with the following settings:
* --wiki-navigation-background-image: none;
* --wiki-navigation-selected-background-image: none;
* --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px );
* --wiki-navigation-selected-border-bottom-background: none;
* --wiki-navigation-tab-spacing: 0.25em;
* --wiki-navigation-tab-padding-top: 0.5em;
* --wiki-navigation-tab-padding-bottom: 0.5em;
*/
--wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */
--wiki-navigation-tab-padding-top: 1.25em;
--wiki-navigation-tab-padding-x: 0.75em;
--wiki-navigation-tab-padding-bottom: 4px;
--wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */
--wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */
--wiki-navigation-border-image: none;
--wiki-navigation-selected-border-image: var(--wiki-navigation-border-image);
--wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%);
--wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x;
--wiki-navigation-background-position: left bottom, right bottom, left bottom;
--wiki-navigation-background-size: 1px 100%, 1px 100%, 100%;
--wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%);
--wiki-navigation-selected-background-repeat: no-repeat, no-repeat;
--wiki-navigation-selected-background-position: left bottom, right bottom;
--wiki-navigation-selected-background-size: 1px 100%, 1px 100%;
--wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px);
/* affects the dropdown menu under More */
--wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color);
--wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color);
--wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */
--wiki-navigation-dropdown-border-width: 1px;
--wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius);
--wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */
--wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */
--wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */
--wiki-navigation-dropdown-border-image: none;
--wiki-navigation-dropdown-backdrop-filter: none;
--wiki-navigation-dropdown-box-shadow: none; /* box shadow */
/* styles of the footer */
--wiki-spacing-before-footer: 0px;
--wiki-footer-border-image: none;
/* padding on body element */
--wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */
--wiki-left-spacing: 0.5em;
--wiki-right-spacing: 1em;
--wiki-bottom-spacing: 2em;
/* end design variables */
}
/*----------------------------------------
***** END ADVANCED DESIGN VARIABLES ******
*****************************************/
/*******************************
**** START SHARED VARIABLES ****
**** tl;dr: don't edit this ****
********************************/
/*
These variables are rarely touched, usually inherit other variables, and are shared on all themes.
In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision,
understand what you are doing, and *know* that what you are trying to do is not accomplished by changing
another variable in the above sections.
Since these are by default shared across all themes, if you support multiple themes you'll probably want to
separate the variables you want to modify here into .view-x blocks like above. If you don't understand
what that means or how to do that then you probably shouldn't be modifying this section.
*/
:root {
--wiki-content-border-bottom-width: var(--wiki-content-border-width);
--wiki-content-border-bottom-style: var(--wiki-content-border-style);
--wiki-content-border-bottom-color: var(--wiki-content-border-color);
--wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%);
--wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color));
--wiki-content-text-color--hover: var(--wiki-content-text-color);
/* heading */
--wiki-content-heading-border-bottom-width: 1px;
--wiki-content-heading-border-style: solid;
--wiki-content-heading-font-weight: normal;
--wiki-content-heading-font-style: normal;
--wiki-content-heading-text-transform: none;
--wiki-content-heading-line-height: normal;
--wiki-content-heading-text-shadow: none;
/* first heading (h1) */
--wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width);
--wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family);
--wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight);
--wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style);
--wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform);
--wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-firstheading-color: var(--wiki-content-heading-color);
--wiki-content-firstheading-text-shadow: none;
/* sub-heading (h3, h4, h5, h6) */
--wiki-content-subheading-border-bottom-width: 0px;
--wiki-content-subheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-subheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-subheading-font-family: var(--wiki-body-font-family);
--wiki-content-subheading-font-weight: bold;
--wiki-content-subheading-font-style: normal;
--wiki-content-subheading-text-transform: none;
--wiki-content-subheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-subheading-color: var(--wiki-content-heading-color);
--wiki-content-subheading-text-shadow: none;
/* heading size */
--wiki-content-firstheading-font-size: 1.8em;
--wiki-content-heading-h2-font-size: 1.5em;
--wiki-content-heading-h3-font-size: 1.2em;
--wiki-content-heading-h4-font-size: 114%;
--wiki-content-heading-h5-font-size: 108%;
--wiki-content-heading-h6-font-size: 100%;
--wiki-content-toc-background: var(--wiki-content-background-color--secondary);
--wiki-content-toc-border-width: 1px;
--wiki-content-toc-border-style: solid;
--wiki-content-toc-border-color: var(--wiki-content-border-color);
--wiki-content-toc-border-radius: 0px;
--wiki-content-toc-border-image: none;
--wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000;
--wiki-content-catlinks-background: var(--wiki-content-background-color--secondary);
--wiki-content-catlinks-border-width: 1px;
--wiki-content-catlinks-border-style: solid;
--wiki-content-catlinks-border-color: var(--wiki-content-border-color);
--wiki-content-catlinks-border-radius: 0px;
--wiki-content-catlinks-border-image: none;
--wiki-content-catlinks-box-shadow: none;
--wiki-content-filetoc-background: var(--wiki-content-background-color--secondary);
--wiki-content-filetoc-border-width: 1px;
--wiki-content-filetoc-border-style: solid;
--wiki-content-filetoc-border-color: var(--wiki-content-border-color);
--wiki-content-filetoc-border-radius: 0px;
--wiki-content-filetoc-border-image: none;
--wiki-content-filetoc-box-shadow: none;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
--wiki-sidebar-padding: 0px;
--wiki-sidebar-background-color: var(--wiki-content-background-color);
--wiki-sidebar-background-opacity: var(--wiki-content-background-opacity);
--wiki-sidebar-background-image: none;
--wiki-sidebar-background-position: center;
--wiki-sidebar-background-repeat: repeat;
--wiki-sidebar-background-size: auto;
--wiki-sidebar-filter: none;
--wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-sidebar-border-color: var(--wiki-content-border-color);
--wiki-sidebar-border-style: solid;
--wiki-sidebar-border-image: none;
--wiki-sidebar-link-color: var(--wiki-content-link-color);
--wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-sidebar-heading-color: var(--wiki-content-heading-color);
--wiki-sidebar-heading-font-weight: normal;
--wiki-sidebar-heading-font-style: normal;
--wiki-sidebar-heading-text-transform: none;
--wiki-sidebar-heading-line-height: normal;
--wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem;
--wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-text-shadow: none;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter);
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-box-padding: 0px;
--wiki-sidebar-box-background: none;
--wiki-sidebar-box-border: 0px;
--wiki-sidebar-box-border-image: none;
--wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color));
--wiki-footer-border-width: var(--wiki-content-border-width);
--wiki-footer-border-style: var(--wiki-content-border-style);
--wiki-footer-border-color: var(--wiki-content-border-color);
--wiki-footer-background-color: var(--wiki-content-background-color);
--wiki-footer-background-opacity: var(--wiki-content-background-opacity);
--wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-footer-text-color: var(--wiki-content-text-color);
--wiki-footer-link-color: var(--wiki-content-link-color);
--wiki-footer-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-footer-border-radius: var(--wiki-content-border-radius);
--wiki-navigation-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-background-color--hover: var(--wiki-navigation-background-color);
--wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity);
--wiki-navigation-background-image--hover: var(--wiki-navigation-background-image);
--wiki-navigation-background-position--hover: var(--wiki-navigation-background-position);
--wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat);
--wiki-navigation-background-size--hover: var(--wiki-navigation-background-size);
--wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover);
--wiki-navigation-transform--hover: none;
--wiki-navigation-selected-border-style: solid;
--wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-border-style: solid;
--wiki-navigation-border-color--hover: var(--wiki-navigation-border-color);
--wiki-navigation-border-image--hover: var(--wiki-navigation-border-image);
--wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style);
--wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px));
--wiki-navigation-icon-size: 1em;
--wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x);
--wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */
--wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color);
--wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-dropdown-offset: 0px; /* vertical offset */
--wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-search-background-image: none;
--wiki-navigation-search-background-position: 0;
--wiki-navigation-search-background-size: auto;
--wiki-navigation-search-background-repeat: repeat;
--wiki-navigation-search-backdrop-filter: none;
--wiki-navigation-search-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-search-border-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-border-style: solid;
--wiki-navigation-search-border-width: 1px;
--wiki-navigation-search-border-radius: 2px;
--wiki-navigation-search-border-image: none;
--wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image);
--wiki-navigation-search-box-shadow: none;
--wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow);
--wiki-navigation-search-text-color: var(--wiki-content-text-color);
--wiki-navigation-search-font-size: var(--wiki-navigation-font-size);
--wiki-navigation-search-height: 2em;
--wiki-navigation-search-button-color: currentColor;
--wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color);
--wiki-navigation-search-button-color-opacity: 80%;
--wiki-navigation-search-button-color-opacity--hover: 95%;
--wiki-navigation-search-bottom-spacing: 3px;
--wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent);
--wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */
}
/*** mobile adjustments ***/
@media screen and (max-width: 720px) {
body.has-vector-mobile-menu{
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-margin: 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-margin: 0px 0px -0.5em 0px;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-background-opacity: 100%;
--wiki-navigation-search-border-width: 1px;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
}
}
/*****************************
**** END SHARED VARIABLES ****
******************************/
/******************************************************************************************
********************************* End user-edit variables *********************************
******************************************************************************************/
/******************************
* Fallback for older browsers *
* DONT EDIT THIS *
*******************************/
@supports not (color:color-mix(in srgb, #000, transparent)) {
.view-dark,
.view-light,
:root {
--wiki-content-text-mix-color: var(--wiki-content-text-color);
--wiki-content-text-mix-color-95: var(--wiki-content-background-color);
--wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted);
--wiki-content-border-color--secondary: var(--wiki-content-border-color);
--wiki-content-border-color--accent: var(--wiki-accent-color);
--wiki-accent-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-highlight-background-color: transparent;
}
}
/*****************************
* End older browser fallback *
******************************/
/*****************************
* PortableInfoboxes *
******************************/
:root {
--pi-background: var(--wiki-content-background-color);
--pi-secondary-background: var(--wiki-accent-color);
--pi-secondary-background-label: var(--wiki-accent-label-color);
--pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent);
}
.portable-infobox .pi-title,
.portable-infobox .pi-header {
text-align: center;
font-size: 1.5em;
background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent);
color: var(--pi-secondary-background-label);
}
.portable-infobox .pi-data,
.portable-infobox .pi-group {
background: var(--wiki-content-background-color--secondary);
}
.portable-infobox .pi-image {
padding: 8px;
}
.pi-image-thumbnail {
max-width: 100%;
}
.pi-caption {
color: var(--wiki-content-text-mix-color);
}
.pi-section-navigation .pi-section-tab.pi-section-active,
.pi-section-navigation .pi-section-tab.current,
.pi-media-collection .pi-tab-link.current {
background: var(--pi-secondary-background);
color: var(--pi-secondary-background-label);
}
.pi-collapse > .pi-item:first-child {
cursor: pointer;
}
/* overqualify these to overwrite normal content heading styles */
.mw-body .portable-infobox h2,
.mw-body .portable-infobox h3 {
border-bottom: 0;
font-family: inherit;
font-weight: 700;
margin: 0;
}
/*****************************
* End PortableInfoboxes *
******************************/
/*******************
* Main page layout *
********************/
#mp-container {
display: grid;
gap: 10px;
}
@media screen and (max-width: 990px) {
/* for mobile screens */
#mp-container {
grid-template-areas:var(--main-page-layout--mobile);
grid-template-columns:var(--main-page-layout-columns--mobile, 100%);
}
.mp-box.mp-hide-on-mobile {
display: none;
}
}
@media screen and (min-width: 990px) and (max-width: 1350px) {
/* for narrow screens, between 990px and 1350px */
#mp-container {
grid-template-areas:var(--main-page-layout--tablet);
grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr);
}
.mp-box.mp-hide-on-tablet {
display: none;
}
}
@media screen and (min-width: 1350px) {
/* for all other screens, 1350px and wider */
#mp-container {
grid-template-areas:var(--main-page-layout--desktop);
grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr);
}
.mp-box.mp-hide-on-desktop {
display: none;
}
}
.mp-box {
position: relative;
display: flex;
flex-flow: column nowrap;
width: 100%;
box-sizing: border-box;
background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent);
border: 1px solid var(--wiki-content-border-color);
padding: 0px;
}
.mp-body {
height: 100%;
display: flex;
padding: 0.5em;
flex-flow: column nowrap;
}
.mp-box.centered-content .mp-body {
height: 100%;
display: flex;
flex-flow: column nowrap;
justify-content: space-evenly;
}
.mp-box.has-floating-image {
display: block;
}
.mp-box.has-floating-image .mp-body {
height: unset;
display: block;
}
/* overqualified to override normal heading styles */
.mw-body .mp-box h2 {
text-align: center;
font-weight: bold;
font-family: var(--wiki-content-heading-font-family);
overflow: initial;
border-bottom: 1px solid var(--wiki-content-border-color);
font-size: 150%;
margin: 0;
padding: 5px 0;
color: var(--wiki-content-heading-color);
}
#mp-box-welcome {
text-align: center;
position: relative;
overflow: hidden;
}
#mp-box-welcome h2 {
font-size: 200%;
}
#mp-welcome {
display: flex;
flex-flow: column nowrap;
position: relative;
height: 100%;
z-index: 2;
box-sizing: border-box;
}
#mp-welcome .welcome-subtitle {
height: 100%;
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent);
padding: 0.5em;
}
#mp-banner {
position: absolute;
width: 100%;
height: 100%;
filter: blur(5px);
z-index: -1;
background: url(/images/e/e0/MP_banner.jpg);
background-size: cover;
background-repeat: no-repeat;
background-position: top center;
}
.view-dark #mp-banner {
filter: blur(5px) brightness(50%);
}
.view-light #mp-banner {
filter: blur(5px) contrast(50%);
}
/* [[Template:MP_link]] */
.mp-links {
--gap: 10px;
}
.mp-links > ul {
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin: 2px;
gap: var(--gap);
}
.mp-links > ul > li {
display: flex;
flex-flow: column nowrap;
align-items: stretch;
text-align: center;
box-sizing: border-box;
flex: max(calc(50% - var(--gap)), 5em) 1 1;
outline: 1px solid var(--wiki-content-link-color);
transition: 0.1s ease-in;
}
.mp-links > ul > li:hover {
background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent);
}
.mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;}
.mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;}
.mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;}
.mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;}
.mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;}
.mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;}
.mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;}
.mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;}
.mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;}
.mp-links > ul > li:hover a {
text-decoration: underline;
}
.mp-links > ul > li > a {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
flex: 1 1 auto;
box-sizing: border-box;
padding: 5px;
}
.mp-links > ul > li > a:first-child {
height: 100%;
}
.mp-links > ul > li > a:last-child:not(:first-child) {
height: unset;
}
.mp-links.stretch,
.mp-links.stretch > ul {
height: 100%;
}
.mp-links.side-image li {
flex-flow: row nowrap;
}
.mp-links.plain > ul > li {
outline-color: transparent;
}
/***********************
* End main page layout *
************************/
/*********************************************************************************************************************
* Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) *
**********************************************************************************************************************/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so: */
.hlist dt:not(:last-child)::after {
content: ":\20";
}
.hlist dd:not(:last-child)::after,
.hlist li:not(:last-child)::after {
/* "space, Middle Dot, space"
We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters.
The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */
/* content: "\20\00B7\20"; font-weight: bold; */
/* "space • space"
There may (and likely) be an extra whitespace between <li>s,
therefore we have to use a space character as last character of this sequence.
By this way, the last space and the next whitespce will collapse as a single space,
to make the whitespace on both sides of the middle dot the same width.
*/
content: "\20\A0\2022\A0\20";
font-weight: inherit;
}
/* Add parentheses around nested lists */
.hlist dd ol::before,
.hlist dd ul::before,
.hlist dd dl::before,
.hlist dt ol::before,
.hlist dt ul::before,
.hlist dt dl::before,
.hlist li ol::before,
.hlist li ul::before,
.hlist li dl::before {
content: "\20(";
font-weight: inherit;
}
.hlist dd ol::after,
.hlist dd ul::after,
.hlist dd dl::after,
.hlist dt ol::after,
.hlist dt ul::after,
.hlist dt dl::after,
.hlist li ol::after,
.hlist li ul::after,
.hlist li dl::after {
content: ")";
font-weight: inherit;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) ".\20";
}
/* Progressive enhancement:
* try to make the dot always follow the list item in same line
*/
.hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) {
display: inline-block;
}
/********************************************
* End semantically-correct horizontal lists *
*********************************************/
/*** Miscellaneous ***/
.responsive-image {
max-width: 100%;
height: auto;
}
.view-dark .invert-on-dark,
.view-light .invert-on-light {
filter: invert(100%);
}
.pixelated {
image-rendering: pixelated;
}
@media screen and (min-width: 720px) {
.mobileonly {
display: none;
}
}
@media screen and (max-width: 720px) {
.nomobile {
display: none;
}
}
/*** Utility classes for standard MW galleries ***/
/* it's important that spaced comes before centered in the sheet */
.gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin-left: unset;
}
.gallery.centered {
text-align: center;
}
/**************************
* Start Modular Templates *
**************************/
/********* [[Template:Ambox]] *********/
.ambox {
--ambox-color: var(--wiki-accent-color);
border: 1px solid var(--wiki-content-border-color);
border-left: 10px solid var(--ambox-color);
border-radius: 2px;
display: flex;
align-items: center;
gap: .6em;
margin: 1em 0;
padding: 3px .6em;
background-color: var(--wiki-content-background-color--secondary);
box-shadow: 2px 2px 5px 0px #0002;
}
@media (min-width: 720px) {
.ambox {
margin-inline: 10%;
}
}
.ambox.tiny {
padding: .04rem .5em;
margin-inline: 0;
width: fit-content;
}
.ambox + .ambox {
margin-top: -.6em;
}
.ambox-content {
flex: 1;
}
.ambox-content p {
margin: .15em 0;
}
.ambox-title {
font-weight: bold;
}
/********* [[Template:Hatnote]] *********/
.hatnote {
padding: 1px 0 1px 1.6em;
margin-bottom: 0.5em;
font-style: italic;
border-top: 1px solid var(--wiki-content-border-color--secondary);
border-bottom: 1px solid var(--wiki-content-border-color--secondary);
}
.hatnote.icon {
padding-left: 0;
}
/********* [[Template:Spoiler]] *********/
.spoiler-content {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent);
transition: all 0.3s;
cursor: pointer;
overflow: auto;
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
.spoiler-content {
background-color: var(--wiki-content-dynamic-color--secondary);
}
}
.spoiler-content > * {
pointer-events: none;
opacity: 0;
transition: all 0.3s;
}
.spoiler-content.show {
background-color: transparent;
}
.spoiler-content.show > * {
pointer-events: unset;
opacity: 1;
}
/********* [[Template:Link icon]] *********/
.link-icon {
--link-icon-line-height: 1.5em;
--link-icon-size: 1.5em;
display: inline-flex;
align-items: center;
height: var(--link-icon-line-height);
vertical-align: bottom;
}
.link-icon .regular {
align-self: center;
}
.link-icon .regular a {
display: flex;
}
.link-icon .regular img {
height: var(--link-icon-size);
max-width: var(--link-icon-size);
}
.link-icon .fallback {
outline: 1px solid var(--wiki-content-text-color);
border-radius: 50%;
text-align: center;
width: var(--link-icon-size);
line-height: var(--link-icon-size);
}
.link-icon.notext,
.link-icon.notext .fallback {
display: inline-block;
}
/********* [[Template:Quote]] *********/
.quote {
background: var(--wiki-content-background-color--secondary);
border-radius: 5px;
border: 2px solid var(--wiki-content-border-color);
margin: .5em 0;
padding: .5em;
overflow-y: hidden;
}
.quote .block {
display: block;
}
.quote .title {
font-size: large;
font-weight: bold;
}
.quote .content {
font-style: italic;
}
.quote .author {
font-weight: bold;
text-align: end;
}
.quote .marks-wrapper {
display: flex;
gap: 5px;
}
.quote .marks-wrapper::before,
.quote .marks-wrapper::after {
font-size: 100px;
line-height: 0px;
}
.quote .marks-wrapper::before {
content: "\201C";
margin-top: 40px;
}
.quote .marks-wrapper::after {
content: "\201D";
align-self: end;
margin-bottom: -10px;
}
.client-js .mw-charinsert-item {
display: none;
}
/************************
* End Modular Templates *
*************************/
/*****************************
* Used by [[Template:Color]] *
******************************/
.color__splotch {
display: inline-block;
height: 1em;
width: 1em;
box-sizing: border-box;
vertical-align: text-top;
border-radius: 50%;
border: 1px solid var(--wiki-content-text-color);
}
/*********************
* End Template:Color *
**********************/
/*********************************
* Used by [[Template:TOC limit]] *
**********************************/
.toclimit-2 .toclevel-1 ul,
.toclimit-3 .toclevel-2 ul,
.toclimit-4 .toclevel-3 ul,
.toclimit-5 .toclevel-4 ul,
.toclimit-6 .toclevel-5 ul,
.toclimit-7 .toclevel-6 ul {
display: none;
}
/*************************
* End Template:TOC limit *
**************************/
/*********************************
* Used by [[Template:TOC right]] *
**********************************/
@media all and (min-width: 720px) {
.tocright {
float: right;
clear: right;
margin: 0 0 0.5em 1em;
}
}
/*************************
* End Template:TOC right *
**************************/
8f19edf92250384883dd722759a3a6d86ee3ba9d
Meta:Manual of Style
4
845
1332
2025-08-24T20:03:40Z
Sharparam
284703
Created page with "This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the talk page or contact wiki administrators to have it clarified. [[Category:Manual of Style]]"
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the talk page or contact wiki administrators to have it clarified.
[[Category:Manual of Style]]
0ef107d5084b9b99be53e446a3db2a66c809da2a
1335
1332
2025-08-24T20:07:30Z
Sharparam
284703
Link to talk page
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified.
[[Category:Manual of Style]]
e4e851f69ebaf087f36e360a8060865c9f4b2c2b
1348
1335
2025-08-24T23:25:02Z
Sharparam
284703
Add more style guides
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified.
== Layout ==
Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]).
This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>.
=== Location and acquisition ===
These are important sections and often what readers are interested in when looking up an item for example.
As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present).
=== Bugs ===
The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article.
=== Trivia ===
The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]].
=== Other sections ===
Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs.
Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section.
== Formatting ==
=== Emphasis ===
Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags).
When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient).
For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag.
== Infoboxes ==
Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page.
The following types of articles must have an infobox:
* NPCs ({{tl|Infobox/NPC}})
* Enemies ({{tl|Infobox/Enemy}})
* Bosses ({{tl|Infobox/Boss}})
* Items ({{tl|Infobox/Item}})
** Weapons ({{tl|Infobox/Weapon}})
** Armor ({{tl|Infobox/Armor}})
** Capes ({{tl|Infobox/Cape}})
** Shields ({{tl|Infobox/Shield}})
** Armor set ({{tl|Infobox/Armor set}})
** Amulets ({{tl|Infobox/Amulet}})
* Abilities ({{tl|Infobox/Ability}})
* Passives ({{tl|Infobox/Passive}})
There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates.
The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes.
(Though you can use it to spice up your user page if you want, just don't use it in mainspace content.)
When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage.
Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.)
Infoboxes should be put at the top of an article, before the lead text.
== Navboxes ==
Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons.
See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes.
Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader.
Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>.
[[Category:Manual of Style]]
e6b0a8e76f3bd612c0987af6b3e48281d113fd51
Category:Manual of Style
14
846
1333
2025-08-24T20:04:01Z
Sharparam
284703
Created page with "Pages that deal with how the wiki should be edited."
wikitext
text/x-wiki
Pages that deal with how the wiki should be edited.
da899e150d93b28ad3a19c1041ade0e77fccf87f
Meta:MOS
4
847
1334
2025-08-24T20:04:18Z
Sharparam
284703
Redirected page to [[Meta:Manual of Style]]
wikitext
text/x-wiki
#REDIRECT [[Meta:Manual of Style]]
918040eed385668d250445cc55d1b1824e0ed37a
Template:Em
10
848
1336
2025-08-24T22:26:46Z
Sharparam
284703
Created page with "<em {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</em><noinclude> {{documentation}} <!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude>"
wikitext
text/x-wiki
<em {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</em><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
e2fac6fb507a0dd72c4e79d02403049c7d857c8d
Template:Em/doc
10
849
1337
2025-08-24T22:28:04Z
Sharparam
284703
Created page with "{{From Wikipedia|Template:Em}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
{{From Wikipedia|Template:Em}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
a4d16d9316831955f3ae49005df6a9d14e7744c4
1338
1337
2025-08-24T22:29:10Z
Sharparam
284703
Add link to strong template
wikitext
text/x-wiki
{{From Wikipedia|Template:Em}}
== See also ==
* {{tl|Strong}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
fae59b458997baf767095a83a6812fac25576f9b
Template:Strong
10
850
1339
2025-08-24T22:29:18Z
Sharparam
284703
Created page with "<strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude> {{documentation}} <!-- Add cats and interwikis to the /doc subpage, not here! --> </noinclude>"
wikitext
text/x-wiki
<strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude>
{{documentation}}
<!-- Add cats and interwikis to the /doc subpage, not here! -->
</noinclude>
a6c6d3b520e2018e19376e2f0e1a72801336d1df
Template:Strong/doc
10
851
1340
2025-08-24T22:30:06Z
Sharparam
284703
Created page with "{{From Wikipedia|Template:Strong}} == See also == * {{tl|Em}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
{{From Wikipedia|Template:Strong}}
== See also ==
* {{tl|Em}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
8b5e840a9e0f743fb68890c95e23a65f1d450d3b
Bleak Faith: Forsaken Wiki/contribute
0
7
1341
13
2025-08-24T22:32:04Z
Sharparam
284703
Add link to manual of style
wikitext
text/x-wiki
{{Main page box/start
| title = Contribute to the wiki
}}
{{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players.
; Adding content
:* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done.
:* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough.
:* [[Special:UserLogin/signup|Register]] to edit and track your contributions.
:* Read the [[Meta:Manual of Style|Manual of Style]] for guidance on how to edit the wiki.
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
fcb3d3f242ca0c4dad471938bb505c27594f44ad
Template:Tag
10
852
1342
2025-08-24T22:37:47Z
Sharparam
284703
Copied from [[wikipedia:Template:Tag]] (edit link to use Wikipedia interwiki link)
wikitext
text/x-wiki
<code class="{{#ifeq:{{{wrap|}}}|yes|wrap|nowrap}}" style="{{#ifeq:{{{style|}}}|plain|border:none;background:transparent;|{{{style|}}}}}"><!--
Opening tag
-->{{#switch:{{{2|pair}}}
|c|close =
|e|empty|s|single|v|void
|o|open
|p|pair = <{{#if:{{{link|}}}|[[wikipedia:HTML element#{{{1|tag}}}|{{{1|tag}}}]]|{{{1|tag}}}}}{{#if:{{{params|{{{attribs|}}}}}}| {{{params|{{{attribs}}}}}}}}
}}<!--
Content between tags
-->{{#switch:{{{2|pair}}}
|c|close = {{{content|}}}
|e|empty|s|single|v|void =  />
|o|open = >{{{content|}}}
|p|pair = {{#ifeq:{{{1|tag}}}|!--||>}}{{{content|...}}}
}}<!--
Closing tag
-->{{#switch:{{{2|pair}}}
|e|empty|s|single|v|void
|o|open =
|c|close
|p|pair = {{#ifeq:{{{1|tag}}}|!--|-->|</{{{1|tag}}}>}}
}}<!--
--></code><noinclude>
{{Documentation}}
</noinclude>
973b72505c3ff83d502ce65f4b01269686bdafc1
Template:Tag/doc
10
853
1343
2025-08-24T22:38:55Z
Sharparam
284703
Created page with "{{From Wikipedia|Template:Tag}} <includeonly>{{Sandbox other||[[Category:HTML typing-aid templates]][[Category:Wikitext typing-aid templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
{{From Wikipedia|Template:Tag}}
<includeonly>{{Sandbox other||[[Category:HTML typing-aid templates]][[Category:Wikitext typing-aid templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
9e7ec019dcd1a7dcedc4eef709120806464b2bee
Category:HTML typing-aid templates
14
854
1344
2025-08-24T22:39:09Z
Sharparam
284703
Created page with "[[Category:Templates]]"
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Wikitext typing-aid templates
14
855
1345
2025-08-24T22:39:21Z
Sharparam
284703
Created page with "[[Category:Templates]]"
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Template:Infobox/NPC/doc
10
344
1346
457
2025-08-24T23:11:14Z
Sharparam
284703
Fix broken image
wikitext
text/x-wiki
== Example ==
{{Infobox/NPC
| title = The Handler
| image = The Handler Blok 6147.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/NPC
| title = The Handler
| image = The Handler.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||
[[Category:Infobox templates]]
}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
11eea2529a7b33998b60fe9dc8a39e661285dbec
1347
1346
2025-08-24T23:11:28Z
Sharparam
284703
Fix outdated example
wikitext
text/x-wiki
== Example ==
{{Infobox/NPC
| title = The Handler
| image = The Handler Blok 6147.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/NPC
| title = The Handler
| image = The Handler Blok 6147.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||
[[Category:Infobox templates]]
}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
89dc6ffb6ff9ad6917d700875e0a4146d07be538
Template:DiscordLink
10
856
1349
2025-08-24T23:45:30Z
Sharparam
284703
Created page with "{{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}} {{#vardefine:text|{{{text|Discord}}}}} {{#vardefine:icon|{{Yesno|{{{icon|}}}}}}} {{#switch:{{{1}}} | plain = {{#var:url}} | #default = {{#if:{{#var:icon}} | <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!-- --><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!-- --><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!-- --><..."
wikitext
text/x-wiki
{{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}}
{{#vardefine:text|{{{text|Discord}}}}}
{{#vardefine:icon|{{Yesno|{{{icon|}}}}}}}
{{#switch:{{{1}}}
| plain = {{#var:url}}
| #default = {{#if:{{#var:icon}}
| <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!--
--><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!--
--><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!--
--></span>
| [{{#var:url}} {{#var:text}}]
}}
}}<noinclude>{{Documentation}}</noinclude>
cfefd5d3e9f55f72e09ed3338722bdc34a9c4424
1351
1349
2025-08-24T23:54:36Z
Sharparam
284703
Fix spacing and newlines
wikitext
text/x-wiki
{{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}}<!--
-->{{#vardefine:text|{{{text|Discord}}}}}<!--
-->{{#vardefine:icon|{{Yesno|{{{icon|}}}}}}}<!--
-->{{#switch:{{{1}}}
| plain = {{#var:url}}
| #default = {{#if:{{#var:icon}}
| <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!--
--><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!--
--> <!--
--><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!--
--></span>
| [{{#var:url}} {{#var:text}}]
}}
}}<noinclude>{{Documentation}}</noinclude>
c1e0c2547c9b5f013780e23c397049d7bdcc1170
Template:DiscordLink/doc
10
857
1350
2025-08-24T23:52:42Z
Sharparam
284703
Created page with "== TemplateData == <templatedata> { "params": { "1": { "label": "Type", "description": "Type of link to produce, leave unspecified or empty for default type.", "example": "plain", "type": "line", "suggestedvalues": [ "default", "plain" ], "default": "default" }, "text": { "label": "Link text", "description": "Custom text to show as the link text instead of the default \"Discord\".", "example": "BFF Discord", "type": "li..."
wikitext
text/x-wiki
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Type",
"description": "Type of link to produce, leave unspecified or empty for default type.",
"example": "plain",
"type": "line",
"suggestedvalues": [
"default",
"plain"
],
"default": "default"
},
"text": {
"label": "Link text",
"description": "Custom text to show as the link text instead of the default \"Discord\".",
"example": "BFF Discord",
"type": "line",
"default": "Discord"
},
"icon": {
"label": "Show icon",
"description": "Whether to show a Discord icon next to the link.",
"type": "boolean",
"default": "no"
}
},
"description": "Produces a link to the official Bleak Faith: Forsaken Discord server.",
"paramOrder": [
"1",
"text",
"icon"
],
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink}}</syntaxhighlight> → {{DiscordLink}}
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink|icon=yes}}</syntaxhighlight> → {{DiscordLink|icon=yes}}
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink|text=BFF Discord}}</syntaxhighlight> → {{DiscordLink|text=BFF Discord}}
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink|plain}}</syntaxhighlight> → {{DiscordLink|plain}}
<noinclude>[[Category:Template documentation]]</noinclude>
22afab3d89801781d6c6c24266696cd73a845e52
Bleak Faith: Forsaken Wiki/external
0
8
1352
387
2025-08-25T00:25:01Z
Sharparam
284703
Use [[Template:DiscordLink]] template
wikitext
text/x-wiki
{{Main page box/start
| title = External links
}}
<div class="mp-links columns-2">
* {{MP link|Official site|link=http://www.bleakfaith.com/}}
* {{MP link|Discord|link={{DiscordLink|plain}}|image=Discord.svg|size=64x64px}}
* {{MP link|Reddit|link=https://www.reddit.com/r/Bleak_Faith/|image=Reddit.svg|size=64x64px}}
* {{MP link|Steam|link=https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/|image=Steam.svg|size=64x64px}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
8f030c58d461d7300f7d5d13f25a8a38a8a83694
Template:DiscordLink
10
856
1353
1351
2025-08-25T00:25:21Z
Sharparam
284703
Protected "[[Template:DiscordLink]]": Used on main page ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
{{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}}<!--
-->{{#vardefine:text|{{{text|Discord}}}}}<!--
-->{{#vardefine:icon|{{Yesno|{{{icon|}}}}}}}<!--
-->{{#switch:{{{1}}}
| plain = {{#var:url}}
| #default = {{#if:{{#var:icon}}
| <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!--
--><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!--
--> <!--
--><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!--
--></span>
| [{{#var:url}} {{#var:text}}]
}}
}}<noinclude>{{Documentation}}</noinclude>
c1e0c2547c9b5f013780e23c397049d7bdcc1170
Bleak Faith: Forsaken Wiki/about
0
6
1354
591
2025-08-25T00:29:50Z
Sharparam
284703
Use an actual description of the game
wikitext
text/x-wiki
{{Main page box/start
| title = About [[Bleak Faith: Forsaken]]
}}
An action role-playing game taking place inside a perpetually expanding omnistructure. An unforgiving, interconnected world you will have to explore to uncover its secrets.
<div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
08505fcc3499f10ca0632566339c2eb5415d5314
Bleak Faith: Forsaken Wiki/pages
0
5
1355
593
2025-08-25T00:33:06Z
Sharparam
284703
Use more useful links
wikitext
text/x-wiki
{{Main page box/start
| title = Useful wiki pages
| class = centered-content
}}
<div class="mp-links columns-2">
* {{MP link|Items|link=Items}}
* {{MP link|Enemies|link=Enemies}}
* {{MP link|NPCs|link=NPCs}}
* {{MP link|Locations|link=Locations}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
328259a77b34d9cdc5f6ab08e48d3a850d82c4d5
Template:Infobox/Enemy
10
858
1356
2025-08-25T00:43:22Z
Sharparam
284703
Created page with "<includeonly><!-- -->{{#invoke:Infobox|main | kind = enemy | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections = Basic Info, Stats | Stats = HP, SharpResist, BluntResist, TechnomancyResist | SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance | BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance | TechnomancyResist_label = File:Technomancy outlined...."
wikitext
text/x-wiki
<includeonly><!--
-->{{#invoke:Infobox|main
| kind = enemy
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections = Basic Info, Stats
| Stats = HP, SharpResist, BluntResist, TechnomancyResist
| SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance
| BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance
| TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance
| SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}}
| BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}}
| TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}}
}}{{Main other|[[Category:Enemies]]}}<!--
--></includeonly><noinclude>{{Documentation}}</noinclude>
1bd8491f251c3c6a83473071b7eacf3917f0e4de
Template:Infobox/Enemy/doc
10
859
1357
2025-08-25T00:43:54Z
Sharparam
284703
Created page with "<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
d9c0501a4a136d46ea3e3e622e8875aba5810496
1362
1357
2025-08-25T08:21:23Z
Sharparam
284703
Add an example
wikitext
text/x-wiki
== Examples ==
{{Infobox/Enemy
| title = Spooky Scary Skeleton
| image = Skeleton.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Enemy
| title = Spooky Scary Skeleton
| image = Skeleton.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
35bb55d7b13bc4302d35488bfbaec23d8efc421c
Fisherman
0
541
1358
843
2025-08-25T00:46:32Z
Sharparam
284703
Sharparam renamed page [[Diver]] to [[Fisherman]]: Game files call the enemy "Fisherman"
wikitext
text/x-wiki
The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location.
== Drops ==
* [[Diver's Lungs Concoction]]
* [[Fractal Fungus]]
* [[Gingko Leaves]]
* [[Lesser Anomalous Crystal]]
* [[Lesser Restorative Fluid]]
* [[Ring of Burning Desire]]
* [[Sludge]]
* [[Upgrade Splinter]]
[[Category:Enemies]]
854a2903c300d816cf3a65b85c7bee9c7c9aeb6e
1360
1358
2025-08-25T00:47:22Z
Sharparam
284703
Add infobox and navbox
wikitext
text/x-wiki
{{Infobox/Enemy
| image = Fisherman.png
}}
The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location.
== Drops ==
* [[Diver's Lungs Concoction]]
* [[Fractal Fungus]]
* [[Gingko Leaves]]
* [[Lesser Anomalous Crystal]]
* [[Lesser Restorative Fluid]]
* [[Ring of Burning Desire]]
* [[Sludge]]
* [[Upgrade Splinter]]
{{Navbox/Enemies}}
[[Category:Enemies]]
67a919be1ad3071e55951b7b9ca8a26908ed2b7b
Diver
0
860
1359
2025-08-25T00:46:32Z
Sharparam
284703
Sharparam renamed page [[Diver]] to [[Fisherman]]: Game files call the enemy "Fisherman"
wikitext
text/x-wiki
#REDIRECT [[Fisherman]]
1642569f235baad045394007c41efb6519d7b76e
Anomaly (location)
0
363
1361
489
2025-08-25T01:26:38Z
Sharparam
284703
Add NPCs and bosses
wikitext
text/x-wiki
[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]]
The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]]
{{Navbox/Locations}}
[[Category:Locations]]
8859acb4f72b39a0babab381a5fceb3b14b74005
Template:Infobox/Boss/doc
10
861
1363
2025-08-25T08:22:42Z
Sharparam
284703
Created page with "== Examples == {{Infobox/Boss | title = Big Boss | image = Big Boss.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Boss | title = Big Boss | image = Big Boss.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== Examples ==
{{Infobox/Boss
| title = Big Boss
| image = Big Boss.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Boss
| title = Big Boss
| image = Big Boss.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
6c59a5db79b0bb269e62a3ae86ee8d15b23aab40
Template:Infobox/Boss
10
461
1364
687
2025-08-25T08:23:32Z
Sharparam
284703
Use [[Template:Main other]] and remove redundant category (specified in doc subpage)
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
| kind = boss
| sep=,
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| title = {{{title|{{PAGENAME}}}}}
| sections = Basic Info, Stats
| Stats = HP, SharpResist, BluntResist, TechnomancyResist
| SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance
| BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance
| TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance
| SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}}
| BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}}
| TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}}
}}{{Main other|[[Category:Bosses]]}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
650d981203e72993b0187187d664318bb19f9d7a
File:Site-background.jpg
6
862
1365
2025-08-25T16:29:08Z
Sharparam
284703
From the screenshots page of SteamDB: https://steamdb.info/app/1173220/screenshots/
wikitext
text/x-wiki
== Summary ==
From the screenshots page of SteamDB: https://steamdb.info/app/1173220/screenshots/
== Licensing ==
{{License|game}}
391d84247204e37d49101e889156741a84adf2d1
1369
1365
2025-08-25T16:44:00Z
Sharparam
284703
Protected "[[File:Site-background.jpg]]": Part of skin ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite))
wikitext
text/x-wiki
== Summary ==
From the screenshots page of SteamDB: https://steamdb.info/app/1173220/screenshots/
== Licensing ==
{{License|game}}
391d84247204e37d49101e889156741a84adf2d1
MediaWiki:Common.css
8
235
1366
1331
2025-08-25T16:34:45Z
Sharparam
284703
Set background for dark theme
css
text/css
/* CSS placed here will be applied to all skins */
/******************************************************************************************
********************************* Start user-edit variables *******************************
******************************************************************************************/
/*****************************************
****** START BASIC DESIGN VARIABLES ******
----------------------------------------*/
:root {
--wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif;
--wiki-sidebar-heading-font-family: sans-serif;
--wiki-content-border-radius: 0px;
--wiki-sidebar-border-radius: 0px;
}
/*----------------------------------------
******* END BASIC DESIGN VARIABLES *******
*****************************************/
/*****************************************
****** START BASIC COLOR VARIABLES *******
----------------------------------------*/
:root,
/* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=light, */
/* individual themes are prefixed with .theme- instead */
.view-light {
/**********************
* Probably edit these * [ LIGHT VIEW ]
***********************/
--wiki-body-background-color: #F6F6F6;
--wiki-body-background-image: url(filepath://Site-background.jpg);
--wiki-content-background-color: #ffffff;
--wiki-content-background-opacity: 100%;
--wiki-content-border-color: #a7d7f9;
--wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ LIGHT VIEW ] */
--wiki-accent-color: #3366cc;
--wiki-accent-label-color: #ffffff;
--wiki-accent-link-color: #D5FB51;
--wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
}
/* end light styles */
/* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=dark, */
/* individual themes are prefixed with .theme- instead */
.view-dark {
/**********************
* Probably edit these * [ DARK VIEW ]
***********************/
--wiki-body-background-color: #171717;
--wiki-body-background-image: url(filepath://Site-background-dark.jpg);
--wiki-content-background-color: #202020;
--wiki-content-background-opacity: 90%;
/* DEFAULT: --wiki-content-border-color: #991A51; */
--wiki-content-border-color: hsl(0deg 0% 30%);
--wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ DARK VIEW ] */
/* DEFAULT: --wiki-accent-color: #ff4d9d; */
--wiki-accent-color: hsl(0deg 0% 75%);
--wiki-accent-label-color: #000;
--wiki-accent-link-color: #1e1e43;
--wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
/* Site background */
--wiki-body-background-image: url(filepath://Site-background.jpg);
--wiki-body-background-position: center;
--wiki-body-background-size: cover;
--wiki-body-background-attachment: fixed;
}
/* End dark styles */
/*----------------------------------------
******* END BASIC COLOR VARIABLES ********
*****************************************/
/*****************************************
**** START ADVANCED COLOR VARIABLES ******
----------------------------------------*/
:root,
.view-light {
/*******************
* Maybe edit these * [ LIGHT VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #111111;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #ba0000;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ LIGHT VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ LIGHT VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #bf0017;
--wiki-warning-color: #b05f30;
--wiki-success-color: #0c742f;
/**/
/***********************************
* Likely do not need to edit these * [ LIGHT VIEW ]
************************************/
--wiki-body-dynamic-color: #000000;
--wiki-body-dynamic-color--inverted: #ffffff;
--wiki-body-dynamic-color--secondary: #333333;
--wiki-body-dynamic-color--secondary--inverted: #cccccc;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #ffffff;
--wiki-content-dynamic-color: #000000;
--wiki-content-dynamic-color--inverted: #ffffff;
--wiki-content-dynamic-color--secondary: #333333;
--wiki-content-dynamic-color--secondary--inverted: #cccccc;
/* [ LIGHT VIEW ] */
--wiki-alert-label-color: #ffffff;
--wiki-warning-label-color: #ffffff;
--wiki-success-label-color: #ffffff;
--wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */
/**/
}
.view-dark {
/*******************
* Maybe edit these * [ DARK VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #ededed;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #FC5B4F;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ DARK VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ DARK VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #ff576a;
--wiki-warning-color: #cf721c;
--wiki-success-color: #13aa45;
/**/
/***********************************
* Likely do not need to edit these * [ DARK VIEW ]
************************************/
--wiki-body-dynamic-color: #ffffff;
--wiki-body-dynamic-color--inverted: #000000;
--wiki-body-dynamic-color--secondary: #cccccc;
--wiki-body-dynamic-color--secondary--inverted: #333333;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #000;
--wiki-content-dynamic-color: #ffffff;
--wiki-content-dynamic-color--inverted: #000000;
--wiki-content-dynamic-color--secondary: #cccccc;
--wiki-content-dynamic-color--secondary--inverted: #333333;
/* [ DARK VIEW ] */
--wiki-alert-label-color: #000000;
--wiki-warning-label-color: #000000;
--wiki-success-label-color: #000000;
--wiki-icon-general-filter: invert(100%);
}
/*----------------------------------------
***** END ADVANCED COLOR VARIABLES *******
*****************************************/
/*****************************************
**** START ADVANCED DESIGN VARIABLES *****
----------------------------------------*/
:root {
/***********************
start logo position
----------------------*/
--wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */
--wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */
--wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */
--wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */
--wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */
/*-----------------------
end logo position
***********************/
--wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */
--wiki-body-font-family: sans-serif;
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-width: 1px;
--wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */
--wiki-sidebar-portal-spacing: 0px;
--wiki-sidebar-border-width: var(--wiki-content-border-width);
--wiki-navigation-border-radius: 0px; /* border radius of tabs */
/*******************
* Maybe edit these * [ DESIGN ]
********************/
--wiki-logo-filter: none;
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-top-radius: var(--wiki-content-border-radius);
--wiki-content-border-style: solid;
--wiki-content-border-image: none;
--wiki-content-backdrop-filter: none;
--wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */
--wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */
--wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-margin: 0.5em;
--wiki-sidebar-list-item-padding: 0.25em 0.25rem;
--wiki-sidebar-list-padding: 0.25rem;
--wiki-sidebar-list-item-background--hover: none; /* background of hover item */
--wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */
--wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */
--wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-box-background-color: var(--wiki-content-background-color);
--wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content));
--wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
--wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
/* nav tabs style. The vector gradient is default.
* If you want to customize the style of tabs, it's easier to start with the following settings:
* --wiki-navigation-background-image: none;
* --wiki-navigation-selected-background-image: none;
* --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px );
* --wiki-navigation-selected-border-bottom-background: none;
* --wiki-navigation-tab-spacing: 0.25em;
* --wiki-navigation-tab-padding-top: 0.5em;
* --wiki-navigation-tab-padding-bottom: 0.5em;
*/
--wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */
--wiki-navigation-tab-padding-top: 1.25em;
--wiki-navigation-tab-padding-x: 0.75em;
--wiki-navigation-tab-padding-bottom: 4px;
--wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */
--wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */
--wiki-navigation-border-image: none;
--wiki-navigation-selected-border-image: var(--wiki-navigation-border-image);
--wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%);
--wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x;
--wiki-navigation-background-position: left bottom, right bottom, left bottom;
--wiki-navigation-background-size: 1px 100%, 1px 100%, 100%;
--wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%);
--wiki-navigation-selected-background-repeat: no-repeat, no-repeat;
--wiki-navigation-selected-background-position: left bottom, right bottom;
--wiki-navigation-selected-background-size: 1px 100%, 1px 100%;
--wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px);
/* affects the dropdown menu under More */
--wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color);
--wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color);
--wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */
--wiki-navigation-dropdown-border-width: 1px;
--wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius);
--wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */
--wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */
--wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */
--wiki-navigation-dropdown-border-image: none;
--wiki-navigation-dropdown-backdrop-filter: none;
--wiki-navigation-dropdown-box-shadow: none; /* box shadow */
/* styles of the footer */
--wiki-spacing-before-footer: 0px;
--wiki-footer-border-image: none;
/* padding on body element */
--wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */
--wiki-left-spacing: 0.5em;
--wiki-right-spacing: 1em;
--wiki-bottom-spacing: 2em;
/* end design variables */
}
/*----------------------------------------
***** END ADVANCED DESIGN VARIABLES ******
*****************************************/
/*******************************
**** START SHARED VARIABLES ****
**** tl;dr: don't edit this ****
********************************/
/*
These variables are rarely touched, usually inherit other variables, and are shared on all themes.
In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision,
understand what you are doing, and *know* that what you are trying to do is not accomplished by changing
another variable in the above sections.
Since these are by default shared across all themes, if you support multiple themes you'll probably want to
separate the variables you want to modify here into .view-x blocks like above. If you don't understand
what that means or how to do that then you probably shouldn't be modifying this section.
*/
:root {
--wiki-content-border-bottom-width: var(--wiki-content-border-width);
--wiki-content-border-bottom-style: var(--wiki-content-border-style);
--wiki-content-border-bottom-color: var(--wiki-content-border-color);
--wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%);
--wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color));
--wiki-content-text-color--hover: var(--wiki-content-text-color);
/* heading */
--wiki-content-heading-border-bottom-width: 1px;
--wiki-content-heading-border-style: solid;
--wiki-content-heading-font-weight: normal;
--wiki-content-heading-font-style: normal;
--wiki-content-heading-text-transform: none;
--wiki-content-heading-line-height: normal;
--wiki-content-heading-text-shadow: none;
/* first heading (h1) */
--wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width);
--wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family);
--wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight);
--wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style);
--wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform);
--wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-firstheading-color: var(--wiki-content-heading-color);
--wiki-content-firstheading-text-shadow: none;
/* sub-heading (h3, h4, h5, h6) */
--wiki-content-subheading-border-bottom-width: 0px;
--wiki-content-subheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-subheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-subheading-font-family: var(--wiki-body-font-family);
--wiki-content-subheading-font-weight: bold;
--wiki-content-subheading-font-style: normal;
--wiki-content-subheading-text-transform: none;
--wiki-content-subheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-subheading-color: var(--wiki-content-heading-color);
--wiki-content-subheading-text-shadow: none;
/* heading size */
--wiki-content-firstheading-font-size: 1.8em;
--wiki-content-heading-h2-font-size: 1.5em;
--wiki-content-heading-h3-font-size: 1.2em;
--wiki-content-heading-h4-font-size: 114%;
--wiki-content-heading-h5-font-size: 108%;
--wiki-content-heading-h6-font-size: 100%;
--wiki-content-toc-background: var(--wiki-content-background-color--secondary);
--wiki-content-toc-border-width: 1px;
--wiki-content-toc-border-style: solid;
--wiki-content-toc-border-color: var(--wiki-content-border-color);
--wiki-content-toc-border-radius: 0px;
--wiki-content-toc-border-image: none;
--wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000;
--wiki-content-catlinks-background: var(--wiki-content-background-color--secondary);
--wiki-content-catlinks-border-width: 1px;
--wiki-content-catlinks-border-style: solid;
--wiki-content-catlinks-border-color: var(--wiki-content-border-color);
--wiki-content-catlinks-border-radius: 0px;
--wiki-content-catlinks-border-image: none;
--wiki-content-catlinks-box-shadow: none;
--wiki-content-filetoc-background: var(--wiki-content-background-color--secondary);
--wiki-content-filetoc-border-width: 1px;
--wiki-content-filetoc-border-style: solid;
--wiki-content-filetoc-border-color: var(--wiki-content-border-color);
--wiki-content-filetoc-border-radius: 0px;
--wiki-content-filetoc-border-image: none;
--wiki-content-filetoc-box-shadow: none;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
--wiki-sidebar-padding: 0px;
--wiki-sidebar-background-color: var(--wiki-content-background-color);
--wiki-sidebar-background-opacity: var(--wiki-content-background-opacity);
--wiki-sidebar-background-image: none;
--wiki-sidebar-background-position: center;
--wiki-sidebar-background-repeat: repeat;
--wiki-sidebar-background-size: auto;
--wiki-sidebar-filter: none;
--wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-sidebar-border-color: var(--wiki-content-border-color);
--wiki-sidebar-border-style: solid;
--wiki-sidebar-border-image: none;
--wiki-sidebar-link-color: var(--wiki-content-link-color);
--wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-sidebar-heading-color: var(--wiki-content-heading-color);
--wiki-sidebar-heading-font-weight: normal;
--wiki-sidebar-heading-font-style: normal;
--wiki-sidebar-heading-text-transform: none;
--wiki-sidebar-heading-line-height: normal;
--wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem;
--wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-text-shadow: none;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter);
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-box-padding: 0px;
--wiki-sidebar-box-background: none;
--wiki-sidebar-box-border: 0px;
--wiki-sidebar-box-border-image: none;
--wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color));
--wiki-footer-border-width: var(--wiki-content-border-width);
--wiki-footer-border-style: var(--wiki-content-border-style);
--wiki-footer-border-color: var(--wiki-content-border-color);
--wiki-footer-background-color: var(--wiki-content-background-color);
--wiki-footer-background-opacity: var(--wiki-content-background-opacity);
--wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-footer-text-color: var(--wiki-content-text-color);
--wiki-footer-link-color: var(--wiki-content-link-color);
--wiki-footer-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-footer-border-radius: var(--wiki-content-border-radius);
--wiki-navigation-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-background-color--hover: var(--wiki-navigation-background-color);
--wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity);
--wiki-navigation-background-image--hover: var(--wiki-navigation-background-image);
--wiki-navigation-background-position--hover: var(--wiki-navigation-background-position);
--wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat);
--wiki-navigation-background-size--hover: var(--wiki-navigation-background-size);
--wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover);
--wiki-navigation-transform--hover: none;
--wiki-navigation-selected-border-style: solid;
--wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-border-style: solid;
--wiki-navigation-border-color--hover: var(--wiki-navigation-border-color);
--wiki-navigation-border-image--hover: var(--wiki-navigation-border-image);
--wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style);
--wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px));
--wiki-navigation-icon-size: 1em;
--wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x);
--wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */
--wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color);
--wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-dropdown-offset: 0px; /* vertical offset */
--wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-search-background-image: none;
--wiki-navigation-search-background-position: 0;
--wiki-navigation-search-background-size: auto;
--wiki-navigation-search-background-repeat: repeat;
--wiki-navigation-search-backdrop-filter: none;
--wiki-navigation-search-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-search-border-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-border-style: solid;
--wiki-navigation-search-border-width: 1px;
--wiki-navigation-search-border-radius: 2px;
--wiki-navigation-search-border-image: none;
--wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image);
--wiki-navigation-search-box-shadow: none;
--wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow);
--wiki-navigation-search-text-color: var(--wiki-content-text-color);
--wiki-navigation-search-font-size: var(--wiki-navigation-font-size);
--wiki-navigation-search-height: 2em;
--wiki-navigation-search-button-color: currentColor;
--wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color);
--wiki-navigation-search-button-color-opacity: 80%;
--wiki-navigation-search-button-color-opacity--hover: 95%;
--wiki-navigation-search-bottom-spacing: 3px;
--wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent);
--wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */
}
/*** mobile adjustments ***/
@media screen and (max-width: 720px) {
body.has-vector-mobile-menu{
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-margin: 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-margin: 0px 0px -0.5em 0px;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-background-opacity: 100%;
--wiki-navigation-search-border-width: 1px;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
}
}
/*****************************
**** END SHARED VARIABLES ****
******************************/
/******************************************************************************************
********************************* End user-edit variables *********************************
******************************************************************************************/
/******************************
* Fallback for older browsers *
* DONT EDIT THIS *
*******************************/
@supports not (color:color-mix(in srgb, #000, transparent)) {
.view-dark,
.view-light,
:root {
--wiki-content-text-mix-color: var(--wiki-content-text-color);
--wiki-content-text-mix-color-95: var(--wiki-content-background-color);
--wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted);
--wiki-content-border-color--secondary: var(--wiki-content-border-color);
--wiki-content-border-color--accent: var(--wiki-accent-color);
--wiki-accent-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-highlight-background-color: transparent;
}
}
/*****************************
* End older browser fallback *
******************************/
/*****************************
* PortableInfoboxes *
******************************/
:root {
--pi-background: var(--wiki-content-background-color);
--pi-secondary-background: var(--wiki-accent-color);
--pi-secondary-background-label: var(--wiki-accent-label-color);
--pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent);
}
.portable-infobox .pi-title,
.portable-infobox .pi-header {
text-align: center;
font-size: 1.5em;
background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent);
color: var(--pi-secondary-background-label);
}
.portable-infobox .pi-data,
.portable-infobox .pi-group {
background: var(--wiki-content-background-color--secondary);
}
.portable-infobox .pi-image {
padding: 8px;
}
.pi-image-thumbnail {
max-width: 100%;
}
.pi-caption {
color: var(--wiki-content-text-mix-color);
}
.pi-section-navigation .pi-section-tab.pi-section-active,
.pi-section-navigation .pi-section-tab.current,
.pi-media-collection .pi-tab-link.current {
background: var(--pi-secondary-background);
color: var(--pi-secondary-background-label);
}
.pi-collapse > .pi-item:first-child {
cursor: pointer;
}
/* overqualify these to overwrite normal content heading styles */
.mw-body .portable-infobox h2,
.mw-body .portable-infobox h3 {
border-bottom: 0;
font-family: inherit;
font-weight: 700;
margin: 0;
}
/*****************************
* End PortableInfoboxes *
******************************/
/*******************
* Main page layout *
********************/
#mp-container {
display: grid;
gap: 10px;
}
@media screen and (max-width: 990px) {
/* for mobile screens */
#mp-container {
grid-template-areas:var(--main-page-layout--mobile);
grid-template-columns:var(--main-page-layout-columns--mobile, 100%);
}
.mp-box.mp-hide-on-mobile {
display: none;
}
}
@media screen and (min-width: 990px) and (max-width: 1350px) {
/* for narrow screens, between 990px and 1350px */
#mp-container {
grid-template-areas:var(--main-page-layout--tablet);
grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr);
}
.mp-box.mp-hide-on-tablet {
display: none;
}
}
@media screen and (min-width: 1350px) {
/* for all other screens, 1350px and wider */
#mp-container {
grid-template-areas:var(--main-page-layout--desktop);
grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr);
}
.mp-box.mp-hide-on-desktop {
display: none;
}
}
.mp-box {
position: relative;
display: flex;
flex-flow: column nowrap;
width: 100%;
box-sizing: border-box;
background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent);
border: 1px solid var(--wiki-content-border-color);
padding: 0px;
}
.mp-body {
height: 100%;
display: flex;
padding: 0.5em;
flex-flow: column nowrap;
}
.mp-box.centered-content .mp-body {
height: 100%;
display: flex;
flex-flow: column nowrap;
justify-content: space-evenly;
}
.mp-box.has-floating-image {
display: block;
}
.mp-box.has-floating-image .mp-body {
height: unset;
display: block;
}
/* overqualified to override normal heading styles */
.mw-body .mp-box h2 {
text-align: center;
font-weight: bold;
font-family: var(--wiki-content-heading-font-family);
overflow: initial;
border-bottom: 1px solid var(--wiki-content-border-color);
font-size: 150%;
margin: 0;
padding: 5px 0;
color: var(--wiki-content-heading-color);
}
#mp-box-welcome {
text-align: center;
position: relative;
overflow: hidden;
}
#mp-box-welcome h2 {
font-size: 200%;
}
#mp-welcome {
display: flex;
flex-flow: column nowrap;
position: relative;
height: 100%;
z-index: 2;
box-sizing: border-box;
}
#mp-welcome .welcome-subtitle {
height: 100%;
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent);
padding: 0.5em;
}
#mp-banner {
position: absolute;
width: 100%;
height: 100%;
filter: blur(5px);
z-index: -1;
background: url(/images/e/e0/MP_banner.jpg);
background-size: cover;
background-repeat: no-repeat;
background-position: top center;
}
.view-dark #mp-banner {
filter: blur(5px) brightness(50%);
}
.view-light #mp-banner {
filter: blur(5px) contrast(50%);
}
/* [[Template:MP_link]] */
.mp-links {
--gap: 10px;
}
.mp-links > ul {
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin: 2px;
gap: var(--gap);
}
.mp-links > ul > li {
display: flex;
flex-flow: column nowrap;
align-items: stretch;
text-align: center;
box-sizing: border-box;
flex: max(calc(50% - var(--gap)), 5em) 1 1;
outline: 1px solid var(--wiki-content-link-color);
transition: 0.1s ease-in;
}
.mp-links > ul > li:hover {
background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent);
}
.mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;}
.mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;}
.mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;}
.mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;}
.mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;}
.mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;}
.mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;}
.mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;}
.mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;}
.mp-links > ul > li:hover a {
text-decoration: underline;
}
.mp-links > ul > li > a {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
flex: 1 1 auto;
box-sizing: border-box;
padding: 5px;
}
.mp-links > ul > li > a:first-child {
height: 100%;
}
.mp-links > ul > li > a:last-child:not(:first-child) {
height: unset;
}
.mp-links.stretch,
.mp-links.stretch > ul {
height: 100%;
}
.mp-links.side-image li {
flex-flow: row nowrap;
}
.mp-links.plain > ul > li {
outline-color: transparent;
}
/***********************
* End main page layout *
************************/
/*********************************************************************************************************************
* Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) *
**********************************************************************************************************************/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so: */
.hlist dt:not(:last-child)::after {
content: ":\20";
}
.hlist dd:not(:last-child)::after,
.hlist li:not(:last-child)::after {
/* "space, Middle Dot, space"
We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters.
The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */
/* content: "\20\00B7\20"; font-weight: bold; */
/* "space • space"
There may (and likely) be an extra whitespace between <li>s,
therefore we have to use a space character as last character of this sequence.
By this way, the last space and the next whitespce will collapse as a single space,
to make the whitespace on both sides of the middle dot the same width.
*/
content: "\20\A0\2022\A0\20";
font-weight: inherit;
}
/* Add parentheses around nested lists */
.hlist dd ol::before,
.hlist dd ul::before,
.hlist dd dl::before,
.hlist dt ol::before,
.hlist dt ul::before,
.hlist dt dl::before,
.hlist li ol::before,
.hlist li ul::before,
.hlist li dl::before {
content: "\20(";
font-weight: inherit;
}
.hlist dd ol::after,
.hlist dd ul::after,
.hlist dd dl::after,
.hlist dt ol::after,
.hlist dt ul::after,
.hlist dt dl::after,
.hlist li ol::after,
.hlist li ul::after,
.hlist li dl::after {
content: ")";
font-weight: inherit;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) ".\20";
}
/* Progressive enhancement:
* try to make the dot always follow the list item in same line
*/
.hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) {
display: inline-block;
}
/********************************************
* End semantically-correct horizontal lists *
*********************************************/
/*** Miscellaneous ***/
.responsive-image {
max-width: 100%;
height: auto;
}
.view-dark .invert-on-dark,
.view-light .invert-on-light {
filter: invert(100%);
}
.pixelated {
image-rendering: pixelated;
}
@media screen and (min-width: 720px) {
.mobileonly {
display: none;
}
}
@media screen and (max-width: 720px) {
.nomobile {
display: none;
}
}
/*** Utility classes for standard MW galleries ***/
/* it's important that spaced comes before centered in the sheet */
.gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin-left: unset;
}
.gallery.centered {
text-align: center;
}
/**************************
* Start Modular Templates *
**************************/
/********* [[Template:Ambox]] *********/
.ambox {
--ambox-color: var(--wiki-accent-color);
border: 1px solid var(--wiki-content-border-color);
border-left: 10px solid var(--ambox-color);
border-radius: 2px;
display: flex;
align-items: center;
gap: .6em;
margin: 1em 0;
padding: 3px .6em;
background-color: var(--wiki-content-background-color--secondary);
box-shadow: 2px 2px 5px 0px #0002;
}
@media (min-width: 720px) {
.ambox {
margin-inline: 10%;
}
}
.ambox.tiny {
padding: .04rem .5em;
margin-inline: 0;
width: fit-content;
}
.ambox + .ambox {
margin-top: -.6em;
}
.ambox-content {
flex: 1;
}
.ambox-content p {
margin: .15em 0;
}
.ambox-title {
font-weight: bold;
}
/********* [[Template:Hatnote]] *********/
.hatnote {
padding: 1px 0 1px 1.6em;
margin-bottom: 0.5em;
font-style: italic;
border-top: 1px solid var(--wiki-content-border-color--secondary);
border-bottom: 1px solid var(--wiki-content-border-color--secondary);
}
.hatnote.icon {
padding-left: 0;
}
/********* [[Template:Spoiler]] *********/
.spoiler-content {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent);
transition: all 0.3s;
cursor: pointer;
overflow: auto;
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
.spoiler-content {
background-color: var(--wiki-content-dynamic-color--secondary);
}
}
.spoiler-content > * {
pointer-events: none;
opacity: 0;
transition: all 0.3s;
}
.spoiler-content.show {
background-color: transparent;
}
.spoiler-content.show > * {
pointer-events: unset;
opacity: 1;
}
/********* [[Template:Link icon]] *********/
.link-icon {
--link-icon-line-height: 1.5em;
--link-icon-size: 1.5em;
display: inline-flex;
align-items: center;
height: var(--link-icon-line-height);
vertical-align: bottom;
}
.link-icon .regular {
align-self: center;
}
.link-icon .regular a {
display: flex;
}
.link-icon .regular img {
height: var(--link-icon-size);
max-width: var(--link-icon-size);
}
.link-icon .fallback {
outline: 1px solid var(--wiki-content-text-color);
border-radius: 50%;
text-align: center;
width: var(--link-icon-size);
line-height: var(--link-icon-size);
}
.link-icon.notext,
.link-icon.notext .fallback {
display: inline-block;
}
/********* [[Template:Quote]] *********/
.quote {
background: var(--wiki-content-background-color--secondary);
border-radius: 5px;
border: 2px solid var(--wiki-content-border-color);
margin: .5em 0;
padding: .5em;
overflow-y: hidden;
}
.quote .block {
display: block;
}
.quote .title {
font-size: large;
font-weight: bold;
}
.quote .content {
font-style: italic;
}
.quote .author {
font-weight: bold;
text-align: end;
}
.quote .marks-wrapper {
display: flex;
gap: 5px;
}
.quote .marks-wrapper::before,
.quote .marks-wrapper::after {
font-size: 100px;
line-height: 0px;
}
.quote .marks-wrapper::before {
content: "\201C";
margin-top: 40px;
}
.quote .marks-wrapper::after {
content: "\201D";
align-self: end;
margin-bottom: -10px;
}
.client-js .mw-charinsert-item {
display: none;
}
/************************
* End Modular Templates *
*************************/
/*****************************
* Used by [[Template:Color]] *
******************************/
.color__splotch {
display: inline-block;
height: 1em;
width: 1em;
box-sizing: border-box;
vertical-align: text-top;
border-radius: 50%;
border: 1px solid var(--wiki-content-text-color);
}
/*********************
* End Template:Color *
**********************/
/*********************************
* Used by [[Template:TOC limit]] *
**********************************/
.toclimit-2 .toclevel-1 ul,
.toclimit-3 .toclevel-2 ul,
.toclimit-4 .toclevel-3 ul,
.toclimit-5 .toclevel-4 ul,
.toclimit-6 .toclevel-5 ul,
.toclimit-7 .toclevel-6 ul {
display: none;
}
/*************************
* End Template:TOC limit *
**************************/
/*********************************
* Used by [[Template:TOC right]] *
**********************************/
@media all and (min-width: 720px) {
.tocright {
float: right;
clear: right;
margin: 0 0 0.5em 1em;
}
}
/*************************
* End Template:TOC right *
**************************/
811b0c2d2cf7be45e70eb3d56d102f46be473d27
1368
1366
2025-08-25T16:37:46Z
Sharparam
284703
Add background image for light theme
css
text/css
/* CSS placed here will be applied to all skins */
/******************************************************************************************
********************************* Start user-edit variables *******************************
******************************************************************************************/
/*****************************************
****** START BASIC DESIGN VARIABLES ******
----------------------------------------*/
:root {
--wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif;
--wiki-sidebar-heading-font-family: sans-serif;
--wiki-content-border-radius: 0px;
--wiki-sidebar-border-radius: 0px;
}
/*----------------------------------------
******* END BASIC DESIGN VARIABLES *******
*****************************************/
/*****************************************
****** START BASIC COLOR VARIABLES *******
----------------------------------------*/
:root,
/* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=light, */
/* individual themes are prefixed with .theme- instead */
.view-light {
/**********************
* Probably edit these * [ LIGHT VIEW ]
***********************/
--wiki-body-background-color: #F6F6F6;
--wiki-body-background-image: url(filepath://Site-background.jpg);
--wiki-content-background-color: #ffffff;
--wiki-content-background-opacity: 100%;
--wiki-content-border-color: #a7d7f9;
--wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ LIGHT VIEW ] */
--wiki-accent-color: #3366cc;
--wiki-accent-label-color: #ffffff;
--wiki-accent-link-color: #D5FB51;
--wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
/* Site background */
--wiki-body-background-image: url(filepath://Site-background-light.jpg);
--wiki-body-background-position: center;
--wiki-body-background-size: cover;
--wiki-body-background-attachment: fixed;
}
/* end light styles */
/* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */
/* FYI: .view- will affect any theme marked |kind=dark, */
/* individual themes are prefixed with .theme- instead */
.view-dark {
/**********************
* Probably edit these * [ DARK VIEW ]
***********************/
--wiki-body-background-color: #171717;
--wiki-body-background-image: url(filepath://Site-background-dark.jpg);
--wiki-content-background-color: #202020;
--wiki-content-background-opacity: 90%;
/* DEFAULT: --wiki-content-border-color: #991A51; */
--wiki-content-border-color: hsl(0deg 0% 30%);
--wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */
/* [ DARK VIEW ] */
/* DEFAULT: --wiki-accent-color: #ff4d9d; */
--wiki-accent-color: hsl(0deg 0% 75%);
--wiki-accent-label-color: #000;
--wiki-accent-link-color: #1e1e43;
--wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */
/**/
/* Site background */
--wiki-body-background-image: url(filepath://Site-background.jpg);
--wiki-body-background-position: center;
--wiki-body-background-size: cover;
--wiki-body-background-attachment: fixed;
}
/* End dark styles */
/*----------------------------------------
******* END BASIC COLOR VARIABLES ********
*****************************************/
/*****************************************
**** START ADVANCED COLOR VARIABLES ******
----------------------------------------*/
:root,
.view-light {
/*******************
* Maybe edit these * [ LIGHT VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #111111;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #ba0000;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ LIGHT VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ LIGHT VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #bf0017;
--wiki-warning-color: #b05f30;
--wiki-success-color: #0c742f;
/**/
/***********************************
* Likely do not need to edit these * [ LIGHT VIEW ]
************************************/
--wiki-body-dynamic-color: #000000;
--wiki-body-dynamic-color--inverted: #ffffff;
--wiki-body-dynamic-color--secondary: #333333;
--wiki-body-dynamic-color--secondary--inverted: #cccccc;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #ffffff;
--wiki-content-dynamic-color: #000000;
--wiki-content-dynamic-color--inverted: #ffffff;
--wiki-content-dynamic-color--secondary: #333333;
--wiki-content-dynamic-color--secondary--inverted: #cccccc;
/* [ LIGHT VIEW ] */
--wiki-alert-label-color: #ffffff;
--wiki-warning-label-color: #ffffff;
--wiki-success-label-color: #ffffff;
--wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */
/**/
}
.view-dark {
/*******************
* Maybe edit these * [ DARK VIEW ]
********************/
--wiki-body-background-position: top center;
--wiki-body-background-size: cover;
--wiki-body-background-repeat: no-repeat;
--wiki-body-background-attachment: fixed;
--wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color));
--wiki-content-text-color: #ededed;
--wiki-content-link-color--visited: var(--wiki-content-link-color);
--wiki-content-link-color--hover: var(--wiki-content-link-color);
--wiki-content-redlink-color: #FC5B4F;
--wiki-content-heading-color: var(--wiki-content-text-color);
--wiki-content-heading-border-color: var(--wiki-content-border-color);
/* [ DARK VIEW ] */
--wiki-navigation-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-border-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-text-color: var(--wiki-content-link-color);
--wiki-navigation-selected-background-color: var(--wiki-content-background-color);
--wiki-navigation-selected-border-color: var(--wiki-content-border-color);
--wiki-navigation-selected-text-color: var(--wiki-content-text-color);
/* [ DARK VIEW ] */
--wiki-neutral-color: var(--wiki-content-text-mix-color);
--wiki-alert-color: #ff576a;
--wiki-warning-color: #cf721c;
--wiki-success-color: #13aa45;
/**/
/***********************************
* Likely do not need to edit these * [ DARK VIEW ]
************************************/
--wiki-body-dynamic-color: #ffffff;
--wiki-body-dynamic-color--inverted: #000000;
--wiki-body-dynamic-color--secondary: #cccccc;
--wiki-body-dynamic-color--secondary--inverted: #333333;
--wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent);
--wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent);
--wiki-content-link-label-color: #000;
--wiki-content-dynamic-color: #ffffff;
--wiki-content-dynamic-color--inverted: #000000;
--wiki-content-dynamic-color--secondary: #cccccc;
--wiki-content-dynamic-color--secondary--inverted: #333333;
/* [ DARK VIEW ] */
--wiki-alert-label-color: #000000;
--wiki-warning-label-color: #000000;
--wiki-success-label-color: #000000;
--wiki-icon-general-filter: invert(100%);
}
/*----------------------------------------
***** END ADVANCED COLOR VARIABLES *******
*****************************************/
/*****************************************
**** START ADVANCED DESIGN VARIABLES *****
----------------------------------------*/
:root {
/***********************
start logo position
----------------------*/
--wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */
--wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */
--wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */
--wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */
--wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */
/*-----------------------
end logo position
***********************/
--wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */
--wiki-body-font-family: sans-serif;
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-width: 1px;
--wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */
--wiki-sidebar-portal-spacing: 0px;
--wiki-sidebar-border-width: var(--wiki-content-border-width);
--wiki-navigation-border-radius: 0px; /* border radius of tabs */
/*******************
* Maybe edit these * [ DESIGN ]
********************/
--wiki-logo-filter: none;
/****** the following length variables must have units specified even if 0, ignore the warning *****/
--wiki-content-border-top-radius: var(--wiki-content-border-radius);
--wiki-content-border-style: solid;
--wiki-content-border-image: none;
--wiki-content-backdrop-filter: none;
--wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */
--wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */
--wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */
--wiki-sidebar-margin: 0.5em;
--wiki-sidebar-list-item-padding: 0.25em 0.25rem;
--wiki-sidebar-list-padding: 0.25rem;
--wiki-sidebar-list-item-background--hover: none; /* background of hover item */
--wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */
--wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */
--wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem );
--wiki-navigation-box-background-color: var(--wiki-content-background-color);
--wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content));
--wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */
--wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
--wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */
/* nav tabs style. The vector gradient is default.
* If you want to customize the style of tabs, it's easier to start with the following settings:
* --wiki-navigation-background-image: none;
* --wiki-navigation-selected-background-image: none;
* --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px );
* --wiki-navigation-selected-border-bottom-background: none;
* --wiki-navigation-tab-spacing: 0.25em;
* --wiki-navigation-tab-padding-top: 0.5em;
* --wiki-navigation-tab-padding-bottom: 0.5em;
*/
--wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */
--wiki-navigation-tab-padding-top: 1.25em;
--wiki-navigation-tab-padding-x: 0.75em;
--wiki-navigation-tab-padding-bottom: 4px;
--wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */
--wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */
--wiki-navigation-border-image: none;
--wiki-navigation-selected-border-image: var(--wiki-navigation-border-image);
--wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%);
--wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x;
--wiki-navigation-background-position: left bottom, right bottom, left bottom;
--wiki-navigation-background-size: 1px 100%, 1px 100%, 100%;
--wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%);
--wiki-navigation-selected-background-repeat: no-repeat, no-repeat;
--wiki-navigation-selected-background-position: left bottom, right bottom;
--wiki-navigation-selected-background-size: 1px 100%, 1px 100%;
--wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px);
/* affects the dropdown menu under More */
--wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color);
--wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color);
--wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */
--wiki-navigation-dropdown-border-width: 1px;
--wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius);
--wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */
--wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */
--wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */
--wiki-navigation-dropdown-border-image: none;
--wiki-navigation-dropdown-backdrop-filter: none;
--wiki-navigation-dropdown-box-shadow: none; /* box shadow */
/* styles of the footer */
--wiki-spacing-before-footer: 0px;
--wiki-footer-border-image: none;
/* padding on body element */
--wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */
--wiki-left-spacing: 0.5em;
--wiki-right-spacing: 1em;
--wiki-bottom-spacing: 2em;
/* end design variables */
}
/*----------------------------------------
***** END ADVANCED DESIGN VARIABLES ******
*****************************************/
/*******************************
**** START SHARED VARIABLES ****
**** tl;dr: don't edit this ****
********************************/
/*
These variables are rarely touched, usually inherit other variables, and are shared on all themes.
In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision,
understand what you are doing, and *know* that what you are trying to do is not accomplished by changing
another variable in the above sections.
Since these are by default shared across all themes, if you support multiple themes you'll probably want to
separate the variables you want to modify here into .view-x blocks like above. If you don't understand
what that means or how to do that then you probably shouldn't be modifying this section.
*/
:root {
--wiki-content-border-bottom-width: var(--wiki-content-border-width);
--wiki-content-border-bottom-style: var(--wiki-content-border-style);
--wiki-content-border-bottom-color: var(--wiki-content-border-color);
--wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%);
--wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color));
--wiki-content-text-color--hover: var(--wiki-content-text-color);
/* heading */
--wiki-content-heading-border-bottom-width: 1px;
--wiki-content-heading-border-style: solid;
--wiki-content-heading-font-weight: normal;
--wiki-content-heading-font-style: normal;
--wiki-content-heading-text-transform: none;
--wiki-content-heading-line-height: normal;
--wiki-content-heading-text-shadow: none;
/* first heading (h1) */
--wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width);
--wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family);
--wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight);
--wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style);
--wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform);
--wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-firstheading-color: var(--wiki-content-heading-color);
--wiki-content-firstheading-text-shadow: none;
/* sub-heading (h3, h4, h5, h6) */
--wiki-content-subheading-border-bottom-width: 0px;
--wiki-content-subheading-border-style: var(--wiki-content-heading-border-style);
--wiki-content-subheading-border-color: var(--wiki-content-heading-border-color);
--wiki-content-subheading-font-family: var(--wiki-body-font-family);
--wiki-content-subheading-font-weight: bold;
--wiki-content-subheading-font-style: normal;
--wiki-content-subheading-text-transform: none;
--wiki-content-subheading-line-height: var(--wiki-content-heading-line-height);
--wiki-content-subheading-color: var(--wiki-content-heading-color);
--wiki-content-subheading-text-shadow: none;
/* heading size */
--wiki-content-firstheading-font-size: 1.8em;
--wiki-content-heading-h2-font-size: 1.5em;
--wiki-content-heading-h3-font-size: 1.2em;
--wiki-content-heading-h4-font-size: 114%;
--wiki-content-heading-h5-font-size: 108%;
--wiki-content-heading-h6-font-size: 100%;
--wiki-content-toc-background: var(--wiki-content-background-color--secondary);
--wiki-content-toc-border-width: 1px;
--wiki-content-toc-border-style: solid;
--wiki-content-toc-border-color: var(--wiki-content-border-color);
--wiki-content-toc-border-radius: 0px;
--wiki-content-toc-border-image: none;
--wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000;
--wiki-content-catlinks-background: var(--wiki-content-background-color--secondary);
--wiki-content-catlinks-border-width: 1px;
--wiki-content-catlinks-border-style: solid;
--wiki-content-catlinks-border-color: var(--wiki-content-border-color);
--wiki-content-catlinks-border-radius: 0px;
--wiki-content-catlinks-border-image: none;
--wiki-content-catlinks-box-shadow: none;
--wiki-content-filetoc-background: var(--wiki-content-background-color--secondary);
--wiki-content-filetoc-border-width: 1px;
--wiki-content-filetoc-border-style: solid;
--wiki-content-filetoc-border-color: var(--wiki-content-border-color);
--wiki-content-filetoc-border-radius: 0px;
--wiki-content-filetoc-border-image: none;
--wiki-content-filetoc-box-shadow: none;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
--wiki-sidebar-padding: 0px;
--wiki-sidebar-background-color: var(--wiki-content-background-color);
--wiki-sidebar-background-opacity: var(--wiki-content-background-opacity);
--wiki-sidebar-background-image: none;
--wiki-sidebar-background-position: center;
--wiki-sidebar-background-repeat: repeat;
--wiki-sidebar-background-size: auto;
--wiki-sidebar-filter: none;
--wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-sidebar-border-color: var(--wiki-content-border-color);
--wiki-sidebar-border-style: solid;
--wiki-sidebar-border-image: none;
--wiki-sidebar-link-color: var(--wiki-content-link-color);
--wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-sidebar-heading-color: var(--wiki-content-heading-color);
--wiki-sidebar-heading-font-weight: normal;
--wiki-sidebar-heading-font-style: normal;
--wiki-sidebar-heading-text-transform: none;
--wiki-sidebar-heading-line-height: normal;
--wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem;
--wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-text-shadow: none;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter);
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-box-padding: 0px;
--wiki-sidebar-box-background: none;
--wiki-sidebar-box-border: 0px;
--wiki-sidebar-box-border-image: none;
--wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color));
--wiki-footer-border-width: var(--wiki-content-border-width);
--wiki-footer-border-style: var(--wiki-content-border-style);
--wiki-footer-border-color: var(--wiki-content-border-color);
--wiki-footer-background-color: var(--wiki-content-background-color);
--wiki-footer-background-opacity: var(--wiki-content-background-opacity);
--wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter);
--wiki-footer-text-color: var(--wiki-content-text-color);
--wiki-footer-link-color: var(--wiki-content-link-color);
--wiki-footer-link-color--hover: var(--wiki-content-link-color--hover);
--wiki-footer-border-radius: var(--wiki-content-border-radius);
--wiki-navigation-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-background-color--hover: var(--wiki-navigation-background-color);
--wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity);
--wiki-navigation-background-image--hover: var(--wiki-navigation-background-image);
--wiki-navigation-background-position--hover: var(--wiki-navigation-background-position);
--wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat);
--wiki-navigation-background-size--hover: var(--wiki-navigation-background-size);
--wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover);
--wiki-navigation-transform--hover: none;
--wiki-navigation-selected-border-style: solid;
--wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-border-style: solid;
--wiki-navigation-border-color--hover: var(--wiki-navigation-border-color);
--wiki-navigation-border-image--hover: var(--wiki-navigation-border-image);
--wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color);
--wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style);
--wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px));
--wiki-navigation-icon-size: 1em;
--wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x);
--wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */
--wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color);
--wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity);
--wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-dropdown-offset: 0px; /* vertical offset */
--wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary);
--wiki-navigation-search-background-image: none;
--wiki-navigation-search-background-position: 0;
--wiki-navigation-search-background-size: auto;
--wiki-navigation-search-background-repeat: repeat;
--wiki-navigation-search-backdrop-filter: none;
--wiki-navigation-search-border-color: var(--wiki-navigation-border-color);
--wiki-navigation-search-border-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-border-style: solid;
--wiki-navigation-search-border-width: 1px;
--wiki-navigation-search-border-radius: 2px;
--wiki-navigation-search-border-image: none;
--wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image);
--wiki-navigation-search-box-shadow: none;
--wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow);
--wiki-navigation-search-text-color: var(--wiki-content-text-color);
--wiki-navigation-search-font-size: var(--wiki-navigation-font-size);
--wiki-navigation-search-height: 2em;
--wiki-navigation-search-button-color: currentColor;
--wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color);
--wiki-navigation-search-button-color-opacity: 80%;
--wiki-navigation-search-button-color-opacity--hover: 95%;
--wiki-navigation-search-bottom-spacing: 3px;
--wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent);
--wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */
}
/*** mobile adjustments ***/
@media screen and (max-width: 720px) {
body.has-vector-mobile-menu{
--wiki-sidebar-offset: 0px; /* Vertical offset */
--wiki-sidebar-margin: 0px;
--wiki-sidebar-heading-background: none;
--wiki-sidebar-heading-border-image: none;
--wiki-sidebar-heading-margin: 0px 0px -0.5em 0px;
--wiki-sidebar-list-margin: 0px;
--wiki-sidebar-list-background: none;
--wiki-sidebar-list-border-image: none;
--wiki-sidebar-list-item-background: none;
--wiki-sidebar-list-item-border-image: none;
--wiki-sidebar-list-item-background--hover: none;
--wiki-sidebar-list-item-border-image--hover: none;
--wiki-sidebar-list-item-spacing: 0px;
--wiki-sidebar-line-height: 1.125;
--wiki-sidebar-background-opacity: 100%;
--wiki-navigation-search-border-width: 1px;
--wiki-logo-offset-x: 0px;
--wiki-logo-offset-y: 0px;
}
}
/*****************************
**** END SHARED VARIABLES ****
******************************/
/******************************************************************************************
********************************* End user-edit variables *********************************
******************************************************************************************/
/******************************
* Fallback for older browsers *
* DONT EDIT THIS *
*******************************/
@supports not (color:color-mix(in srgb, #000, transparent)) {
.view-dark,
.view-light,
:root {
--wiki-content-text-mix-color: var(--wiki-content-text-color);
--wiki-content-text-mix-color-95: var(--wiki-content-background-color);
--wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted);
--wiki-content-border-color--secondary: var(--wiki-content-border-color);
--wiki-content-border-color--accent: var(--wiki-accent-color);
--wiki-accent-color--hover: var(--wiki-accent-color);
--wiki-navigation-search-highlight-background-color: transparent;
}
}
/*****************************
* End older browser fallback *
******************************/
/*****************************
* PortableInfoboxes *
******************************/
:root {
--pi-background: var(--wiki-content-background-color);
--pi-secondary-background: var(--wiki-accent-color);
--pi-secondary-background-label: var(--wiki-accent-label-color);
--pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent);
}
.portable-infobox .pi-title,
.portable-infobox .pi-header {
text-align: center;
font-size: 1.5em;
background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent);
color: var(--pi-secondary-background-label);
}
.portable-infobox .pi-data,
.portable-infobox .pi-group {
background: var(--wiki-content-background-color--secondary);
}
.portable-infobox .pi-image {
padding: 8px;
}
.pi-image-thumbnail {
max-width: 100%;
}
.pi-caption {
color: var(--wiki-content-text-mix-color);
}
.pi-section-navigation .pi-section-tab.pi-section-active,
.pi-section-navigation .pi-section-tab.current,
.pi-media-collection .pi-tab-link.current {
background: var(--pi-secondary-background);
color: var(--pi-secondary-background-label);
}
.pi-collapse > .pi-item:first-child {
cursor: pointer;
}
/* overqualify these to overwrite normal content heading styles */
.mw-body .portable-infobox h2,
.mw-body .portable-infobox h3 {
border-bottom: 0;
font-family: inherit;
font-weight: 700;
margin: 0;
}
/*****************************
* End PortableInfoboxes *
******************************/
/*******************
* Main page layout *
********************/
#mp-container {
display: grid;
gap: 10px;
}
@media screen and (max-width: 990px) {
/* for mobile screens */
#mp-container {
grid-template-areas:var(--main-page-layout--mobile);
grid-template-columns:var(--main-page-layout-columns--mobile, 100%);
}
.mp-box.mp-hide-on-mobile {
display: none;
}
}
@media screen and (min-width: 990px) and (max-width: 1350px) {
/* for narrow screens, between 990px and 1350px */
#mp-container {
grid-template-areas:var(--main-page-layout--tablet);
grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr);
}
.mp-box.mp-hide-on-tablet {
display: none;
}
}
@media screen and (min-width: 1350px) {
/* for all other screens, 1350px and wider */
#mp-container {
grid-template-areas:var(--main-page-layout--desktop);
grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr);
}
.mp-box.mp-hide-on-desktop {
display: none;
}
}
.mp-box {
position: relative;
display: flex;
flex-flow: column nowrap;
width: 100%;
box-sizing: border-box;
background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent);
border: 1px solid var(--wiki-content-border-color);
padding: 0px;
}
.mp-body {
height: 100%;
display: flex;
padding: 0.5em;
flex-flow: column nowrap;
}
.mp-box.centered-content .mp-body {
height: 100%;
display: flex;
flex-flow: column nowrap;
justify-content: space-evenly;
}
.mp-box.has-floating-image {
display: block;
}
.mp-box.has-floating-image .mp-body {
height: unset;
display: block;
}
/* overqualified to override normal heading styles */
.mw-body .mp-box h2 {
text-align: center;
font-weight: bold;
font-family: var(--wiki-content-heading-font-family);
overflow: initial;
border-bottom: 1px solid var(--wiki-content-border-color);
font-size: 150%;
margin: 0;
padding: 5px 0;
color: var(--wiki-content-heading-color);
}
#mp-box-welcome {
text-align: center;
position: relative;
overflow: hidden;
}
#mp-box-welcome h2 {
font-size: 200%;
}
#mp-welcome {
display: flex;
flex-flow: column nowrap;
position: relative;
height: 100%;
z-index: 2;
box-sizing: border-box;
}
#mp-welcome .welcome-subtitle {
height: 100%;
background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent);
padding: 0.5em;
}
#mp-banner {
position: absolute;
width: 100%;
height: 100%;
filter: blur(5px);
z-index: -1;
background: url(/images/e/e0/MP_banner.jpg);
background-size: cover;
background-repeat: no-repeat;
background-position: top center;
}
.view-dark #mp-banner {
filter: blur(5px) brightness(50%);
}
.view-light #mp-banner {
filter: blur(5px) contrast(50%);
}
/* [[Template:MP_link]] */
.mp-links {
--gap: 10px;
}
.mp-links > ul {
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin: 2px;
gap: var(--gap);
}
.mp-links > ul > li {
display: flex;
flex-flow: column nowrap;
align-items: stretch;
text-align: center;
box-sizing: border-box;
flex: max(calc(50% - var(--gap)), 5em) 1 1;
outline: 1px solid var(--wiki-content-link-color);
transition: 0.1s ease-in;
}
.mp-links > ul > li:hover {
background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent);
}
.mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;}
.mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;}
.mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;}
.mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;}
.mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;}
.mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;}
.mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;}
.mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;}
.mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;}
.mp-links > ul > li:hover a {
text-decoration: underline;
}
.mp-links > ul > li > a {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
flex: 1 1 auto;
box-sizing: border-box;
padding: 5px;
}
.mp-links > ul > li > a:first-child {
height: 100%;
}
.mp-links > ul > li > a:last-child:not(:first-child) {
height: unset;
}
.mp-links.stretch,
.mp-links.stretch > ul {
height: 100%;
}
.mp-links.side-image li {
flex-flow: row nowrap;
}
.mp-links.plain > ul > li {
outline-color: transparent;
}
/***********************
* End main page layout *
************************/
/*********************************************************************************************************************
* Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) *
**********************************************************************************************************************/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so: */
.hlist dt:not(:last-child)::after {
content: ":\20";
}
.hlist dd:not(:last-child)::after,
.hlist li:not(:last-child)::after {
/* "space, Middle Dot, space"
We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters.
The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */
/* content: "\20\00B7\20"; font-weight: bold; */
/* "space • space"
There may (and likely) be an extra whitespace between <li>s,
therefore we have to use a space character as last character of this sequence.
By this way, the last space and the next whitespce will collapse as a single space,
to make the whitespace on both sides of the middle dot the same width.
*/
content: "\20\A0\2022\A0\20";
font-weight: inherit;
}
/* Add parentheses around nested lists */
.hlist dd ol::before,
.hlist dd ul::before,
.hlist dd dl::before,
.hlist dt ol::before,
.hlist dt ul::before,
.hlist dt dl::before,
.hlist li ol::before,
.hlist li ul::before,
.hlist li dl::before {
content: "\20(";
font-weight: inherit;
}
.hlist dd ol::after,
.hlist dd ul::after,
.hlist dd dl::after,
.hlist dt ol::after,
.hlist dt ul::after,
.hlist dt dl::after,
.hlist li ol::after,
.hlist li ul::after,
.hlist li dl::after {
content: ")";
font-weight: inherit;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) ".\20";
}
/* Progressive enhancement:
* try to make the dot always follow the list item in same line
*/
.hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) {
display: inline-block;
}
/********************************************
* End semantically-correct horizontal lists *
*********************************************/
/*** Miscellaneous ***/
.responsive-image {
max-width: 100%;
height: auto;
}
.view-dark .invert-on-dark,
.view-light .invert-on-light {
filter: invert(100%);
}
.pixelated {
image-rendering: pixelated;
}
@media screen and (min-width: 720px) {
.mobileonly {
display: none;
}
}
@media screen and (max-width: 720px) {
.nomobile {
display: none;
}
}
/*** Utility classes for standard MW galleries ***/
/* it's important that spaced comes before centered in the sheet */
.gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
margin-left: unset;
}
.gallery.centered {
text-align: center;
}
/**************************
* Start Modular Templates *
**************************/
/********* [[Template:Ambox]] *********/
.ambox {
--ambox-color: var(--wiki-accent-color);
border: 1px solid var(--wiki-content-border-color);
border-left: 10px solid var(--ambox-color);
border-radius: 2px;
display: flex;
align-items: center;
gap: .6em;
margin: 1em 0;
padding: 3px .6em;
background-color: var(--wiki-content-background-color--secondary);
box-shadow: 2px 2px 5px 0px #0002;
}
@media (min-width: 720px) {
.ambox {
margin-inline: 10%;
}
}
.ambox.tiny {
padding: .04rem .5em;
margin-inline: 0;
width: fit-content;
}
.ambox + .ambox {
margin-top: -.6em;
}
.ambox-content {
flex: 1;
}
.ambox-content p {
margin: .15em 0;
}
.ambox-title {
font-weight: bold;
}
/********* [[Template:Hatnote]] *********/
.hatnote {
padding: 1px 0 1px 1.6em;
margin-bottom: 0.5em;
font-style: italic;
border-top: 1px solid var(--wiki-content-border-color--secondary);
border-bottom: 1px solid var(--wiki-content-border-color--secondary);
}
.hatnote.icon {
padding-left: 0;
}
/********* [[Template:Spoiler]] *********/
.spoiler-content {
background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent);
transition: all 0.3s;
cursor: pointer;
overflow: auto;
}
@supports not (color:color-mix(in srgb, #000, transparent)) {
.spoiler-content {
background-color: var(--wiki-content-dynamic-color--secondary);
}
}
.spoiler-content > * {
pointer-events: none;
opacity: 0;
transition: all 0.3s;
}
.spoiler-content.show {
background-color: transparent;
}
.spoiler-content.show > * {
pointer-events: unset;
opacity: 1;
}
/********* [[Template:Link icon]] *********/
.link-icon {
--link-icon-line-height: 1.5em;
--link-icon-size: 1.5em;
display: inline-flex;
align-items: center;
height: var(--link-icon-line-height);
vertical-align: bottom;
}
.link-icon .regular {
align-self: center;
}
.link-icon .regular a {
display: flex;
}
.link-icon .regular img {
height: var(--link-icon-size);
max-width: var(--link-icon-size);
}
.link-icon .fallback {
outline: 1px solid var(--wiki-content-text-color);
border-radius: 50%;
text-align: center;
width: var(--link-icon-size);
line-height: var(--link-icon-size);
}
.link-icon.notext,
.link-icon.notext .fallback {
display: inline-block;
}
/********* [[Template:Quote]] *********/
.quote {
background: var(--wiki-content-background-color--secondary);
border-radius: 5px;
border: 2px solid var(--wiki-content-border-color);
margin: .5em 0;
padding: .5em;
overflow-y: hidden;
}
.quote .block {
display: block;
}
.quote .title {
font-size: large;
font-weight: bold;
}
.quote .content {
font-style: italic;
}
.quote .author {
font-weight: bold;
text-align: end;
}
.quote .marks-wrapper {
display: flex;
gap: 5px;
}
.quote .marks-wrapper::before,
.quote .marks-wrapper::after {
font-size: 100px;
line-height: 0px;
}
.quote .marks-wrapper::before {
content: "\201C";
margin-top: 40px;
}
.quote .marks-wrapper::after {
content: "\201D";
align-self: end;
margin-bottom: -10px;
}
.client-js .mw-charinsert-item {
display: none;
}
/************************
* End Modular Templates *
*************************/
/*****************************
* Used by [[Template:Color]] *
******************************/
.color__splotch {
display: inline-block;
height: 1em;
width: 1em;
box-sizing: border-box;
vertical-align: text-top;
border-radius: 50%;
border: 1px solid var(--wiki-content-text-color);
}
/*********************
* End Template:Color *
**********************/
/*********************************
* Used by [[Template:TOC limit]] *
**********************************/
.toclimit-2 .toclevel-1 ul,
.toclimit-3 .toclevel-2 ul,
.toclimit-4 .toclevel-3 ul,
.toclimit-5 .toclevel-4 ul,
.toclimit-6 .toclevel-5 ul,
.toclimit-7 .toclevel-6 ul {
display: none;
}
/*************************
* End Template:TOC limit *
**************************/
/*********************************
* Used by [[Template:TOC right]] *
**********************************/
@media all and (min-width: 720px) {
.tocright {
float: right;
clear: right;
margin: 0 0 0.5em 1em;
}
}
/*************************
* End Template:TOC right *
**************************/
4a7903762df7411b028fa7d0ce46dca67d0559d5
File:Site-background-light.jpg
6
863
1367
2025-08-25T16:37:03Z
Sharparam
284703
From the SteamDB screenshots page: https://steamdb.info/app/1173220/screenshots/
wikitext
text/x-wiki
== Summary ==
From the SteamDB screenshots page: https://steamdb.info/app/1173220/screenshots/
== Licensing ==
{{License|game}}
e1998ae6a00a7eb247838ce82b0e75517d54eb6d
1370
1367
2025-08-25T16:44:22Z
Sharparam
284703
Protected "[[File:Site-background-light.jpg]]": Part of skin ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite))
wikitext
text/x-wiki
== Summary ==
From the SteamDB screenshots page: https://steamdb.info/app/1173220/screenshots/
== Licensing ==
{{License|game}}
e1998ae6a00a7eb247838ce82b0e75517d54eb6d
Template:Date
10
864
1371
2025-08-25T20:40:38Z
Sharparam
284703
Created page with "{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | iso = Y-m-d | dmy | rfc = j M Y | #default = {{{2|Y-m-d}}} }} }}<!-- -->{{#vardefine:dto|{{{1|now}}}}}<!-- --><time datetime="{{#time: Y-m-d|{{#var:dto}}}}"><!-- -->{{#time: {{#var:format}}|{{#var:dto}}}}<!-- --></time><noinclude> {{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{#vardefine:format|{{#switch:{{lc:{{{2}}}}}
| iso = Y-m-d
| dmy
| rfc = j M Y
| #default = {{{2|Y-m-d}}}
}}
}}<!--
-->{{#vardefine:dto|{{{1|now}}}}}<!--
--><time datetime="{{#time: Y-m-d|{{#var:dto}}}}"><!--
-->{{#time: {{#var:format}}|{{#var:dto}}}}<!--
--></time><noinclude>
{{Documentation}}</noinclude>
69a10f946cbad0362ff4fff45fadc1ccba0232df
Template:Date/doc
10
865
1372
2025-08-25T20:51:51Z
Sharparam
284703
Created page with "Produces a properly formatted date in wiki articles. The output will be wrapped in a {{tag|time}} HTML tag where an ISO date is put in the <code>datetime</code> attribute, while the rendered format can be customized by using the second parameter of the template. For consistent reading of wikitext source, it is recommended to use ISO 8601 format for the input date parameter. == TemplateData == <templatedata> { "params": { "1": { "label": "Date object", "descr..."
wikitext
text/x-wiki
Produces a properly formatted date in wiki articles.
The output will be wrapped in a {{tag|time}} HTML tag where an ISO date is put in the <code>datetime</code> attribute, while the rendered format can be customized by using the second parameter of the template.
For consistent reading of wikitext source, it is recommended to use ISO 8601 format for the input date parameter.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Date object",
"description": "The date object to format.",
"example": "2025-08-25",
"type": "line",
"default": "now",
"suggested": true
},
"2": {
"label": "Format",
"description": "The format to use to display the time.",
"example": "ISO",
"type": "line",
"suggestedvalues": [
"ISO",
"RFC"
],
"default": "ISO"
}
},
"description": "Produces a properly formatted date string",
"paramOrder": [
"1",
"2"
],
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Date}}</syntaxhighlight> → {{Date}}
* <syntaxhighlight lang="wikitext" inline>{{Date|2023-05-16}}</syntaxhighlight> → {{Date|2023-05-16}}
* <syntaxhighlight lang="wikitext" inline>{{Date||RFC}}</syntaxhighlight> → {{Date||RFC}}
* <syntaxhighlight lang="wikitext" inline>{{Date|2008 5 aug}}</syntaxhighlight> → {{Date|2008 5 aug}}
* <syntaxhighlight lang="wikitext" inline>{{Date|2012 9 apr|RFC}}</syntaxhighlight> → {{Date|2012 9 apr|RFC}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
851c165169cef35e22cd434843b54d8bbe4ad696
Template:Time
10
866
1373
2025-08-25T21:34:21Z
Sharparam
284703
Created page with "{{#vardefine:time|{{{1|14:00}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | hm = H:i | hmo = H:iP | hms = H:i:s | hmso = H:i:sP | #default = {{{2|H:i}}} }} }}<!-- --><time datetime="{{#time:H:i:sP|{{#var:time}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:time}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{#vardefine:time|{{{1|14:00}}}}}<!--
-->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}}
| hm = H:i
| hmo = H:iP
| hms = H:i:s
| hmso = H:i:sP
| #default = {{{2|H:i}}}
}}
}}<!--
--><time datetime="{{#time:H:i:sP|{{#var:time}}}}"><!--
-->{{#time:{{#var:format}}|{{#var:time}}}}<!--
--></time><!--
--><noinclude>{{Documentation}}</noinclude>
29da45daa0ccdc5ffb03e1c4f95a16956eb3ef41
1376
1373
2025-08-25T21:56:17Z
Sharparam
284703
Fix default value
wikitext
text/x-wiki
{{#vardefine:time|{{{1|now}}}}}<!--
-->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}}
| hm = H:i
| hmo = H:iP
| hms = H:i:s
| hmso = H:i:sP
| #default = {{{2|H:i}}}
}}
}}<!--
--><time datetime="{{#time:H:i:sP|{{#var:time}}}}"><!--
-->{{#time:{{#var:format}}|{{#var:time}}}}<!--
--></time><!--
--><noinclude>{{Documentation}}</noinclude>
c1fe1669143f52a06573a8f71b02446b5398347e
Template:Time/doc
10
867
1374
2025-08-25T21:53:19Z
Sharparam
284703
Created page with "Displays properly formatted time (no date). The output is wrapped in a {{tag|time}} tag so that the <code>datetime</code> attribute contains properly formatted time with offset. Note that this works differently from the Wikipedia [[wikipedia:Template:Time|]], as the Wikipedia version displays date {{em|and}} time. For date and time combined, use the {{tl|Datetime}} template. For now, this template requires well-formatted input. In the future, it might become more leni..."
wikitext
text/x-wiki
Displays properly formatted time (no date). The output is wrapped in a {{tag|time}} tag so that the <code>datetime</code> attribute contains properly formatted time with offset.
Note that this works differently from the Wikipedia [[wikipedia:Template:Time|Template:Time]], as the Wikipedia version displays date {{em|and}} time.
For date and time combined, use the {{tl|Datetime}} template.
For now, this template requires well-formatted input. In the future, it might become more lenient to accept other input forms and convert it to well-formed output. The input only supports UTC time for now.
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Time}}</syntaxhighlight> → {{Time}}
* <syntaxhighlight lang="wikitext" inline>{{Time|14:00}}</syntaxhighlight> → {{Time|14:00}}
* <syntaxhighlight lang="wikitext" inline>{{Time|13:37|HMS}}</syntaxhighlight> → {{Time|13:37|HMS}}
* <syntaxhighlight lang="wikitext" inline>{{Time|12:00|HMO}}</syntaxhighlight> → {{Time|12:00|HMO}}
* <syntaxhighlight lang="wikitext" inline>{{Time|09:32:10|HMSO}}</syntaxhighlight> → {{Time|09:32:10|HMSO}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
72e4c662859a7ab7b64ff054e794b3a1f7bffd02
1375
1374
2025-08-25T21:55:45Z
Sharparam
284703
Add TemplateData
wikitext
text/x-wiki
Displays properly formatted time (no date). The output is wrapped in a {{tag|time}} tag so that the <code>datetime</code> attribute contains properly formatted time with offset.
Note that this works differently from the Wikipedia [[wikipedia:Template:Time|Template:Time]], as the Wikipedia version displays date {{em|and}} time.
For date and time combined, use the {{tl|Datetime}} template.
For now, this template requires well-formatted input. In the future, it might become more lenient to accept other input forms and convert it to well-formed output. The input only supports UTC time for now.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Time",
"description": "The time to format.",
"example": "13:37",
"type": "line",
"default": "now",
"suggested": true
},
"2": {
"label": "Format",
"description": "How to format the displayed time. An \"O\" at the end will show the UTC offset (currently always 0).",
"example": "HMS",
"type": "line",
"suggestedvalues": [
"HMS",
"HMSO",
"HM",
"HMO"
],
"default": "HM"
}
},
"description": "Displays formatted time.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Time}}</syntaxhighlight> → {{Time}}
* <syntaxhighlight lang="wikitext" inline>{{Time|14:00}}</syntaxhighlight> → {{Time|14:00}}
* <syntaxhighlight lang="wikitext" inline>{{Time|13:37|HMS}}</syntaxhighlight> → {{Time|13:37|HMS}}
* <syntaxhighlight lang="wikitext" inline>{{Time|12:00|HMO}}</syntaxhighlight> → {{Time|12:00|HMO}}
* <syntaxhighlight lang="wikitext" inline>{{Time|09:32:10|HMSO}}</syntaxhighlight> → {{Time|09:32:10|HMSO}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
69b056ff8cd2593206dcaad106fb0de3821c556c
Template:Datetime
10
868
1377
2025-08-27T18:14:06Z
Sharparam
284703
Created page with "{{#vardefine:dto|{{{1|now}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | iso = Y-m-d H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+00:00}} | rfc | #default = {{{2|D, j M Y H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+0000}}}}} }}}}<!-- --><time datetime="{{#time:c|{{#var:dto}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:dto}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{#vardefine:dto|{{{1|now}}}}}<!--
-->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}}
| iso = Y-m-d H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+00:00}}
| rfc
| #default = {{{2|D, j M Y H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+0000}}}}}
}}}}<!--
--><time datetime="{{#time:c|{{#var:dto}}}}"><!--
-->{{#time:{{#var:format}}|{{#var:dto}}}}<!--
--></time><!--
--><noinclude>{{Documentation}}</noinclude>
ee01e3f343e8a1b1df09400b4cf410beaf9afc11
1379
1377
2025-08-27T18:39:25Z
Sharparam
284703
Improve options
wikitext
text/x-wiki
{{#vardefine:dto|{{{1|now}}}}}<!--
-->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}}
| iso = Y-m-d H:i{{Yesno|{{{seconds|}}}|yes=\:s}}" UTC"
| rfc
| #default = {{Yesno|{{{weekday|yes}}}|yes=D," "}}j M Y H:i{{Yesno|{{{seconds|}}}|yes=\:s}}" UTC"
}}}}<!--
--><time datetime="{{#time:c|{{#var:dto}}}}"><!--
-->{{#time:{{#var:format}}|{{#var:dto}}}}<!--
--></time><!--
--><noinclude>{{Documentation}}</noinclude>
57bb4bc267f7c3a6089e627dffb9cefed991c706
Template:Datetime/doc
10
869
1378
2025-08-27T18:26:26Z
Sharparam
284703
Created page with "Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight. Output is always in UTC (for now), but input can be any offset as long as it is specified. Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable..."
wikitext
text/x-wiki
Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight.
Output is always in UTC (for now), but input can be any offset as long as it is specified.
Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable in places like infoboxes or table data since it is more compact.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Datetime",
"description": "The date and time to format.",
"example": "2025-08-27 13:37",
"type": "date",
"default": "now",
"suggested": true
},
"2": {
"label": "Format",
"description": "How to format the date.",
"example": "rfc",
"type": "line",
"suggestedvalues": [
"iso",
"rfc"
],
"default": "rfc"
},
"seconds": {
"label": "Seconds",
"description": "Whether to include seconds in formatted display.",
"example": "yes",
"type": "boolean",
"default": "no"
}
},
"description": "Formats a date with time component.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Datetime}}</syntaxhighlight> → {{Datetime}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12}}</syntaxhighlight> → {{Datetime|2023-07-12}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2024-10-05 13:37}}</syntaxhighlight> → {{Datetime|2024-10-05 13:37}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2020-12-12 16:20+01:00}}</syntaxhighlight> → {{Datetime|2020-12-12 16:20+01:00}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2005-03-28 05:48:33|seconds=yes}}</syntaxhighlight> → {{Datetime|2005-03-28 05:48:33|seconds=yes}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||iso}}</syntaxhighlight> → {{Datetime||iso}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||rfc}}</syntaxhighlight> → {{Datetime||rfc}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
29706c7760147a2125de6dfeaaaea7d5dc53e05e
1380
1378
2025-08-27T18:41:35Z
Sharparam
284703
Document weekday parameter and add more examples
wikitext
text/x-wiki
Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight.
Output is always in UTC (for now), but input can be any offset as long as it is specified.
Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable in places like infoboxes or table data since it is more compact.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Datetime",
"description": "The date and time to format.",
"example": "2025-08-27 13:37",
"type": "date",
"default": "now",
"suggested": true
},
"2": {
"label": "Format",
"description": "How to format the date.",
"example": "rfc",
"type": "line",
"suggestedvalues": [
"iso",
"rfc"
],
"default": "rfc"
},
"seconds": {
"label": "Seconds",
"description": "Whether to include seconds in formatted display.",
"example": "yes",
"type": "boolean",
"default": "no"
},
"weekday": {
"label": "Weekday (RFC)",
"description": "Show weekday when using RFC format.",
"example": "no",
"type": "boolean",
"default": "yes"
}
},
"description": "Formats a date with time component.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Datetime}}</syntaxhighlight> → {{Datetime}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12}}</syntaxhighlight> → {{Datetime|2023-07-12}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2024-10-05 13:37}}</syntaxhighlight> → {{Datetime|2024-10-05 13:37}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2020-12-12 16:20+01:00}}</syntaxhighlight> → {{Datetime|2020-12-12 16:20+01:00}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2005-03-28 05:48:33|seconds=yes}}</syntaxhighlight> → {{Datetime|2005-03-28 05:48:33|seconds=yes}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12|weekday=no}}</syntaxhighlight> → {{Datetime|2023-07-12|weekday=no}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||iso}}</syntaxhighlight> → {{Datetime||iso}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||iso|seconds=yes}}</syntaxhighlight> → {{Datetime||iso}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||rfc}}</syntaxhighlight> → {{Datetime||rfc}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
7e4c510ec7e75db86e673727c7d89720d1b2c47c
1381
1380
2025-08-27T18:43:36Z
Sharparam
284703
Fix missing parameter in rendered example
wikitext
text/x-wiki
Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight.
Output is always in UTC (for now), but input can be any offset as long as it is specified.
Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable in places like infoboxes or table data since it is more compact.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Datetime",
"description": "The date and time to format.",
"example": "2025-08-27 13:37",
"type": "date",
"default": "now",
"suggested": true
},
"2": {
"label": "Format",
"description": "How to format the date.",
"example": "rfc",
"type": "line",
"suggestedvalues": [
"iso",
"rfc"
],
"default": "rfc"
},
"seconds": {
"label": "Seconds",
"description": "Whether to include seconds in formatted display.",
"example": "yes",
"type": "boolean",
"default": "no"
},
"weekday": {
"label": "Weekday (RFC)",
"description": "Show weekday when using RFC format.",
"example": "no",
"type": "boolean",
"default": "yes"
}
},
"description": "Formats a date with time component.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Datetime}}</syntaxhighlight> → {{Datetime}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12}}</syntaxhighlight> → {{Datetime|2023-07-12}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2024-10-05 13:37}}</syntaxhighlight> → {{Datetime|2024-10-05 13:37}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2020-12-12 16:20+01:00}}</syntaxhighlight> → {{Datetime|2020-12-12 16:20+01:00}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2005-03-28 05:48:33|seconds=yes}}</syntaxhighlight> → {{Datetime|2005-03-28 05:48:33|seconds=yes}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12|weekday=no}}</syntaxhighlight> → {{Datetime|2023-07-12|weekday=no}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||iso}}</syntaxhighlight> → {{Datetime||iso}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||iso|seconds=yes}}</syntaxhighlight> → {{Datetime||iso|seconds=yes}}
* <syntaxhighlight lang="wikitext" inline>{{Datetime||rfc}}</syntaxhighlight> → {{Datetime||rfc}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
2b120d6e34b188f18aff214200d2f11165f5ccd6
Meta:Manual of Style
4
845
1382
1348
2025-08-27T18:52:45Z
Sharparam
284703
/* Formatting */ Add guideline for dates and time
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified.
== Layout ==
Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]).
This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>.
=== Location and acquisition ===
These are important sections and often what readers are interested in when looking up an item for example.
As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present).
=== Bugs ===
The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article.
=== Trivia ===
The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]].
=== Other sections ===
Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs.
Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section.
== Formatting ==
=== Emphasis ===
Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags).
When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient).
For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag.
=== Date and time ===
In order to have dates and time be consistent across the wiki, there are a few templates to help:
;{{tl|Date}}
:For just a date with no associated time.
;{{tl|Time}}
:For just a time with no associated date.
;{{tl|Datetime}}
:When both date and time are needed.
The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}").
In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones.
The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics.
== Infoboxes ==
Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page.
The following types of articles must have an infobox:
* NPCs ({{tl|Infobox/NPC}})
* Enemies ({{tl|Infobox/Enemy}})
* Bosses ({{tl|Infobox/Boss}})
* Items ({{tl|Infobox/Item}})
** Weapons ({{tl|Infobox/Weapon}})
** Armor ({{tl|Infobox/Armor}})
** Capes ({{tl|Infobox/Cape}})
** Shields ({{tl|Infobox/Shield}})
** Armor set ({{tl|Infobox/Armor set}})
** Amulets ({{tl|Infobox/Amulet}})
* Abilities ({{tl|Infobox/Ability}})
* Passives ({{tl|Infobox/Passive}})
There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates.
The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes.
(Though you can use it to spice up your user page if you want, just don't use it in mainspace content.)
When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage.
Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.)
Infoboxes should be put at the top of an article, before the lead text.
== Navboxes ==
Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons.
See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes.
Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader.
Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>.
[[Category:Manual of Style]]
5a1e69ff3f11b3b0e7789858c6c080b406db474c
1383
1382
2025-08-27T18:59:19Z
Sharparam
284703
Add section on language
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified.
== Language ==
Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that.
Above all, strive to maintain proper grammar and punctuation.
== Layout ==
Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]).
This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>.
=== Location and acquisition ===
These are important sections and often what readers are interested in when looking up an item for example.
As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present).
=== Bugs ===
The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article.
=== Trivia ===
The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]].
=== Other sections ===
Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs.
Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section.
== Formatting ==
=== Emphasis ===
Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags).
When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient).
For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag.
=== Date and time ===
In order to have dates and time be consistent across the wiki, there are a few templates to help:
;{{tl|Date}}
:For just a date with no associated time.
;{{tl|Time}}
:For just a time with no associated date.
;{{tl|Datetime}}
:When both date and time are needed.
The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}").
In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones.
The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics.
== Infoboxes ==
Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page.
The following types of articles must have an infobox:
* NPCs ({{tl|Infobox/NPC}})
* Enemies ({{tl|Infobox/Enemy}})
* Bosses ({{tl|Infobox/Boss}})
* Items ({{tl|Infobox/Item}})
** Weapons ({{tl|Infobox/Weapon}})
** Armor ({{tl|Infobox/Armor}})
** Capes ({{tl|Infobox/Cape}})
** Shields ({{tl|Infobox/Shield}})
** Armor set ({{tl|Infobox/Armor set}})
** Amulets ({{tl|Infobox/Amulet}})
* Abilities ({{tl|Infobox/Ability}})
* Passives ({{tl|Infobox/Passive}})
There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates.
The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes.
(Though you can use it to spice up your user page if you want, just don't use it in mainspace content.)
When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage.
Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.)
Infoboxes should be put at the top of an article, before the lead text.
== Navboxes ==
Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons.
See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes.
Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader.
Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>.
[[Category:Manual of Style]]
f5b3fdee2195496df1bd7d013c183c1c81ed7318
1384
1383
2025-08-27T19:08:06Z
Sharparam
284703
/* Date and time */ Add more details on date/time formatting
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified.
== Language ==
Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that.
Above all, strive to maintain proper grammar and punctuation.
== Layout ==
Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]).
This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>.
=== Location and acquisition ===
These are important sections and often what readers are interested in when looking up an item for example.
As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present).
=== Bugs ===
The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article.
=== Trivia ===
The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]].
=== Other sections ===
Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs.
Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section.
== Formatting ==
=== Emphasis ===
Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags).
When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient).
For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag.
=== Date and time ===
In order to have dates and time be consistent across the wiki, use either [[wikipedia:ISO 8601|ISO 8601]] or [[wikipedia:RFC 3339|RFC 3339]] to format them. For readability, it's not necessary to display seconds or the weekday, and offset can be specified with letters instead of numbers (like "UTC" instead of "+00:00").
There are a few templates to help:
;{{tl|Date}}
:For just a date with no associated time.
;{{tl|Time}}
:For just a time with no associated date.
;{{tl|Datetime}}
:When both date and time are needed.
The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}").
In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones.
The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics.
== Infoboxes ==
Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page.
The following types of articles must have an infobox:
* NPCs ({{tl|Infobox/NPC}})
* Enemies ({{tl|Infobox/Enemy}})
* Bosses ({{tl|Infobox/Boss}})
* Items ({{tl|Infobox/Item}})
** Weapons ({{tl|Infobox/Weapon}})
** Armor ({{tl|Infobox/Armor}})
** Capes ({{tl|Infobox/Cape}})
** Shields ({{tl|Infobox/Shield}})
** Armor set ({{tl|Infobox/Armor set}})
** Amulets ({{tl|Infobox/Amulet}})
* Abilities ({{tl|Infobox/Ability}})
* Passives ({{tl|Infobox/Passive}})
There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates.
The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes.
(Though you can use it to spice up your user page if you want, just don't use it in mainspace content.)
When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage.
Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.)
Infoboxes should be put at the top of an article, before the lead text.
== Navboxes ==
Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons.
See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes.
Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader.
Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>.
[[Category:Manual of Style]]
fc4bb4566e1facec577a3150b50ec49fa1bbbfc7
1386
1384
2025-08-27T21:28:49Z
Sharparam
284703
/* Infoboxes */ Put bosses under enemies
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified.
== Language ==
Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that.
Above all, strive to maintain proper grammar and punctuation.
== Layout ==
Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]).
This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>.
=== Location and acquisition ===
These are important sections and often what readers are interested in when looking up an item for example.
As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present).
=== Bugs ===
The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article.
=== Trivia ===
The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]].
=== Other sections ===
Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs.
Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section.
== Formatting ==
=== Emphasis ===
Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags).
When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient).
For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag.
=== Date and time ===
In order to have dates and time be consistent across the wiki, use either [[wikipedia:ISO 8601|ISO 8601]] or [[wikipedia:RFC 3339|RFC 3339]] to format them. For readability, it's not necessary to display seconds or the weekday, and offset can be specified with letters instead of numbers (like "UTC" instead of "+00:00").
There are a few templates to help:
;{{tl|Date}}
:For just a date with no associated time.
;{{tl|Time}}
:For just a time with no associated date.
;{{tl|Datetime}}
:When both date and time are needed.
The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}").
In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones.
The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics.
== Infoboxes ==
Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page.
The following types of articles must have an infobox:
* NPCs ({{tl|Infobox/NPC}})
* Enemies ({{tl|Infobox/Enemy}})
** Bosses ({{tl|Infobox/Boss}})
* Items ({{tl|Infobox/Item}})
** Weapons ({{tl|Infobox/Weapon}})
** Armor ({{tl|Infobox/Armor}})
** Capes ({{tl|Infobox/Cape}})
** Shields ({{tl|Infobox/Shield}})
** Armor set ({{tl|Infobox/Armor set}})
** Amulets ({{tl|Infobox/Amulet}})
* Abilities ({{tl|Infobox/Ability}})
* Passives ({{tl|Infobox/Passive}})
There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates.
The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes.
(Though you can use it to spice up your user page if you want, just don't use it in mainspace content.)
When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage.
Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.)
Infoboxes should be put at the top of an article, before the lead text.
== Navboxes ==
Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons.
See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes.
Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader.
Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>.
[[Category:Manual of Style]]
c96fc7923c8afa02b611d0b8d734b16df5e61dab
1387
1386
2025-08-27T21:49:13Z
Sharparam
284703
Add section on references and notes
wikitext
text/x-wiki
This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki.
Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia].
This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified.
== Language ==
Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that.
Above all, strive to maintain proper grammar and punctuation.
== Layout ==
Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]).
This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>.
=== Location and acquisition ===
These are important sections and often what readers are interested in when looking up an item for example.
As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present).
=== Bugs ===
The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article.
=== Trivia ===
The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]].
=== Other sections ===
Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs.
Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section.
== Formatting ==
=== Emphasis ===
Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags).
When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient).
For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag.
=== Date and time ===
In order to have dates and time be consistent across the wiki, use either [[wikipedia:ISO 8601|ISO 8601]] or [[wikipedia:RFC 3339|RFC 3339]] to format them. For readability, it's not necessary to display seconds or the weekday, and offset can be specified with letters instead of numbers (like "UTC" instead of "+00:00").
There are a few templates to help:
;{{tl|Date}}
:For just a date with no associated time.
;{{tl|Time}}
:For just a time with no associated date.
;{{tl|Datetime}}
:When both date and time are needed.
The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}").
In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones.
The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics.
== Infoboxes ==
Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page.
The following types of articles must have an infobox:
* NPCs ({{tl|Infobox/NPC}})
* Enemies ({{tl|Infobox/Enemy}})
** Bosses ({{tl|Infobox/Boss}})
* Items ({{tl|Infobox/Item}})
** Weapons ({{tl|Infobox/Weapon}})
** Armor ({{tl|Infobox/Armor}})
** Capes ({{tl|Infobox/Cape}})
** Shields ({{tl|Infobox/Shield}})
** Armor set ({{tl|Infobox/Armor set}})
** Amulets ({{tl|Infobox/Amulet}})
* Abilities ({{tl|Infobox/Ability}})
* Passives ({{tl|Infobox/Passive}})
There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates.
The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes.
(Though you can use it to spice up your user page if you want, just don't use it in mainspace content.)
When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage.
Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.)
Infoboxes should be put at the top of an article, before the lead text.
== Navboxes ==
Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons.
See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes.
Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader.
Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>.
== References and notes ==
For references, use the {{tl|Ref}}{{note|Works more like the Wikipedia [[wikipedia:Template:Refn|Template:Refn]] template rather than [[wikipedia:Template:Ref|Template:Ref]]}} template or {{tag|ref}} tag. For notes it might be preferable to use the {{tl|Note}}{{note|Works more like the Wikipedia [[wikipedia:Template:Efn|Template:Efn]] template rather than [[wikipedia:Template:Note|Template:Note]]}} template to ensure the proper lettering is used.
<syntaxhighlight lang="wikitext">
Sometimes text might need notes, things that aren't important enough to add in the text but still interesting.{{note|Usually at the end of a sentence but could also go directly after a word}}
</syntaxhighlight>
If you've used references and/or notes in an article, make sure to put the {{tl|Reflist}} or {{tl|Notelist}} under an appropriate section at the end of the article.
<syntaxhighlight lang="wikitext">
== References ==
{{Reflist}}
</syntaxhighlight>
<syntaxhighlight lang="wikitext">
== Notes ==
{{Notelist}}
</syntaxhighlight>
== Notes ==
{{Notelist}}
[[Category:Manual of Style]]
765a51a9d69cd9a48d761ba41aa9e357306fa18a
Template:Link icon
10
93
1385
115
2025-08-27T21:26:17Z
Sharparam
284703
Make template more flexible
wikitext
text/x-wiki
<includeonly>{{#vardefine:target|{{{1|}}}<!-- end vd -->}}<!--
-->{{#vardefine:display|{{#if:{{{2|}}}|{{{2}}}|{{{1}}}<!-- end if -->}}<!-- end vd -->}}<!--
-->{{#vardefine:type|{{{type|Icon}}}}}<!--
-->{{#vardefine:file|{{#or:{{{file|}}}|{{{icon|}}}|{{{i|}}}|{{#var:target}}_({{#var:type}}).png}}}}<!--
-->{{#vardefine:iconSize|1.2em}}<!--
-->{{#vardefine:lineHeight|1lh}}<!--
-->{{#vardefine:fileExists|{{filepath:{{#var:file}}}}}}<!--
-->{{#ifeq: {{{2|}}} | notext <!-- start if notext
-->|<span class="link-icon notext" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start notext icon element
-->{{#if: {{#var:fileExists}} <!-- start icon if
-->| <span class="regular">[[File:{{#var:file}}|link={{#var:target}}|alt=]]</span><!-- end regular icon
-->| <span class="fallback">[[File:{{#var:file}}|?]]</span><!-- end fallback icon (?)
-->}}<!-- end icon if
--></span><!-- end notext icon
-->|<span class="link-icon" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start icon + text element
-->{{#if: {{#var:fileExists}} <!-- start icon if
-->| <span class="regular">[[File:{{#var:file}}|link={{#var:target}}|alt=]]</span><!-- end regular icon
-->| <span class="fallback">[[File:{{#var:file}}|?]]</span><!-- end fallback icon (?)
-->}} <!-- end icon if
--><span class="display-text">[[{{#var:target}}|{{#var:display}}]]</span><!-- end display text
--></span> <!-- end icon + text element
-->}}<!-- end if notext
--></includeonly><noinclude>{{Documentation}}[[Category:Formatting templates]]</noinclude>
230ff98716418fda1b91a4bef631fd4d3b59e9d4
Template:Reflist
10
613
1388
964
2025-08-27T21:52:48Z
Sharparam
284703
Add "From Wikipedia" hatnote
wikitext
text/x-wiki
<noinclude>{{From Wikipedia|Template:Reflist}}</noinclude>
<templatestyles src="Reflist/styles.css" /><div class="reflist<!--
-->{{#if:{{{1|}}}{{{colwidth|}}}| reflist-columns references-column-width}} {{#switch:{{{liststyle|{{{group|}}}}}}
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = reflist-{{{liststyle|{{{group}}}}}}
}}" <!-- End class, start style -->{{#if:{{{1|}}}
| {{#iferror:{{#ifexpr: {{{1|1}}} > 1 }} |style="column-width: {{{1}}};"}}
| {{#if: {{{colwidth|}}}|style="column-width: {{{colwidth}}};"}}
}}>
{{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}</div>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}<noinclude>
{{Documentation}}</noinclude>
cc488133007cdd7b115041428db504520c79b5fa
Template:Reflist/doc
10
870
1389
2025-08-27T21:53:30Z
Sharparam
284703
Created page with "== See also == * {{tl|Notelist}} <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== See also ==
* {{tl|Notelist}}
<noinclude>[[Category:Template documentation]]</noinclude>
817edb987852c4e815df8f37224ac7a4a3803a65
Template:Notelist
10
612
1390
962
2025-08-27T21:54:06Z
Sharparam
284703
Add "From Wikipedia" hatnote
wikitext
text/x-wiki
<noinclude>{{From Wikipedia|Template:Notelist}}</noinclude>
{{safesubst<noinclude />:Reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst<noinclude />:#switch:{{{group|}}}
| note
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group|}}}
| #default = lower-alpha
}}}}{{safesubst<noinclude />:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | notes | refs }}<noinclude>
{{Documentation}}</noinclude>
0af30996296b737c6ca255e4040297f50dd6946f
Template:Notelist/doc
10
871
1391
2025-08-27T21:54:30Z
Sharparam
284703
Created page with "== See also == * {{tl|Reflist}} <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
== See also ==
* {{tl|Reflist}}
<noinclude>[[Category:Template documentation]]</noinclude>
d3a0215a15adc85cdb42fbded8ec28b067119585
Plagued
0
872
1392
2025-09-05T21:13:01Z
Sharparam
284703
Created page with "{{Infobox/Enemy | image = Plagued (enemy).png }} '''Plagued''' is an enemy that appears in the [[Monastery]] location in {{BFF}}. {{Navbox/Enemies}}"
wikitext
text/x-wiki
{{Infobox/Enemy
| image = Plagued (enemy).png
}}
'''Plagued''' is an enemy that appears in the [[Monastery]] location in {{BFF}}.
{{Navbox/Enemies}}
4a165eb28c85124eb2c8fef58807ad6ddc23d3d5
File:Plagued (enemy).png
6
873
1393
2025-09-05T21:13:28Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
File:Konrad the Traitor.png
6
874
1394
2025-09-05T21:13:57Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Mrgud
0
875
1395
2025-09-05T21:37:19Z
Sharparam
284703
Created page with "{{Infobox/Enemy | image = Mrgud (enemy).png }} '''Mrgud''' is an enemy in {{BFF}}. {{Navbox/Enemies}}"
wikitext
text/x-wiki
{{Infobox/Enemy
| image = Mrgud (enemy).png
}}
'''Mrgud''' is an enemy in {{BFF}}.
{{Navbox/Enemies}}
643454a9c803b899b1b971828c544b8f7690aac6
File:Mrgud (enemy).png
6
876
1396
2025-09-05T21:37:32Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Mysterious Woman
0
877
1397
2025-09-05T21:54:44Z
Sharparam
284703
Created page with "{{Infobox/NPC | image = Mysterious Woman (NPC).png }} '''{{PAGENAME}}''' is an [[NPCs|NPC]] in {{BFF}}. == Location == Located in [[Blok 6147]]. == Quotes == === First encounter === {{Quote |I know what you are… But – how can there be anything interesting about a being that never transforms? Hm hm hm… So… What do you think of the city? Quite a few nutcases eh? Stealing always has deep roots among the poor. The children steal, and fathers and mothers too!..."
wikitext
text/x-wiki
{{Infobox/NPC
| image = Mysterious Woman (NPC).png
}}
'''{{PAGENAME}}''' is an [[NPCs|NPC]] in {{BFF}}.
== Location ==
Located in [[Blok 6147]].
== Quotes ==
=== First encounter ===
{{Quote
|I know what you are… But – how can there be anything interesting about a being that never transforms? Hm hm hm…
So… What do you think of the city? Quite a few nutcases eh?
Stealing always has deep roots among the poor. The children steal, and fathers and mothers too! Back when I was on duty in the rough quarters, I would often be robbed of whatever I happened to be carrying.
My cloak, my gloves, even my tools… what do they even do with such things? I was performing a surgery on one of the afflicted once, with his family standing there.
I'm about to give him a sip of the [[Asylum Brew|asylum brew]] to ease the pain, and when I turn back – it's gone! The little ones, smiling at me with their tiny teeth… He he he…
Agh… Probably addicted to it… Kleptomania. Another condition that needs curing…
Say – that vessel of yours? Now that's something I'd tinker with… How much would you sell it for?
They say there's no genius without a touch of madness… What about those where madness is in abundance? Ha ha ha!
Ahhh… *hums happily*
}}
=== After first encounter ===
{{Quote|Ahhh… *hums happily*}}
{{Navbox/NPCs}}
7f7e634bf9fdb130dcd499953d2907f97f7a18d9
1399
1397
2025-09-05T22:05:36Z
Sharparam
284703
/* Location */ Add coordinates
wikitext
text/x-wiki
{{Infobox/NPC
| image = Mysterious Woman (NPC).png
}}
'''{{PAGENAME}}''' is an [[NPCs|NPC]] in {{BFF}}.
== Location ==
{{coords|-16812.77|-10253.53|2049.22}}
Located in [[Blok 6147]].
== Quotes ==
=== First encounter ===
{{Quote
|I know what you are… But – how can there be anything interesting about a being that never transforms? Hm hm hm…
So… What do you think of the city? Quite a few nutcases eh?
Stealing always has deep roots among the poor. The children steal, and fathers and mothers too! Back when I was on duty in the rough quarters, I would often be robbed of whatever I happened to be carrying.
My cloak, my gloves, even my tools… what do they even do with such things? I was performing a surgery on one of the afflicted once, with his family standing there.
I'm about to give him a sip of the [[Asylum Brew|asylum brew]] to ease the pain, and when I turn back – it's gone! The little ones, smiling at me with their tiny teeth… He he he…
Agh… Probably addicted to it… Kleptomania. Another condition that needs curing…
Say – that vessel of yours? Now that's something I'd tinker with… How much would you sell it for?
They say there's no genius without a touch of madness… What about those where madness is in abundance? Ha ha ha!
Ahhh… *hums happily*
}}
=== After first encounter ===
{{Quote|Ahhh… *hums happily*}}
{{Navbox/NPCs}}
d3e154aa9bceae43c67269d0dabf71eadba4d303
File:Mysterious Woman (NPC).png
6
878
1398
2025-09-05T21:56:55Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Royal Division Captain Yulia
0
404
1400
570
2025-09-05T22:12:52Z
Sharparam
284703
Add quotes
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}}
{{Infobox/NPC
| image = Royal Division Captain Yulia.png
}}
{{stub}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Quotes ==
=== First encounter ===
{{Quote
|This crusade is not only about the city… [[Yaroslav]] is to be apprehended. As long as his example can inspire others, there can be no peace.
I hope you don't judge what you see. We both know justice exists only between those equal in strength. For as it stands, the strong do what they wish, and the weak suffer what they must.
I will confide in you a recent detail. There is a traitor within our higher ranks – I can tolerate many things… but betrayal…
I'll speak frankly with you… This population is lost. The corruption spreads from the [[anomaly]], and even our soldiers are affected… As for the citizens, they were strange to begin with… but many are now completely off the handle. So… I ask of you kindly… Do your part, and I'll see to it that we all return as victors.
This crusade has gone on for too long, yet… it seems as i we have only arrived here.
I miss the wind… The cold air, weaving its way around you as you take in the horizon.
To guide by authority, to graft tradition onto peace, to bestow mercy upon the conquered… to wage war until the proud kneel.
I do not merely rely on you – I trust in you. Don't let me down.
[[The Serdar]] occupation of the gate is only a part of the problem. We also have to deal with the corruption from beyond…
Farewell.
}}
=== After first encounter ===
{{Quote|Farewell.}}
{{Navbox/NPCs}}
90533fb05e4c12a2da999195cc5b65fabc8a25b7
1401
1400
2025-09-05T22:14:46Z
Sharparam
284703
Update file name
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}}
{{Infobox/NPC
| image = Royal Division Captain Yulia (NPC).png
}}
{{stub}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Quotes ==
=== First encounter ===
{{Quote
|This crusade is not only about the city… [[Yaroslav]] is to be apprehended. As long as his example can inspire others, there can be no peace.
I hope you don't judge what you see. We both know justice exists only between those equal in strength. For as it stands, the strong do what they wish, and the weak suffer what they must.
I will confide in you a recent detail. There is a traitor within our higher ranks – I can tolerate many things… but betrayal…
I'll speak frankly with you… This population is lost. The corruption spreads from the [[anomaly]], and even our soldiers are affected… As for the citizens, they were strange to begin with… but many are now completely off the handle. So… I ask of you kindly… Do your part, and I'll see to it that we all return as victors.
This crusade has gone on for too long, yet… it seems as i we have only arrived here.
I miss the wind… The cold air, weaving its way around you as you take in the horizon.
To guide by authority, to graft tradition onto peace, to bestow mercy upon the conquered… to wage war until the proud kneel.
I do not merely rely on you – I trust in you. Don't let me down.
[[The Serdar]] occupation of the gate is only a part of the problem. We also have to deal with the corruption from beyond…
Farewell.
}}
=== After first encounter ===
{{Quote|Farewell.}}
{{Navbox/NPCs}}
974fe267dcce99e38060a681e8b441903fe7fca0
File:Royal Division Captain Yulia (NPC).png
6
879
1402
2025-09-05T22:14:58Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Royal Division Captain Yulia
0
404
1403
1401
2025-09-05T22:16:42Z
Sharparam
284703
Add location
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}}
{{Infobox/NPC
| image = Royal Division Captain Yulia (NPC).png
}}
{{stub}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|1070.06|23609.71|3546.89}}
Located in [[Blok 6147]], in a tower surrounded by several [[Dreadguard (NPC)|dreadguards]] (non-hostile NPC variant).
== Quotes ==
=== First encounter ===
{{Quote
|This crusade is not only about the city… [[Yaroslav]] is to be apprehended. As long as his example can inspire others, there can be no peace.
I hope you don't judge what you see. We both know justice exists only between those equal in strength. For as it stands, the strong do what they wish, and the weak suffer what they must.
I will confide in you a recent detail. There is a traitor within our higher ranks – I can tolerate many things… but betrayal…
I'll speak frankly with you… This population is lost. The corruption spreads from the [[anomaly]], and even our soldiers are affected… As for the citizens, they were strange to begin with… but many are now completely off the handle. So… I ask of you kindly… Do your part, and I'll see to it that we all return as victors.
This crusade has gone on for too long, yet… it seems as i we have only arrived here.
I miss the wind… The cold air, weaving its way around you as you take in the horizon.
To guide by authority, to graft tradition onto peace, to bestow mercy upon the conquered… to wage war until the proud kneel.
I do not merely rely on you – I trust in you. Don't let me down.
[[The Serdar]] occupation of the gate is only a part of the problem. We also have to deal with the corruption from beyond…
Farewell.
}}
=== After first encounter ===
{{Quote|Farewell.}}
{{Navbox/NPCs}}
415add9447f36d855407d028a064f1cb7a9bc5b9
Module:Coordinates
828
296
1404
397
2025-09-05T22:18:30Z
Sharparam
284703
Fix tooltip formatting
Scribunto
text/plain
local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$"
local NS_TO_CATEGORISE = {
[0] = true, -- main
[6] = true, -- file
[14] = true -- category
}
local args_util = require('Module:ArgsUtil')
local p = {}
---@param val number
---@param label string
local function coordNode(val, label)
return mw.html.create('span')
:addClass(label)
:wikitext(p.formatCoord(val))
end
---@param val number
---@return string
function p.formatCoord(val)
local sign = val < 0 and '-' or ''
val = math.abs(val)
val = math.floor(val * 100) / 100
local str = tostring(val)
local int = string.match(str, "^%d+")
local dec = string.match(str, "%.(%d-)0*$") or ''
local int_len = #int
local dec_len = #dec
if int_len >= 3 then
return sign .. string.sub(int, 1, 4)
end
if dec_len == 0 then return sign .. int end
return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2))
end
function p.main(frame)
local args = args_util.merge()
return p._main(args)
end
function p._main(args)
local x = tonumber(args.x or args[1]) or 0
local y = tonumber(args.y or args[2]) or 0
local z = tonumber(args.z or args[3]) or 0
local xdec = string.sub(tostring(math.fmod(x, 1)), 3)
local ydec = string.sub(tostring(math.fmod(y, 1)), 3)
local zdec = string.sub(tostring(math.fmod(z, 1)), 3)
local inaccurate = #xdec ~= 2 or #ydec ~= 2 or #zdec ~= 2
local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z)
local elem = mw.html.create('span')
:css('border-bottom', '1px dotted')
:attr('data-x', x)
:attr('data-y', y)
:attr('data-z', z)
:attr('title', tooltip)
:addClass('coordinates')
:addClass('nowrap')
:node(coordNode(x, 'x'))
:wikitext('::')
:node(coordNode(y, 'y'))
:wikitext('::')
:node(coordNode(z, 'z'))
elem = tostring(elem)
local ns = mw.title.getCurrentTitle().namespace
if NS_TO_CATEGORISE[ns] then
if inaccurate then
elem = elem .. '[[Category:Pages with inaccurate coordinates]]'
end
elem = elem .. '[[Category:Pages with coordinates]]'
end
return elem
end
return p
ab0a90c4228892278acd05c8f2df9ebb54fd4375
1405
1404
2025-09-05T22:27:08Z
Sharparam
284703
Fix accuracy check
Scribunto
text/plain
local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$"
local NS_TO_CATEGORISE = {
[0] = true, -- main
[6] = true, -- file
[14] = true -- category
}
local CHECK_PATTERN = "^-?%d+%.%d%d$"
local args_util = require('Module:ArgsUtil')
local p = {}
---@param val number
---@param label string
local function coordNode(val, label)
return mw.html.create('span')
:addClass(label)
:wikitext(p.formatCoord(val))
end
---@param val number
---@return string
function p.formatCoord(val)
local sign = val < 0 and '-' or ''
val = math.abs(val)
val = math.floor(val * 100) / 100
local str = tostring(val)
local int = string.match(str, "^%d+")
local dec = string.match(str, "%.(%d-)0*$") or ''
local int_len = #int
local dec_len = #dec
if int_len >= 3 then
return sign .. string.sub(int, 1, 4)
end
if dec_len == 0 then return sign .. int end
return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2))
end
function p.main(frame)
local args = args_util.merge()
return p._main(args)
end
function p._main(args)
local x = args.x or args[1] or ""
local y = args.y or args[2] or ""
local z = args.z or args[3] or ""
local accurate_x = string.match(x, CHECK_PATTERN) ~= nil
local accurate_y = string.match(y, CHECK_PATTERN) ~= nil
local accurate_z = string.match(z, CHECK_PATTERN) ~= nil
local accurate = accurate_x or accurate_y or accurate_z
x = tonumber(z) or 0
y = tonumber(z) or 0
z = tonumber(z) or 0
local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z)
local elem = mw.html.create('span')
:css('border-bottom', '1px dotted')
:attr('data-x', x)
:attr('data-y', y)
:attr('data-z', z)
:attr('title', tooltip)
:addClass('coordinates')
:addClass('nowrap')
:node(coordNode(x, 'x'))
:wikitext('::')
:node(coordNode(y, 'y'))
:wikitext('::')
:node(coordNode(z, 'z'))
elem = tostring(elem)
local ns = mw.title.getCurrentTitle().namespace
if NS_TO_CATEGORISE[ns] then
if not accurate then
elem = elem .. '[[Category:Pages with inaccurate coordinates]]'
end
elem = elem .. '[[Category:Pages with coordinates]]'
end
return elem
end
return p
2ff934a8e25efa2dcfbbe7d4844d814eaf22c9c0
Homunculus
0
611
1406
975
2025-09-05T22:33:54Z
Sharparam
284703
/* List of homunculi */ Add rain district (sewers) location
wikitext
text/x-wiki
'''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use.
== Overview ==
The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]].
The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions).
== List of homunculi ==
{| class="wikitable"
! [[Locations|Location]] !! Description !! Coordinates
|-
| [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}}
|-
| [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}}
|-
| [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}}
|-
| [[Rain District#Sewers|Rain District (Sewers)]] || Located up the ladder after entering the area from [[Blok 6147]]. || {{coords|-42295.56|-401.90|5081.55}}
|-
| [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}}
|-
| [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}}
|-
| [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}}
|-
| [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}}
|-
| [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}}
|-
| [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}}
|-
| [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}}
|-
| rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}}
| Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}}
|-
| After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}}
|-
| After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}}
|}
== Notes ==
{{notelist|refs=
{{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}}
}}
== External links ==
* [[wikipedia:Homunculus|Homunculus on Wikipedia]]
fe28773901e0f42e513362bb666249532e046239
1407
1406
2025-09-05T22:56:22Z
Sharparam
284703
/* List of homunculi */ Add rain district (center) location
wikitext
text/x-wiki
'''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use.
== Overview ==
The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]].
The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions).
== List of homunculi ==
{| class="wikitable"
! [[Locations|Location]] !! Description !! Coordinates
|-
| [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}}
|-
| [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}}
|-
| [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}}
|-
| [[Rain District#Sewers|Rain District (Sewers)]] || Located up the ladder after entering the area from [[Blok 6147]]. || {{coords|-42295.56|-401.90|5081.55}}
|-
| [[Rain District#Center|Rain District (Center)]] || Located at the bottom of the circular area in the center of the rain district, guarded by a large enemy. || {{coords|-43908.60|-9246.53|4632.40}}
|-
| [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}}
|-
| [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}}
|-
| [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}}
|-
| [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}}
|-
| [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}}
|-
| [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}}
|-
| [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}}
|-
| rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}}
| Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}}
|-
| After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}}
|-
| After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}}
|}
== Notes ==
{{notelist|refs=
{{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}}
}}
== External links ==
* [[wikipedia:Homunculus|Homunculus on Wikipedia]]
2efb98edd57d3825546ee94ec694118ad28bd346
1408
1407
2025-09-05T22:59:13Z
Sharparam
284703
/* List of homunculi */ Fix coords for deluge
wikitext
text/x-wiki
'''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use.
== Overview ==
The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]].
The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions).
== List of homunculi ==
{| class="wikitable"
! [[Locations|Location]] !! Description !! Coordinates
|-
| [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}}
|-
| [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}}
|-
| [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}}
|-
| [[Rain District#Sewers|Rain District (Sewers)]] || Located up the ladder after entering the area from [[Blok 6147]]. || {{coords|-42295.56|-401.90|5081.55}}
|-
| [[Rain District#Center|Rain District (Center)]] || Located at the bottom of the circular area in the center of the rain district, guarded by a large enemy. || {{coords|-43908.60|-9246.53|4632.40}}
|-
| [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-31838.95|-7372.77|56246.61}}
|-
| [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}}
|-
| [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}}
|-
| [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}}
|-
| [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}}
|-
| [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}}
|-
| [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}}
|-
| [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}}
|-
| rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}}
| Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}}
|-
| After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}}
|-
| After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}}
|}
== Notes ==
{{notelist|refs=
{{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}}
}}
== External links ==
* [[wikipedia:Homunculus|Homunculus on Wikipedia]]
0e2758460591d215f96693c44a7b739690d877a4
Fisherman
0
541
1409
1360
2025-09-05T23:01:45Z
Sharparam
284703
Update file name
wikitext
text/x-wiki
{{Infobox/Enemy
| image = Fisherman (enemy).png
}}
The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location.
== Drops ==
* [[Diver's Lungs Concoction]]
* [[Fractal Fungus]]
* [[Gingko Leaves]]
* [[Lesser Anomalous Crystal]]
* [[Lesser Restorative Fluid]]
* [[Ring of Burning Desire]]
* [[Sludge]]
* [[Upgrade Splinter]]
{{Navbox/Enemies}}
[[Category:Enemies]]
340515047d434a0a2434986ea2eb1da64a489a07
File:Fisherman (enemy).png
6
880
1410
2025-09-05T23:01:59Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Template:Navbox/Enemies
10
538
1411
837
2025-09-06T00:08:51Z
Sharparam
284703
Update link to dreadguard
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Enemies
| title = [[Enemies]]
| list1 =
* [[Berserking Citizen]]
* [[Citizen]]
* [[Construction Golem]]
* [[Deranged]]
* [[Dreadguard (enemy)|Dreadguard]]
* [[Fisherman]]
* [[Lancer]]
* [[Mechanomad Technomancer]]
* [[Mechanomad Warrior]]
* [[Minotaur]]
* [[Mrgud]]
* [[Osteoclast]]
* [[Plagued]]
* [[Revenant]]
* [[Vermillion Knight]]
* [[Zealot]]
| group2 = [[Bosses]]
| list2 = {{Navbox/Bosses|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
b7758d62938e5072d921bfb6c881b9a69f5dc578
1412
1411
2025-09-06T08:48:37Z
Sharparam
284703
Add abomination
wikitext
text/x-wiki
{{Navbox
| template = Navbox/Enemies
| title = [[Enemies]]
| list1 =
* [[Abomination]]
* [[Berserking Citizen]]
* [[Citizen]]
* [[Construction Golem]]
* [[Deranged]]
* [[Dreadguard (enemy)|Dreadguard]]
* [[Fisherman]]
* [[Lancer]]
* [[Mechanomad Technomancer]]
* [[Mechanomad Warrior]]
* [[Minotaur]]
* [[Mrgud]]
* [[Osteoclast]]
* [[Plagued]]
* [[Revenant]]
* [[Vermillion Knight]]
* [[Zealot]]
| group2 = [[Bosses]]
| list2 = {{Navbox/Bosses|child}}
}}<noinclude>[[Category:Navigation templates]]</noinclude>
2111a990c62fc85b80024f26e04c5aafc8d21f85
Abomination
0
881
1413
2025-09-06T08:51:30Z
Sharparam
284703
Created page with "{{Pages that need coordinates}} {{Infobox/Enemy | image = Abomination (enemy).png }} '''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there. == Location == Located in [[Rain District#Central|Rain District (Central)]], in front of the [[Homunculus]]. {{Navbox/Enemies}}"
wikitext
text/x-wiki
{{Pages that need coordinates}}
{{Infobox/Enemy
| image = Abomination (enemy).png
}}
'''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there.
== Location ==
Located in [[Rain District#Central|Rain District (Central)]], in front of the [[Homunculus]].
{{Navbox/Enemies}}
eca98563a99742bf17d0499802df635df0c589db
1427
1413
2025-09-07T17:57:57Z
Sharparam
284703
Fix template call
wikitext
text/x-wiki
{{Needs coordinates}}
{{Infobox/Enemy
| image = Abomination (enemy).png
}}
'''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there.
== Location ==
Located in [[Rain District#Central|Rain District (Central)]], in front of the [[Homunculus]].
{{Navbox/Enemies}}
6c47197790f0aecd1d5b29e470be36243ed42d87
File:Abomination (enemy).png
6
882
1414
2025-09-06T08:51:43Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Template:Needs coordinates
10
883
1415
2025-09-07T17:28:19Z
Sharparam
284703
Created page with "<includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = One or more elements on this page needs [[coordinates]] added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit the page] to add them with the {{tl|Coordinates}} template. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages that need coordinates]]}}}}<!-- --></includeonly><!-- --><noinclude>{{Needs coordinates|nocat=ye..."
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = gold
| icon = Cleanup.svg
| message = One or more elements on this page needs [[coordinates]] added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit the page] to add them with the {{tl|Coordinates}} template.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages that need coordinates]]}}}}<!--
--></includeonly><!--
--><noinclude>{{Needs coordinates|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
b983beee1e33d2e1a5676378bfc7042a0a72b6a7
1418
1415
2025-09-07T17:33:27Z
Sharparam
284703
Add what parameter to control text
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = gold
| icon = Cleanup.svg
| message = {{{what|One or more elements on this page}}} needs [[coordinates]] added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit the page] to add them with the {{tl|Coordinates}} template.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages that need coordinates]]}}}}<!--
--></includeonly><!--
--><noinclude>{{Needs coordinates|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
cd5b93a986e9899ea43605ac650a5420850b98b6
MOS
0
884
1416
2025-09-07T17:29:14Z
Sharparam
284703
Redirected page to [[Meta:Manual of Style]]
wikitext
text/x-wiki
#REDIRECT [[Meta:Manual of Style]]
918040eed385668d250445cc55d1b1824e0ed37a
Category:Pages that need coordinates
14
699
1417
1067
2025-09-07T17:31:23Z
Sharparam
284703
Add note on using proper template for categorizing pages
wikitext
text/x-wiki
Pages that are missing coordinates to help players locate them.
Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate.
Coordinates can be specified by using the {{tl|Coordinates}} template.
Pages should be added to this category by using the {{tl|Needs coordinates}} template, rather than putting the category on the pages manually.
a8904508baed1e19bc4399a714110d838cf285a5
1420
1417
2025-09-07T17:34:48Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Pages that are missing coordinates to help players locate them.
Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate.
Coordinates can be specified by using the {{tl|Coordinates}} template.
Pages should be added to this category by using the {{tl|Needs coordinates}} template, rather than putting the category on the pages manually.
[[Category:Pages in need of improvement]]
111fe578f77b5257e45747743c25fb4cbe8d00b7
1421
1420
2025-09-07T17:38:00Z
Sharparam
284703
Change category
wikitext
text/x-wiki
Pages that are missing coordinates to help players locate them.
Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate.
Coordinates can be specified by using the {{tl|Coordinates}} template.
Pages should be added to this category by using the {{tl|Needs coordinates}} template, rather than putting the category on the pages manually.
[[Category:Wiki maintenance]]
061ef35ecfd26a1eab8d9a455ee38633cfe0d8be
Royal Division Captain Yulia & Vermillion Mirage
0
551
1419
863
2025-09-07T17:34:02Z
Sharparam
284703
Use [[Template:Needs coordinates]] instead of manual categorization
wikitext
text/x-wiki
{{Infobox/Boss
| image = Final boss.png
}}
'''{{PAGENAME}}''' is the final [[Bosses|boss]] in {{BFF}}.
== Overview ==
When starting the fight, only the [[Vermillion Mirage]] will be present, including showing only its name in the boss healthbar.
After the mirage takes a certain amount of damage, [[Royal Division Captain Yulia]] will join the fight, updating the name in the boss healthbar to include both of them.
Dying for any reason after Yulia joins the fight causes the player to gain 0.5% [[entropy]]. This is because the act of her joining applies a debuff to the player causing entropy gain on death.
Throughout the fight, they will take turns being the active enemy, with the other one falling back to take a more passive role and using various ranged abilities on the player.
Defeating the boss will immediately trigger the [[Endings|ending]] cutscene.
After getting back to the title screen, the save file can be loaded again which will put the player at the same homunculus, allowing for the boss to be fought again. This makes it the only boss in the game that can be fought multiple times without having to start a new game.
== Location ==
{{Needs coordinates|tiny=yes|what=This section}}
Found at the end of [[Vermillion Fields]]. At the final location of the "Temple" [[Homunculus]], head up the large stairs and the boss arena will be at the top.
{{Navbox/Bosses}}
3e5d852a53a95252f0e47f99dd3b7a828d0e577a
Bleak Faith: Forsaken Wiki/contribute
0
7
1422
1341
2025-09-07T17:41:19Z
Sharparam
284703
Add link to the maintenance category
wikitext
text/x-wiki
{{Main page box/start
| title = Contribute to the wiki
}}
{{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players.
; Adding content
:* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done.
:* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough.
:* [[Special:UserLogin/signup|Register]] to edit and track your contributions.
:* Read the [[Meta:Manual of Style|Manual of Style]] for guidance on how to edit the wiki.
:* Check the [[:Category:Wiki_maintenance|wiki maintenance category]] page to get an overview of things that need doing.
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
c6826e10822a498bd49ec1145e2951b16d55dbc3
1423
1422
2025-09-07T17:46:15Z
Sharparam
284703
Add more pointers on where to start contributing
wikitext
text/x-wiki
{{Main page box/start
| title = Contribute to the wiki
}}
{{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players.
; Adding content
:* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done.
:* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough.
:* [[Special:UserLogin/signup|Register]] to edit and track your contributions.
:* Read the [[Meta:Manual of Style|Manual of Style]] for guidance on how to edit the wiki.
:* Check the [[:Category:Wiki_maintenance|wiki maintenance category]] page to get an overview of things that need doing.
:** Particularly good starting points might be [[Special:WantedFiles|wanted files]] (or [[:Category:Pages with broken file links|pages with broken file links]]) and [[:Category:Pages that need coordinates|pages that need coordinates]].
:** [[:Category:Stubs|Stubs]] can also be a good starting point if you have enough experience to start a page mostly from scratch.
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
cfe43fa8415c0b60a53410c768631ef2c2b37c71
Template:Sfrac/styles.css
10
732
1424
1128
2025-09-07T17:56:44Z
Sharparam
284703
Remove PP template call
sanitized-css
text/css
.sfrac {
white-space: nowrap;
}
.sfrac.tion,
.sfrac .tion {
display: inline-block;
vertical-align: -0.5em;
font-size: 85%;
text-align: center;
}
.sfrac .num {
display: block;
line-height: 1em;
margin: 0.0em 0.1em;
border-bottom: 1px solid;
}
.sfrac .den {
display: block;
line-height: 1em;
margin: 0.1em 0.1em;
}
/* [[Template:Screen reader-only]] is canonical implementation onwiki */
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0); /* removed from CSS */
clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
/* white-space: nowrap; /* already have nowrap above */
}
a0e91db461b3672013e7ed2b0319f6b4d477b2dc
Template:Fraction/styles.css
10
728
1425
1120
2025-09-07T17:57:01Z
Sharparam
284703
Remove PP template call
sanitized-css
text/css
.frac {
white-space: nowrap;
}
.frac .num,
.frac .den {
font-size: 80%;
line-height: 0; /* we want this inline */
vertical-align: super;
}
.frac .den {
vertical-align: sub;
}
/* [[Template:Screen reader-only]] is canonical implementation onwiki */
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
/* white-space: nowrap; /* already have nowrap above */
}
d5811eb299db8c77a35b1dd2d75de323ee127834
Template:Hlist/styles.css
10
827
1426
1284
2025-09-07T17:57:24Z
Sharparam
284703
Remove template call
sanitized-css
text/css
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
ad2cb29b8df8d60f4deeb6a5e29187e1003123fe
Inhabitants
0
381
1428
525
2025-09-07T17:58:49Z
Sharparam
284703
Change to needs coords template
wikitext
text/x-wiki
{{stub}}
{{Needs coordinates}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}.
== Overview ==
{{Quote
|The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force.
}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
5266cbc4ddad8e8707d2b5b4cd643e481e2f1f72
Saracen Shield
0
749
1429
1159
2025-09-07T18:00:04Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Saracen Shield.png
| Weight = Heavy
| Abilities = [[Regal Radiance]]
| Mk2_Sharp = 59.5
| Mk2_Blunt = 57.4
| Mk2_Technomancy = 69.3
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== Location ==
{{coords|3760|1142|-1395}}
Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield.
{{Navbox/Shields}}
accf00596a02d4d71fbdbcf43a7cc9ed880910e8
Abilities
0
580
1430
921
2025-09-07T18:04:10Z
Sharparam
284703
Add see also link to passives
wikitext
text/x-wiki
'''Abilities''' are special skills that can be found on some [[weapons]].
== See also ==
* [[Passives]]
{{Navbox/Abilities}}
[[Category:Abilities]]
4a9afbbbbb6640ed8fad199b73590526aad4ff15
Category:Passives
14
885
1431
2025-09-07T18:05:38Z
Sharparam
284703
Created page with "[[Passives]] in {{BFF}}. Add pages to this category by using the {{tl|Infobox/Passive}} template."
wikitext
text/x-wiki
[[Passives]] in {{BFF}}. Add pages to this category by using the {{tl|Infobox/Passive}} template.
34e87bb01c1a0356708b43ee7f6ba248fda0fa61
1434
1431
2025-09-07T18:06:55Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Passives]] in {{BFF}}. Add pages to this category by using the {{tl|Infobox/Passive}} template.
[[Category:Game mechanics]]
f93dc3294b2ea001157045b5b59704e1b259500d
Passives
0
886
1432
2025-09-07T18:06:02Z
Sharparam
284703
Created page with "'''Passives''' are special properties that can be found on various [[equipment]], they provide their bonus at all times and don't need to be activated, unlike [[abilities]]. == See also == * [[Abilities]] [[Category:Passives]]"
wikitext
text/x-wiki
'''Passives''' are special properties that can be found on various [[equipment]], they provide their bonus at all times and don't need to be activated, unlike [[abilities]].
== See also ==
* [[Abilities]]
[[Category:Passives]]
43331e952831989ee9513121b46b294a9fdab4b1
Category:Abilities
14
581
1433
922
2025-09-07T18:06:35Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Abilities]] in {{BFF}}.
[[Category:Game mechanics]]
50df23fadba08e57b44187e5b8ecbaf6a021eb07
Category:Disambiguation templates
14
887
1435
2025-09-07T18:07:25Z
Sharparam
284703
Created blank page
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Category:Hatnote modules
14
888
1436
2025-09-07T18:07:43Z
Sharparam
284703
Created blank page
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
1451
1436
2025-09-07T18:15:43Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Category:Modules]]
c61dcaccacae29ec6d400192885e53b0ab04ae8b
Category:Disambiguation and redirection hatnote templates
14
889
1437
2025-09-07T18:07:54Z
Sharparam
284703
Created blank page
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Category:Anomalous crystals
14
890
1438
2025-09-07T18:08:25Z
Sharparam
284703
Created page with "[[Anomalous crystals]] in {{BFF}}. [[Category:Items]]"
wikitext
text/x-wiki
[[Anomalous crystals]] in {{BFF}}.
[[Category:Items]]
4de216d6a91d096fba8022567690bb1b72711c3a
Template:Abbr/doc
10
533
1439
827
2025-09-07T18:09:35Z
Sharparam
284703
Add category
wikitext
text/x-wiki
== Examples ==
=== [[Template:Tooltip]] ===
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> → {{Tooltip|text|tooltip title}}
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> → {{Tooltip|text "with" quotes|tooltip "with" quotes}}
<noinclude>[[Category:Template documentation]]</noinclude>
2fc823013e38886fd1c58d0df6749119b66a263c
1448
1439
2025-09-07T18:12:40Z
Sharparam
284703
Add category for template
wikitext
text/x-wiki
== Examples ==
=== [[Template:Tooltip]] ===
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> → {{Tooltip|text|tooltip title}}
* <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> → {{Tooltip|text "with" quotes|tooltip "with" quotes}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
db627ffbedf7c1dc68f985bdca7bd31252f30c52
Template:About/doc
10
735
1440
1132
2025-09-07T18:09:50Z
Sharparam
284703
Add category
wikitext
text/x-wiki
<!--
Categories go where indicated at the bottom of this page, please. -->
{{Tl|About}} is a commonly used [[wikipedia:WP:Hatnote|hatnote template]] for linking the reader to other articles with similar titles or concepts that they may have been seeking instead.
==Usage==
This template should be [[wikipedia:WP:HATNOTEPLACE|placed]] at the top of an article (but following {{Tlx|Short description}}, if present). The template has several formats, including:
*{{Tlx|About}} → {{About}}
*{{Tlx|About|Use1}} → {{About|Use1}}
*{{Tlx|About|<nowiki/>|Use2|Article2}} → {{About||Use2|Article2}}
*{{Tlx|About|<nowiki/>|<nowiki/>||Article (disambiguation)}} → {{About|||Article (disambiguation)}}
*{{Tlx|About|Use1|<nowiki/>|Article2}} → {{About|Use1||Article2}}
*{{Tlx|About|Use1|<nowiki/>|Article2|and|Article3}} → {{About|Use1||Article2|and|Article3}}
*{{Tlx|About|Use1|Use2|Article2}} → {{About|Use1|Use2|Article2}}
*{{Tlx|About|Use1|Use2|Article2|and|Article3}} → {{About|Use1|Use2|Article2|and|Article3}}
*{{Tlx|About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}} → {{About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}}
*{{Tlx|About|Use1|Use2|Article2|Use3|Article3}} → {{About|Use1|Use2|Article2|Use3|Article3}}
*{{Tlx|About|Use1|Use2|Article2|other uses}} → {{About|Use1|Use2|Article2|other uses}}
The template {{tl|For-multi}} produces the same hatnote, but without the initial ''This template is about''.
=== Styling in italics ===
Please see [[wikipedia:Wikipedia:Hatnote#Hatnotes with italics in the links]] ([[wikipedia:WP:ITHAT]]) for details about how to use italics in hatnotes.
==Parameters==
Alternately, a {{para|section|yes}} parameter can be added to the {{Tl|About}} template for use at the top of a section. When using this parameter, the wording in the template changes to specify that it is being used in a section:
*{{Tlx|About|Use1|<nowiki>section=yes</nowiki>}} → {{About|Use1|section=yes}}
*{{Tlx|About|Use1|<nowiki/>|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1||Article2|section=yes}}
*{{Tlx|About|Use1|Use2|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|section=yes}}
*{{Tlx|About|Use1|Use2|Article2|and|Article3|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|and|Article3|section=yes}}
*{{Tlx|About|Use1|Use2|Article2|other uses|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|other uses|section=yes}}
A {{para|text}} option adds text to the end; this should only be used when truly necessary, when the other hatnote templates listed below don't suffice.
The {{para|selfref|yes}} option marks the entire hatnote as a Wikipedia self-reference, causing it to be omitted when the page content is reused outside of Wikipedia (see {{tl|self reference}} and [[wikipedia:MOS:SELFREF]] for more details).
For more options, see section "TemplateData" below.
==TemplateData==
<!--{{TemplateData header}}-->
<!-- Should this mention the existence of "and"? It's something of a can of worms, since it only looks as though it only works in certain combinations of the other page 2/3/4 description fields... -->
<templatedata>
{
"description": "This template is a hatnote in the format \"This page is about … For other uses …\".",
"params": {
"1": {
"label": "Page description",
"type": "string",
"description": "What the page this template is placed on is about (\"This page is about …\")",
"suggested": true
},
"2": {
"label": "Other page 1 description",
"type": "string",
"description": "What the first other page is about. If unused or blank, defaults to \"other uses\".",
"suggested": true
},
"3": {
"label": "Other page 1 title",
"type": "wiki-page-name",
"description": "The title of the first other page. If unused, defaults to \"[page title] (disambiguation)\".",
"suggested": true
},
"4": {
"label": "Other page 2 description",
"type": "string",
"description": "What the second other page is about."
},
"5": {
"label": "Other page 2 title",
"type": "wiki-page-name",
"description": "The title of the second other page. If unused or blank and parameter 4 exists, defaults to \"[page title] (disambiguation)\"."
},
"6": {
"label": "Other page 3 description",
"type": "string",
"description": "What the third other page is about."
},
"7": {
"label": "Other page 3 title",
"type": "wiki-page-name",
"description": "The title of the third other page. If unused or blank and parameter 6 exists, defaults to \"[page title] (disambiguation)\"."
},
"8": {
"label": "Other page 4 description",
"type": "string",
"description": "What the fourth other page is about."
},
"9": {
"label": "Other page 4 title",
"type": "wiki-page-name",
"description": "The title of the fourth other page. If unused or blank and parameter 8 exists, defaults to \"[page title] (disambiguation)\"."
},
"section": {
"type": "string",
"description": "Pass \"yes\" in this parameter to get wording appropriate for use at the top of a section.",
"autovalue": "yes"
},
"text": {
"label": "Custom text",
"type": "string",
"description": "Text to be appended to the end."
}
}
}
</templatedata>
==See also==
* [[wikipedia:Wikipedia:Hatnote]]
<!--{{Hatnote templates}}-->
<!-- To add more other pages, continue with this alternating pattern using increasing numbers, starting with 6 for the next page description. -->
<includeonly>{{Sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Disambiguation and redirection hatnote templates]]
}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
084e5668a358b8d298f38cdc6d3c975db7098741
Template:Average/doc
10
532
1441
825
2025-09-07T18:10:05Z
Sharparam
284703
Add category
wikitext
text/x-wiki
This template is used to find the average (default mean) of a series of numbers.
==Parameters==
Parameters with a number as the value are the numbers to find the average of.
==Examples==
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|100000000}}
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000}}
* <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000|round=2}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000|round=2}}
==See also==
*{{tl|Median}}
<noinclude>[[Category:Template documentation]]</noinclude>
6c6e2c757468014acfc9bb1b053cff9daeccf20c
Template:Coordinates/doc
10
298
1442
396
2025-09-07T18:10:18Z
Sharparam
284703
Add category
wikitext
text/x-wiki
This template uses the {{ml|Coordinates}} Lua module.
== Usage ==
<templatedata>
{
"params": {
"x": {
"aliases": [
"1"
],
"label": "X",
"description": "X coordinate",
"example": "52",
"type": "number",
"required": true
},
"y": {
"aliases": [
"2"
],
"label": "Y",
"description": "Y coordinate",
"example": "12.5",
"type": "number",
"required": true
},
"z": {
"aliases": [
"3"
],
"label": "Z",
"description": "Z coordinate (vertical axis)",
"example": "-5.6",
"type": "number",
"required": true
}
},
"description": "Used to describe a location in the game.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12|y=50|z=-32}}</syntaxhighlight> → {{Coordinates|x=12|y=50|z=-32}}
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.5|42.5|-4.4}}</syntaxhighlight> → {{Coordinates|16.5|42.5|-4.4}}
* <syntaxhighlight lang="wikitext" inline>{{coords|1.2|3.4|5.6}}</syntaxhighlight> → {{coords|1.2|3.4|5.6}}
* <syntaxhighlight lang="wikitext" inline>{{pos|6.5|4.3|2.1}}</syntaxhighlight> → {{pos|6.5|4.3|2.1}}
<noinclude>[[Category:Template documentation]]</noinclude>
3e8e36f5e300ca38a3ca2e6ff14c9848b28d92df
Template:DamageRange/doc
10
528
1443
817
2025-09-07T18:10:34Z
Sharparam
284703
Add category
wikitext
text/x-wiki
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|10|20}}</syntaxhighlight> → {{DamageRange|10|20}}
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|1|2}}</syntaxhighlight> → {{DamageRange|1|2}}
* <syntaxhighlight lang="wikitext" inline>{{DamageRange|69|75|type=sharp}}</syntaxhighlight> → {{DamageRange|69|75|type=sharp}}
<noinclude>[[Category:Template documentation]]</noinclude>
cc8abbd175ebb12283ae191c68cfb6102179c2ff
Template:Duration/doc
10
789
1444
1228
2025-09-07T18:10:45Z
Sharparam
284703
Add category
wikitext
text/x-wiki
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Duration|3:30}}</syntaxhighlight> → {{Duration|3:30}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|h=1|m=2|s=3}}</syntaxhighlight> → {{Duration|h=1|m=2|s=3}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|3|2|1}}</syntaxhighlight> → {{Duration|3|2|1}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|3:30:00|display=A really long time!}}</syntaxhighlight> → {{Duration|3:30:00|display=A really long time!}}
* <syntaxhighlight lang="wikitext" inline>{{Duration|PT3H30M12S}}</syntaxhighlight> → {{Duration|PT3H30M12S}}
<noinclude>[[Category:Template documentation]]</noinclude>
202a9e40d32b298ce8bf8d682749cbb07096af28
Template:Median/doc
10
706
1445
1079
2025-09-07T18:10:56Z
Sharparam
284703
Add category
wikitext
text/x-wiki
This template is used to find the median of a series of numbers.
{{clear}}
==Parameters==
Parameters with a number as the value are the numbers to find the average of.
==Examples==
*<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|40|50|1000}}</syntaxhighlight> → {{Median|20|10|30|40|50|1000}}
*<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|50|1000}}</syntaxhighlight> → {{Median|20|10|30|50|1000}}
*<syntaxhighlight lang="wikitext" inline>{{Median|10.1|20.1|30.1|50.1|1000.1}}</syntaxhighlight> → {{Median|20.1|10.1|30.1|50.1|1000.1}}
==See also==
*{{tl|Average}}
<noinclude>[[Category:Template documentation]]</noinclude>
b212143490662c8a089de324dc4b661ca0a56849
Template:Sandbox other/doc
10
306
1446
400
2025-09-07T18:11:10Z
Sharparam
284703
Add category
wikitext
text/x-wiki
<!-- {{Documentation subpage}} -->
<!-- Categories go at the bottom of this page and interwikis go in Wikidata. -->
<templatedata>
{
"description": {
"en": "This template displays different output on sandbox and documentation pages than other ones."
},
"params": {
"1": {
"label": {
"en": "Sandbox text"
},
"description": {
"en": "Text displayed on sandbox (/sandbox) and documentation (/doc) subpages. Usually this doesn’t contain categories, but it may contain a link to the main template."
},
"type": "content",
"suggested": true
},
"2": {
"label": {
"en": "Normal text"
},
"description": {
"en": "Text displayed everywhere except for sandbox and documentation subpages. Usually this contains categories for the template."
},
"type": "content",
"suggested": true
}
}
}
</templatedata>
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
[[Category:Templates]]
}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
81b917070057eb1ad6e4b9f09f8d69a41a5c9e57
Template:Yesno/doc
10
307
1447
401
2025-09-07T18:11:24Z
Sharparam
284703
Add category
wikitext
text/x-wiki
<!-- {{Documentation subpage}} -->
<!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE -->
This template normalises an input to be a yes/no output.
== Usage ==
The template has five possible outputs depending on the default parameter (input if you will).
In its simplest usage, these will all be either "yes" or "" (blank = nothing no characters).
* {{Tlx|Yesno|yes}} → "yes" (also applies to "Yes", "YeS", etc, "Y", "y" and "1")
* {{Tlx|Yesno|no}} → "" (also applies to "No", "NO", "nO", "N", "n" and "0")
* {{Tlx|Yesno}} → ""
* {{Tlx|Yesno|¬}} → ""
* {{Tlx|Yesno|purplemonkeydishwasher}} → "yes" (also applies to any other value not given above)
Each of these can be over-ridden.
* {{Tlx|Yesno|yes|yes{{=}}bacon}} → "{{Yesno|yes|yes=bacon}}" (also applies to "Yes", "YeS", etc, "Y", "y" and "1")
* {{Tlx|Yesno|no|no{{=}}ham}} → "{{Yesno|no|no=ham}}" (also applies to "No", "NO", "nO", "N", "n" and "0")
* {{Tlx|Yesno||blank{{=}}eggs}} → "{{Yesno||blank=eggs}}"
** but {{Tlx|Yesno||no{{=}}ham}} → "{{Yesno||no=ham}}"
** and {{Tlx|Yesno||blank{{=}}eggs|no{{=}}ham}} → "{{Yesno||blank=eggs|no=ham}}"
* {{Tlx|Yesno|¬|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬|¬=sausage|blank=eggs|no=ham}}"
** and {{Tlx|Yesno|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬=sausage|blank=eggs|no=ham}}"
* {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}} → "{{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}}" (also applies to any other value not given above)
** but {{Tlx|Yesno|purplemonkeydishwasher|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|yes=bacon}}"
** and {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|def=cup-of-tea|yes=bacon}}"
This may be used (apparently perversely) thus:
* {{Tlx|Yesno|yes|yes{{=}}no|no{{=}}yes}} → "{{Yesno|yes|yes=no|no=yes}}"
* {{Tlx|Yesno|no|yes{{=}}no|no{{=}}yes}} → "{{Yesno|no|yes=no|no=yes}}"
This creates a logical inversion.
== TemplateData ==
<!-- {{TemplateData header}} -->
<templatedata>
{
"description": {
"en": "This template normalises an input to be a yes or nil output."
},
"format": "inline",
"params": {
"1": {
"label": {
"en": "Input value"
},
"description": {
"en": "The value to be evaluated."
},
"type": "string",
"required": true
},
"yes": {
"label": {
"en": "Output on yes"
},
"description": {
"en": "Specifies the output of the template when the input value is a case-insensitive forms of 'Yes', 'Y', 'True' or '1'."
},
"type": "string",
"required": false
},
"no": {
"label": {
"en": "Output on no"
},
"description": {
"en": "Specifies the output of the template when the input value is a case-insensitive forms of 'No', 'N', 'False', or '0'."
},
"type": "string",
"required": false
},
"blank": {
"label": {
"en": "Output on blank input"
},
"description": {
"en": "Specifies the output of the template when the input value is defined but is either empty or contains nothing but whitespace character(s)."
},
"type": "string",
"required": false
},
"¬": {
"label": {
"en": "Output on ¬"
},
"description": {
"en": "Specifies the output of the template when the input value is either '¬' or entirely missing (undefined)."
},
"type": "string",
"required": false
},
"def": {
"label": {
"en": "Definite output"
},
"description": {
"en": "Specifies the output of the template when the input value is defined but not a form of 'yes', 'no', '1', '0', '¬' or blank."
},
"type": "string",
"required": false
}
}
}
</templatedata>
== See also ==
* [[Module:Yesno]]
<includeonly>{{Sandbox other||
<!-- CATEGORIES AND INTERWIKIS HERE, THANKS -->
[[Category:Utility templates]]
}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
ac958651ed9ec8ec8a0b3f0a1d3083a2fa331e28
Template:DiscordLink/doc
10
857
1449
1350
2025-09-07T18:13:30Z
Sharparam
284703
Add category for template
wikitext
text/x-wiki
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Type",
"description": "Type of link to produce, leave unspecified or empty for default type.",
"example": "plain",
"type": "line",
"suggestedvalues": [
"default",
"plain"
],
"default": "default"
},
"text": {
"label": "Link text",
"description": "Custom text to show as the link text instead of the default \"Discord\".",
"example": "BFF Discord",
"type": "line",
"default": "Discord"
},
"icon": {
"label": "Show icon",
"description": "Whether to show a Discord icon next to the link.",
"type": "boolean",
"default": "no"
}
},
"description": "Produces a link to the official Bleak Faith: Forsaken Discord server.",
"paramOrder": [
"1",
"text",
"icon"
],
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink}}</syntaxhighlight> → {{DiscordLink}}
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink|icon=yes}}</syntaxhighlight> → {{DiscordLink|icon=yes}}
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink|text=BFF Discord}}</syntaxhighlight> → {{DiscordLink|text=BFF Discord}}
* <syntaxhighlight lang="wikitext" inline>{{DiscordLink|plain}}</syntaxhighlight> → {{DiscordLink|plain}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
5e94bed3c879ca0c034e9fa3bba48ac0d59374d0
Category:Inline templates
14
609
1450
957
2025-09-07T18:15:08Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Templates that can/should be used inline.
[[Category:Templates]]
eb911a83fafb6dcd7d10541fe3bf42da4395f330
Category:Perks
14
763
1452
1179
2025-09-07T18:16:12Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Perks]] in {{BFF}}.
[[Category:Game mechanics]]
8766f0725df74fea3c478872ad19ea3e2732e035
Category:Utility modules
14
315
1453
409
2025-09-07T18:16:35Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Utility Lua modules.
[[Category:Modules]]
2ac38f5cf7fe72c38ba0e1bbfe7c7dd31743b430
Category:Utility templates
14
308
1454
402
2025-09-07T18:16:51Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Utility templates for editing.
[[Category:Templates]]
429393713b4a71585e292b486e4ffcef4c87ce61
Category:Pages with inaccurate coordinates
14
349
1455
462
2025-09-07T18:17:17Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Contains pages using the {{tl|Coordinates}} template or {{ml|Coordinates}} module but passing in one or more coordinates that can be verified to not be completely accurate (i.e. coordinates with fewer than 2 decimals).
[[Category:Wiki maintenance]]
70ee3bdbaac740c9bb377489f9fd4e240f558a11
Category:Modules
14
698
1456
1066
2025-09-07T18:18:13Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Lua modules.
[[Category:Bleak Faith: Forsaken Wiki]]
de766841cc4ddf8c2adbf18a442a28192377cc70
Category:File templates
14
587
1457
928
2025-09-07T18:18:54Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Templates to help work with or categorise files.
[[Category:Templates]]
8e1ff2f0663f9d8800e9f83d2d8c11546b2433d4
Category:Disambiguation templates
14
887
1458
1435
2025-09-07T18:19:43Z
Sharparam
284703
Add category
wikitext
text/x-wiki
[[Category:Templates]]
06eecdec29f6cb215c99cf216d1e3bdc8c30a95e
Category:Manual of Style
14
846
1459
1333
2025-09-07T18:20:13Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Pages that deal with how the wiki should be edited.
[[Category:Bleak Faith: Forsaken Wiki]]
35577961aeea1e2857d5032bdd994c9c3a8a45b0
Category:Module documentation pages
14
316
1460
410
2025-09-07T18:21:51Z
Sharparam
284703
Add category
wikitext
text/x-wiki
Pages that document usage for Lua modules.
[[Category:Modules]]
35a28ebc3e2a045dd778e124a3b89331eceaa6ad
Abomination
0
881
1461
1427
2025-09-07T23:01:43Z
Sharparam
284703
Add coords and fix typo
wikitext
text/x-wiki
{{Infobox/Enemy
| image = Abomination (enemy).png
}}
'''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there.
== Location ==
{{coords|-43256.48|-9189.85|4654.05}} (approximate)
Located in [[Rain District#Center|Rain District (Center)]], in front of the [[Homunculus]].
{{Navbox/Enemies}}
17a8e1630af5b771bd3959eaaff8671fe1c9c608
Module:Coordinates/doc
828
891
1462
2025-09-07T23:07:54Z
Sharparam
284703
Created page with "== Usage == Do not use the module directly, instead use the {{tl|Coordinates}} template. == Test cases == <!-- * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|}}</syntaxhighlight> → {{#invoke:Coordinates|main|}} --> === Accurate === * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.23|4.56|7.89}}</syntaxhighlight> → {{#invoke:Coordinates|main|1.23|4.56|7.89}} === Inaccurate === * <syntaxhighlight lang="wikitext"..."
wikitext
text/x-wiki
== Usage ==
Do not use the module directly, instead use the {{tl|Coordinates}} template.
== Test cases ==
<!--
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|}}</syntaxhighlight> → {{#invoke:Coordinates|main|}}
-->
=== Accurate ===
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.23|4.56|7.89}}</syntaxhighlight> → {{#invoke:Coordinates|main|1.23|4.56|7.89}}
=== Inaccurate ===
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1|2|3}}</syntaxhighlight> → {{#invoke:Coordinates|main|1|2|3}}
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.0|2.0|3.0}}</syntaxhighlight> → {{#invoke:Coordinates|main|1.0|2.0|3.0}}
<includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!--
--><noinclude>[[Category:Module documentation pages]]</noinclude>
7cb6b3be92ebb1fc3e188425e895d53a96683999
1464
1462
2025-09-07T23:14:33Z
Sharparam
284703
Add link to styles
wikitext
text/x-wiki
== Usage ==
Do not use the module directly, instead use the {{tl|Coordinates}} template.
== Styles ==
* [[Module:Coordinates/styles.css]]
== Test cases ==
<!--
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|}}</syntaxhighlight> → {{#invoke:Coordinates|main|}}
-->
=== Accurate ===
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.23|4.56|7.89}}</syntaxhighlight> → {{#invoke:Coordinates|main|1.23|4.56|7.89}}
=== Inaccurate ===
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1|2|3}}</syntaxhighlight> → {{#invoke:Coordinates|main|1|2|3}}
* <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.0|2.0|3.0}}</syntaxhighlight> → {{#invoke:Coordinates|main|1.0|2.0|3.0}}
<includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!--
--><noinclude>[[Category:Module documentation pages]]</noinclude>
fd213ce58882a30d859ed97c03e80ca03fa7965e
Module:Coordinates/styles.css
828
892
1463
2025-09-07T23:13:43Z
Sharparam
284703
Created page with ".coordinates { text-decoration: underline dotted; } .coordinates.inaccurate { text-decoration-color: red; text-decoration-style: wavy; }"
sanitized-css
text/css
.coordinates {
text-decoration: underline dotted;
}
.coordinates.inaccurate {
text-decoration-color: red;
text-decoration-style: wavy;
}
db96eb1801a0135aa30f3280e515af2094d423af
Module:Coordinates
828
296
1465
1405
2025-09-07T23:18:39Z
Sharparam
284703
Use stylesheet
Scribunto
text/plain
local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$"
local NS_TO_CATEGORISE = {
[0] = true, -- main
[6] = true, -- file
[14] = true -- category
}
local CHECK_PATTERN = "^-?%d+%.%d%d$"
local args_util = require('Module:ArgsUtil')
local p = {}
---@param val number
---@param label string
local function coordNode(val, label)
return mw.html.create('span')
:addClass(label)
:wikitext(p.formatCoord(val))
end
---@param val number
---@return string
function p.formatCoord(val)
local sign = val < 0 and '-' or ''
val = math.abs(val)
val = math.floor(val * 100) / 100
local str = tostring(val)
local int = string.match(str, "^%d+")
local dec = string.match(str, "%.(%d-)0*$") or ''
local int_len = #int
local dec_len = #dec
if int_len >= 3 then
return sign .. string.sub(int, 1, 4)
end
if dec_len == 0 then return sign .. int end
return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2))
end
function p.main(frame)
local args = args_util.merge()
return p._main(args)
end
function p._main(args)
local x = args.x or args[1] or ""
local y = args.y or args[2] or ""
local z = args.z or args[3] or ""
local accurate_x = string.match(x, CHECK_PATTERN) ~= nil
local accurate_y = string.match(y, CHECK_PATTERN) ~= nil
local accurate_z = string.match(z, CHECK_PATTERN) ~= nil
local accurate = accurate_x or accurate_y or accurate_z
x = tonumber(z) or 0
y = tonumber(z) or 0
z = tonumber(z) or 0
local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z)
local elem = mw.html.create('span')
:attr('data-x', x)
:attr('data-y', y)
:attr('data-z', z)
:attr('title', tooltip)
:addClass('coordinates')
:addClass('nowrap')
:node(coordNode(x, 'x'))
:wikitext('::')
:node(coordNode(y, 'y'))
:wikitext('::')
:node(coordNode(z, 'z'))
if not accurate then
elem = elem:addClass('inaccurate')
end
elem = tostring(elem)
local ns = mw.title.getCurrentTitle().namespace
if NS_TO_CATEGORISE[ns] then
if not accurate then
elem = elem .. '[[Category:Pages with inaccurate coordinates]]'
end
elem = elem .. '[[Category:Pages with coordinates]]'
end
local with_styles = mw.getCurrentFrame():extensionTag {
name = 'templatestyles',
args = { src = 'Module:Coordinates/styles.css' }
} .. elem
return with_styles
end
return p
593292e1a1dac54b90713ee4b0ef431dbbfa2c72
Template:Coordinates/doc
10
298
1466
1442
2025-09-07T23:22:19Z
Sharparam
284703
Make sure examples use accurate coordinates, add example of inaccurate coords
wikitext
text/x-wiki
This template uses the {{ml|Coordinates}} Lua module.
== Usage ==
<templatedata>
{
"params": {
"x": {
"aliases": [
"1"
],
"label": "X",
"description": "X coordinate",
"example": "52",
"type": "number",
"required": true
},
"y": {
"aliases": [
"2"
],
"label": "Y",
"description": "Y coordinate",
"example": "12.5",
"type": "number",
"required": true
},
"z": {
"aliases": [
"3"
],
"label": "Z",
"description": "Z coordinate (vertical axis)",
"example": "-5.6",
"type": "number",
"required": true
}
},
"description": "Used to describe a location in the game.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> → {{Coordinates|x=12.42|y=50.00|z=-32.70}}
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> → {{Coordinates|16.51|42.55|-4.43}}
* <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> → {{coords|1.23|4.56|7.89}}
* <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> → {{pos|6.51|4.32|2.13}}
Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot:
<syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> → {{coords|1|2|3}}
<noinclude>[[Category:Template documentation]]</noinclude>
a89bb1bedd24821a52110ebb711f71eccca244ef
Diver's Lungs Concoction
0
893
1467
2025-09-07T23:28:35Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Diver's Lungs Concoction (item).png | type = concoction | Description = Increases maximum lung capacity by {{Duration|s=25|display=25 seconds}} worth of oxygen for {{Duration|s=300|display=300 seconds}}. }} '''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. It lets the player stay longer underwater by increasing their lung capacity. == Acquisition == Drops from [[Fisherman|fishermen]]. {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Diver's Lungs Concoction (item).png
| type = concoction
| Description = Increases maximum lung capacity by {{Duration|s=25|display=25 seconds}} worth of oxygen for {{Duration|s=300|display=300 seconds}}.
}}
'''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. It lets the player stay longer underwater by increasing their lung capacity.
== Acquisition ==
Drops from [[Fisherman|fishermen]].
{{Navbox/Consumables}}
144f3fe65f87d139bda8b687ddc4fb8c8504d2bc
File:Diver's Lungs Concoction (item).png
6
894
1468
2025-09-07T23:30:13Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_51
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_51
}}
== Licensing ==
{{License|game}}
a816b0fa3540456c73cc969d2ab7d66a4dd6fc96
Asylum Brew
0
895
1469
2025-09-07T23:33:30Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Asylum Brew (item).png | type = consumable | Description = Reset all of your assigned perks. Usable from inventory. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Location == {{Needs coordinates|tiny=yes|what=This section}} Found near the beginning of the game in [[New Game Plus|NG+]]. {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Asylum Brew (item).png
| type = consumable
| Description = Reset all of your assigned perks. Usable from inventory.
}}
'''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}.
== Location ==
{{Needs coordinates|tiny=yes|what=This section}}
Found near the beginning of the game in [[New Game Plus|NG+]].
{{Navbox/Consumables}}
caf9c60ae34d33f482c4f29382ae04e416fa872f
File:Asylum Brew (item).png
6
896
1470
2025-09-07T23:34:03Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_37
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_37
}}
== Licensing ==
{{License|game}}
24ecfc87dbf948b55ba33c7b915c6a35e7485d42
Ionization Fluid
0
897
1471
2025-09-07T23:37:12Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[flux]]. == See also == * [[Lesser Ionization Fluid]] * [[Greater Ionization Fluid]] {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Ionization Fluid (item).png
| type = fluid
| Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]].
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[flux]].
== See also ==
* [[Lesser Ionization Fluid]]
* [[Greater Ionization Fluid]]
{{Navbox/Consumables}}
6ee67fb9d6d89ed7111b124b114aef624b14f278
File:Ionization Fluid (item).png
6
898
1472
2025-09-07T23:38:05Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_8
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_8
}}
== Licensing ==
{{License|game}}
3359aa55c3123704b247968effea8c856f0e15f2
Lesser Ionization Fluid
0
899
1473
2025-09-07T23:40:20Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Lesser Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 100 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]]. == See also == * [[Ionization Fluid]] * [[Greater Ionization Fluid]] {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Lesser Ionization Fluid (item).png
| type = fluid
| Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 100 [[Flux]].
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]].
== See also ==
* [[Ionization Fluid]]
* [[Greater Ionization Fluid]]
{{Navbox/Consumables}}
a00def1510294b50f411d6303801b7a5c58bbdf2
File:Lesser Ionization Fluid (item).png
6
900
1474
2025-09-07T23:40:47Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_15
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_15
}}
== Licensing ==
{{License|game}}
e95f0029f64512e2c93aa8579965a15b6f419220
Greater Ionization Fluid
0
901
1475
2025-09-07T23:42:11Z
Sharparam
284703
Created page with "{{Infobox/Item | image = Greater Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]]. == See also == * [[Lesser Ionization Fluid]] * [[Ionization Fluid]] {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Infobox/Item
| image = Greater Ionization Fluid (item).png
| type = fluid
| Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]].
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]].
== See also ==
* [[Lesser Ionization Fluid]]
* [[Ionization Fluid]]
{{Navbox/Consumables}}
67290ee299ee4f517ec4648e6dc1648dd6dcff7a
File:Greater Ionization Fluid (item).png
6
902
1476
2025-09-07T23:42:37Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_3
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_3
}}
== Licensing ==
{{License|game}}
65acf6a2babd2d5f488554363f7633670653542a
Template:Infobox/Shield
10
457
1477
679
2025-09-07T23:47:29Z
Sharparam
284703
Add support for min mark and title fallback
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=shield
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Weight,Passives,Abilities
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{#if:{{{Mk0_Sharp|}}}|{{{Mk0_Sharp}}}%|???}}
|Mk0_Blunt={{#if:{{{Mk0_Blunt|}}}|{{{Mk0_Blunt}}}%|???}}
|Mk0_Technomancy={{#if:{{{Mk0_Technomancy|}}}|{{{Mk0_Technomancy}}}%|???}}
|Mk1_Sharp={{#if:{{{Mk1_Sharp|}}}|{{{Mk1_Sharp}}}%|???}}
|Mk1_Blunt={{#if:{{{Mk1_Blunt|}}}|{{{Mk1_Blunt}}}%|???}}
|Mk1_Technomancy={{#if:{{{Mk1_Technomancy|}}}|{{{Mk1_Technomancy}}}%|???}}
|Mk2_Sharp={{#if:{{{Mk2_Sharp|}}}|{{{Mk2_Sharp}}}%|???}}
|Mk2_Blunt={{#if:{{{Mk2_Blunt|}}}|{{{Mk2_Blunt}}}%|???}}
|Mk2_Technomancy={{#if:{{{Mk2_Technomancy|}}}|{{{Mk2_Technomancy}}}%|???}}
|Mk3_Sharp={{#if:{{{Mk3_Sharp|}}}|{{{Mk3_Sharp}}}%|???}}
|Mk3_Blunt={{#if:{{{Mk3_Blunt|}}}|{{{Mk3_Blunt}}}%|???}}
|Mk3_Technomancy={{#if:{{{Mk3_Technomancy|}}}|{{{Mk3_Technomancy}}}%|???}}
|Mk4_Sharp={{#if:{{{Mk4_Sharp|}}}|{{{Mk4_Sharp}}}%|???}}
|Mk4_Blunt={{#if:{{{Mk4_Blunt|}}}|{{{Mk4_Blunt}}}%|???}}
|Mk4_Technomancy={{#if:{{{Mk4_Technomancy|}}}|{{{Mk4_Technomancy}}}%|???}}
|Mk5_Sharp={{#if:{{{Mk5_Sharp|}}}|{{{Mk5_Sharp}}}%|???}}
|Mk5_Blunt={{#if:{{{Mk5_Blunt|}}}|{{{Mk5_Blunt}}}%|???}}
|Mk5_Technomancy={{#if:{{{Mk5_Technomancy|}}}|{{{Mk5_Technomancy}}}%|???}}
}}{{#if:{{NAMESPACE}}||[[Category:Shields]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
8931d1e93b36fefa8ff5cacb37de1f62f098337b
Flat Shield
0
903
1478
2025-09-07T23:48:07Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Shield | title = {{PAGENAME}} | image = Flat Shield.png | Weight = Heavy | Mk_min = 1 | Mk1_Sharp = 61.7 | Mk1_Blunt = 58.5 | Mk1_Technomancy = 39 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Shield
| title = {{PAGENAME}}
| image = Flat Shield.png
| Weight = Heavy
| Mk_min = 1
| Mk1_Sharp = 61.7
| Mk1_Blunt = 58.5
| Mk1_Technomancy = 39
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
{{Navbox/Shields}}
940a44e19c55c0458ac6add23e0b2691944c7f1f
File:Flat Shield.png
6
904
1479
2025-09-07T23:49:29Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_KiteshieldFlat
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_KiteshieldFlat
}}
== Licensing ==
{{License|game}}
3e580546301203f92f639bfac3e05acb6b3cb182
Template:Needs location
10
905
1480
2025-09-07T23:51:25Z
Sharparam
284703
Created page with "<includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = {{{what|This page}}} needs a location section added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit it] to add one. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages missing location]]}}}}<!-- --></includeonly><!-- --><noinclude>{{Needs location|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude>"
wikitext
text/x-wiki
<includeonly>{{Ambox
| color = gold
| icon = Cleanup.svg
| message = {{{what|This page}}} needs a location section added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit it] to add one.
| tiny = {{{tiny|}}}
| class = {{{class|}}}
| date = {{{date|}}}
}}<!--
-->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages missing location]]}}}}<!--
--></includeonly><!--
--><noinclude>{{Needs location|nocat=yes}}
{{doc|Template:Ambox/doc}}</noinclude>
562974d484e01f92cfa7c30ccf742dc32a1aaf5e
Category:Pages missing location
14
906
1481
2025-09-07T23:52:39Z
Sharparam
284703
Created page with "Pages in this category are missing location information for where they can be obtained or are located. To put a page in this category, use the {{tl|Needs location}} template. [[Category:Wiki maintenance]]"
wikitext
text/x-wiki
Pages in this category are missing location information for where they can be obtained or are located.
To put a page in this category, use the {{tl|Needs location}} template.
[[Category:Wiki maintenance]]
5eac526e708aab4f90b14769338f0958466bed6f
Kite Shield
0
907
1482
2025-09-07T23:54:13Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Shield | image = Kite Shield.png | Weight = Heavy | Mk_min = 0 | Mk0_Sharp = 51 | Mk0_Blunt = 51 | Mk0_Technomancy = 30 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Shield
| image = Kite Shield.png
| Weight = Heavy
| Mk_min = 0
| Mk0_Sharp = 51
| Mk0_Blunt = 51
| Mk0_Technomancy = 30
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
{{Navbox/Shields}}
c0d3267e89401628212c8046a21053f517afa77e
File:Kite Shield.png
6
908
1483
2025-09-07T23:55:47Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/KiteShieldIcon
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/KiteShieldIcon
}}
== Licensing ==
{{License|game}}
d7a68d97c4061fd014bdfd9b8381fbffc3e7e854
Military Shield
0
909
1484
2025-09-07T23:56:59Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Shield | image = Military Shield.png | Weight = Heavy | Abilities = Shield Bash | Mk_min = 2 | Mk0_Sharp = 66.5 | Mk0_Blunt = 59.5 | Mk0_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == See also == * [[Tall Military Shield]] {{Navbox/Shields}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Shield
| image = Military Shield.png
| Weight = Heavy
| Abilities = Shield Bash
| Mk_min = 2
| Mk0_Sharp = 66.5
| Mk0_Blunt = 59.5
| Mk0_Technomancy = 52.5
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== See also ==
* [[Tall Military Shield]]
{{Navbox/Shields}}
2bd0947b343b32db4e42502c0f90481467b96564
1486
1484
2025-09-07T23:58:00Z
Sharparam
284703
Fix stats
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Shield
| image = Military Shield.png
| Weight = Heavy
| Abilities = Shield Bash
| Mk_min = 2
| Mk2_Sharp = 66.5
| Mk2_Blunt = 59.5
| Mk2_Technomancy = 52.5
}}
'''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}.
== See also ==
* [[Tall Military Shield]]
{{Navbox/Shields}}
ea347b44b98dffeb9aeaeed7791d1b25fa21de12
File:Military Shield.png
6
910
1485
2025-09-07T23:57:44Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/icon_militaryshield
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/icon_militaryshield
}}
== Licensing ==
{{License|game}}
06a72fbf6338f7d8b747ffca7ca91e957da3af9c
The Handler
0
345
1487
458
2025-09-08T00:06:11Z
Sharparam
284703
/* Locations */ Add rain district location and fix deluge coords
wikitext
text/x-wiki
{{Infobox/NPC
| image = The Handler Blok 6147.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}} that will let the player upgrade their [[equipment]], embed crystals into it, and manufacture certain [[items]].
== Overview ==
Other than serving as a way to upgrade and manufacture items, she will also give the player some guidance on their next objective.
She will usually appear next to the [[Homunculus]] closest to the entrance of an area.
The Handler's synchronization level can be increased by finding [[Handler Echo|handler echoes]] and bringing them to her. Increasing her level allows for upgrading [[equipment]] to higher levels.
== Appearance ==
She appears to be some sort of robot or cyborg, with light skin, black parts, and silver hair.
== Locations ==
{| class="wikitable"
! scope="col" | Area
! scope="col" | Description
! scope="col" | Coordinates
|-
| [[Monastery]] || Near the first [[Homunculus]] (only in [[New Game Plus]]) || {{coords|23473.78|-85243.22|-15260.61}}
|-
| [[Blok 6147]] || In the center (right next to the [[Homunculus]]) || {{coords|-25.27|442.48|1160.96}}
|-
| [[Rain District]] || In the center area, in front of a wall to the left of the [[Homunculus]] || {{coords|-43084.52|-8483.92|4575.76}}
|-
| [[Deluge]] || Sitting on a ledge near the first [[Homunculus]] || {{coords|-33118.94|-7478.60|56507.07}}
|-
| [[Asylum]] || Standing in front of a pillar near the [[Homunculus]] || {{coords|-4507|6967|9032}}
|-
| [[Upper Blocks]] || Standing in front of some rubble opposite of the [[Homunculus]] || {{coords|4585|1626|2193}}
|-
| [[Machinarium]] || Standing next to a wall just past the first [[Homunculus]] || {{coords|-2125.53|27029.25|-12156.72}}
|-
| [[Desert]] || Standing next to a wall just past the [[Homunculus]] || {{coords|-9576.35|65589.26|-136382.62}}
|-
| [[Anomaly]] || Standing next to a pair of pillars just past the [[Homunculus]] || {{coords|46782.80|162169.12|-141987.55}}
|-
| [[Vermillion Fields]] || Standing next to the [[Homunculus]], mirroring her location in [[Blok 6147]] || {{coords|582|-4995|1178}}
|}
== Quotes ==
=== When approached ===
When approached without any special event dialogue waiting to be triggered, she will pick one of the below greeting phrases at random.
{{Quote|Hello!|audio=The_Handler_Hello.ogg}}
{{Quote|Hello there!|audio=The_Handler_Hello_There.ogg}}
{{Quote|Well hello there!|audio=The_Handler_Well_Hello_There.ogg}}
{{Quote|Back so soon!|audio=The_Handler_Back_So_Soon.ogg}}
{{Quote|Look who came to visit!|audio=The_Handler_Look_Who_Came_To_Visit.ogg}}
=== First encounter ===
{{Quote
|You're finally here. We can now commence the [[recalibration]].
I've updated the locations of the malfunctioning modules in the terminal. Any time you link to a terminal, you should be able to see the modules.
I must advise utmost caution, as I have surveyed the area and it is infested with aggressive mutations.
The radiation leaking out of [[The Anomaly|the anomaly]] is causing a strong disturbance in the casual field. We should leave this place as soon as possible.
The readings are unlike anything I've seen. The data is completely unstable as I am still unable to upload it for decyphering.
Farewell.
| audio = The_Handler_First_Encounter.ogg
}}
=== After first [[recalibration]] ===
{{Quote
|There is one module left to recalibrate. Unfortunately the data leaking from [[The Anomaly|the anomaly]] is still too corrupted to read.
The surveillance net has taken note of ripples with particularly long wavelengths unusually coming into existence. I believe it's a sign of intruders – particularly dangerous ones that are not of our timeline.
I am not sure I understand what exactly is going on here. I suppose we are yet to learn the true definition of something anomalous.
Farewell.
}}
=== After second [[recalibration]] ===
{{Quote
|The [[recalibration]] was successful, the transgression field is down.
[[The Anomaly|The anomaly]] is now exposed and ready to be stabilized.
''*silence*''
I'm afraid I will be breaching protocol by telling you, that since the recalibration – I have been unable to transmit or receive any transmissions from any other floor.
If I had to make a guess, I would say something from inside the anomaly is tampering with much more than just the causal field. I am afraid I am not equipped to run a robust field analysis, but I speculate we're dealing with an event far outside our scope.
Nevertheless, I did run some more rudimentary data decrypting processes.
The leaks from inside the anomaly are not arbitrary, they reveal the patterns of language. I have tried to compute at least the general scope and nature of its form – but the permutations are overwhelming all of my systems.
Simply running the processes has had some kind of spillover effect into the computing instruments themselves. This language is of unfathomable complexity.
Take great caution, these are circumstances far outside the realms of understanding.
Farewell.
}}
=== First encounter in [[Vermillion Fields]] ===
{{Quote
|Good to see a familiar face.
I must admit, I am no more aware of what is really taking place than I was before this turn of events. I believe there is a powerful external force moving the needle here, and we are completely oblivious to its nature.
I am afraid I won't be of much more use to you in this state, and I'm not quite sure how I've even made it this far. However, I will help with what I can, while I'm here.
I did however learn something. While being transported I noticed a certain Vermillion branching structure buffering this entire world and its roots run deeply. My access was promptly restricted, leaving me in this condition.
Whatever effect the Vermillion structure has, we must be very careful. I believe it has access to base reality, in which case we are dealing with a potential cataclysmic event.
I don't know if it is fear, or excitement – whatever we are experiencing here makes me feel in a way I find hard to describe.
Stay safe.
}}
Her lines in [[Vermillion Fields]] are delivered in a distorted voice, she will also no longer greet the player when approached. Despite her claims about not being of much use any more, she can still perform all of her normal functions.
== Gallery ==
<gallery>
File:The_Handler_Blok_6147.png|[[The Handler]] in [[Blok 6147]].|alt=Screenshot showing The Handler standing around in Blok 6147.
File:The_Handler_Deluge.png|[[The Handler]] in [[Deluge]].|alt=Screenshot showing The Handler sitting on a ledge in Deluge.
File:The_Handler_Asylum.png|[[The Handler]] in [[Asylum]].|alt=Screenshot showing The Handler standing around in Asylum.
File:The_Handler_Upper_Blocks.png|[[The Handler]] in [[Upper Blocks]].|alt=Screenshot showing The Handler standing around in Upper Blocks.
File:The_Handler_Machinarium.png|[[The Handler]] in [[Machinarium]].|alt=Screenshot showing The Handler standing around in Machinarium.
</gallery>
== Trivia ==
* The game files call her "Blacksmith".
{{Navbox/NPCs}}
965ad67ead98e0fcf8f1148bcc9ebcd6d6521fd1
Aberrant Knight
0
911
1488
2025-09-08T00:14:45Z
Sharparam
284703
Created page with "{{Infobox/Boss | image = Aberrant Knight (boss).png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. It is the boss of the [[Machinarium]] area. == Location == {{coords|39381.14|55587.16|-18311.03}} (approximate) Located in [[Machinarium]], being the boss of the area. {{Navbox/Bosses}}"
wikitext
text/x-wiki
{{Infobox/Boss
| image = Aberrant Knight (boss).png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. It is the boss of the [[Machinarium]] area.
== Location ==
{{coords|39381.14|55587.16|-18311.03}} (approximate)
Located in [[Machinarium]], being the boss of the area.
{{Navbox/Bosses}}
af411180d56b06fed6914bae2971476fecf3e2e5
File:Aberrant Knight (boss).png
6
912
1489
2025-09-08T00:16:50Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Archinquisitor Belisarius (boss)
0
548
1490
857
2025-09-08T00:19:39Z
Sharparam
284703
/* Location */ Fix coords
wikitext
text/x-wiki
{{About|the [[Bosses|boss]]|the [[NPC]]|Archinquisitor Belisarius}}
{{Infobox/Boss
| title = Archinquisitor Belisarius
| image = Archinquisitor Belisarius (boss).png
}}
'''Archinquisitor Belisarius''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Location ==
{{coords|43321.24|172994.22|-141305.92}} (approximate)
Found at the beginning of the [[Anomaly]] area.
== Drops ==
* [[Blessed Crosier]]
* [[Unstable Perk Essence]]
* [[Upgrade Module]]
== Quotes ==
=== Upon engaging him ===
{{Quote
|Well well… You made it through. As much as I hate to elevate your spiteful existence to the height of the truth… this is where we are now.
Ever since you've joined us, all you've done is fulfil the goals of the disgusting administration you work for.
The mundane pursuit of tasks is all you know… and this crusade against that apostate filth at the gate is just a backdrop to your performance.
Yet [[Anomaly|the anomaly]] is a blessing I will not let slip out of my hands… for it is instrumental in aiding the God-Emperor, noble is he and eternal, to finally transcend.
Nothing will stand in that path, I assure you. Not the Serdars, not [[Yaroslav]] and definitely not you – a dog that obeys by reflex instead of will.
Now… we both know you never quite die – so you'll at least find out what an eternity of pain is made of. Good thing you have no name – those make for the best martyrs.
}}
{{Navbox/Bosses}}
e324f6e2cfa6156cde4dbbdba8680171b6731c92
File:Archinquisitor Belisarius (boss).png
6
913
1491
2025-09-08T00:22:22Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Unknown (boss)
0
549
1492
859
2025-09-08T00:25:03Z
Sharparam
284703
/* Location */ Add needs coords template
wikitext
text/x-wiki
{{About|the [[Bosses|boss]]|the [[Locations|location]]|Unknown (location)}}
{{Infobox/Boss
| title = Unknown
| image = Unknown (boss).png
}}
'''Unknown''' is an optional [[Bosses|boss]] in {{BFF}}.
== Overview ==
The Unknown resembles the player character in [[armor]], but uses its own [[Weapons|weapon]] instead of mirroring the player's. It does not drop its weapon on defeat.
Upon defeating the boss, the player is immediately transported to [[Vermillion Fields]].
== Location ==
{{Needs coordinates|tiny=yes|what=This section}}
Located at the end of the [[Unknown (location)|Unknown]], being the boss of the area.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
3219be45353be22732ceff0032f590f17d890194
Wormlord
0
547
1493
855
2025-09-08T00:26:13Z
Sharparam
284703
/* Overview */ Fix link to anomaly location
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Wormlord.png
}}
'''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Overview ==
Defeating Wormlord is required to be able to access [[Anomaly|the Anomaly]].
== Location ==
{{coords|2550|-4122|-1198}} (approximate)
Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
4b5591aa710c93ff63f75d58cb7d44090009328e
Unknown (location)
0
365
1494
493
2025-09-08T00:26:56Z
Sharparam
284703
Add list of enemies
wikitext
text/x-wiki
{{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}}
'''Unknown''' is a [[Locations|location]] in {{BFF}}.
== Overview ==
As the Unknown cannot be relocated to, it has no artwork image and no in-game description.
== Enemies ==
=== Bosses ===
* [[Unknown (boss)|Unknown]]
{{Navbox/Locations}}
[[Category:Locations]]
13647554bab09dde78a155ac84cd933be9f5feff
Vermillion Fields
0
364
1495
491
2025-09-08T00:27:56Z
Sharparam
284703
Add enemies (boss)
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Overview ==
Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]].
== Plaza ==
[[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]]
{{Quote
|Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field.
}}
{{clear}}
== Temple ==
[[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]]
{{Quote
|Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes.
}}
== Enemies ==
=== Bosses ===
* [[Royal Division Captain Yulia & Vermillion Mirage|Royal Division Captain Yulia & Vermillion Mirage]]
{{Navbox/Locations}}
[[Category:Locations]]
24bf1b906760314271b205275768a748565b8e01
Monastery
0
354
1496
471
2025-09-08T00:28:55Z
Sharparam
284703
Add boss list
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Lower ==
[[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]]
{{Quote
| A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings
}}
{{clear}}
== Upper ==
[[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]]
{{Quote
| Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos.
}}
== Enemies ==
=== Bosses ===
* [[Mutated Ghoul]] (lower)
* [[Konrad the Traitor]] (upper)
{{Navbox/Locations}}
[[Category:Locations]]
2c119d74a88242088576696b386938aa671855a5
Blok 6147
0
353
1497
469
2025-09-08T00:29:55Z
Sharparam
284703
Add boss list
wikitext
text/x-wiki
[[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history.
}}
== Enemies ==
=== Bosses ===
* [[Plagued Warden]]
== Trivia ==
* If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list.
{{Navbox/Locations}}
[[Category:Locations]]
b77bf137ab1141557621b152b4583a87b136d923
Asylum
0
357
1498
1329
2025-09-08T00:30:58Z
Sharparam
284703
/* Bosses */ Rename to enemies and change bosses to sub heading
wikitext
text/x-wiki
[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls.
}}
== NPCs ==
* [[Inquisitor Commander Alexius]]
== Enemies ==
=== Bosses ===
* [[Plagued Nemesis]]
{{Navbox/Locations}}
[[Category:Locations]]
b79b7f8b2e2ab31389b0eb2dee59c73d3eec0b12
Upper Blocks
0
358
1499
479
2025-09-08T00:31:26Z
Sharparam
284703
Add boss list
wikitext
text/x-wiki
[[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation.
}}
== Enemies ==
=== Bosses ===
* [[Silicon Visage]]
{{Navbox/Locations}}
[[Category:Locations]]
f2f110321314817e0dbe67c7cb95cec9fe076739
Uranopolis
0
352
1500
948
2025-09-08T00:31:57Z
Sharparam
284703
Add boss list
wikitext
text/x-wiki
'''Uranopolis''' is a location in {{BFF}}.
== Sub-locations ==
Uranopolis consists of two sub-locations: Tower Complex and Lone Tower.
=== Tower Complex ===
{{Main|Uranopolis/Tower Complex}}
[[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]]
The '''Tower Complex''' is the first sub-location encountered by the player.
{{clear}}
=== Lone Tower ===
[[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]]
The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here.
== Enemies ==
=== Bosses ===
* [[Nurgei the Blademaster]]
{{Navbox/Locations}}
[[Category:Locations]]
2af5e75e3cf86d833de500601626d60f0fc38943
Ghost Town
0
359
1501
481
2025-09-08T00:32:40Z
Sharparam
284703
Add boss list
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Floor 13 ==
[[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]]
{{Quote
| Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past.
}}
{{clear}}
== Floor 1 ==
[[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]]
{{Quote
| A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog.
}}
== Enemies ==
=== Bosses ===
* [[Plagued Revenant]]
{{Navbox/Locations}}
[[Category:Locations]]
5ded3be01d5c890d56c5f36dde075a16f128cf42
Machinarium
0
360
1502
483
2025-09-08T00:33:08Z
Sharparam
284703
Add boss list
wikitext
text/x-wiki
[[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay.
}}
== Enemies ==
=== Bosses ===
* [[Aberrant Knight]]
{{Navbox/Locations}}
[[Category:Locations]]
83aa77c8adbe31c38597cc50a1853a01dfc7d52f
1514
1502
2025-09-08T00:39:15Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
[[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Aberrant Knight]]
{{Navbox/Locations}}
[[Category:Locations]]
3e8ed7220931056a7827e0269b79919161dce1e9
Desert Mirage
0
362
1503
487
2025-09-08T00:33:42Z
Sharparam
284703
Add boss list
wikitext
text/x-wiki
[[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A desert from another time.
}}
== Enemies ==
=== Bosses ===
* [[Wormlord]]
{{Navbox/Locations}}
[[Category:Locations]]
5651f67a3a0f29bf3cb713db423047e0819aaa59
Vermillion Fields
0
364
1504
1495
2025-09-08T00:34:23Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Overview ==
Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]].
== Plaza ==
[[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]]
{{Quote
|Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field.
}}
{{clear}}
== Temple ==
[[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]]
{{Quote
|Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Royal Division Captain Yulia & Vermillion Mirage|Royal Division Captain Yulia & Vermillion Mirage]]
{{Navbox/Locations}}
[[Category:Locations]]
fd241b3246aafa857d9911c0abd5f8ea11d3e5a5
Monastery
0
354
1505
1496
2025-09-08T00:35:42Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Lower ==
[[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]]
{{Quote
| A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings
}}
{{clear}}
== Upper ==
[[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]]
{{Quote
| Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos.
}}
== NPCs ==
* [[The Handler]] ([[New Game Plus|NG+]])
== Enemies ==
=== Bosses ===
* [[Mutated Ghoul]] (lower)
* [[Konrad the Traitor]] (upper)
{{Navbox/Locations}}
[[Category:Locations]]
8a0c9a1365d42e5a9e116242723dc1678af12588
1506
1505
2025-09-08T00:36:04Z
Sharparam
284703
/* NPCs */ Add abandoned soldier
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Lower ==
[[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]]
{{Quote
| A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings
}}
{{clear}}
== Upper ==
[[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]]
{{Quote
| Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos.
}}
== NPCs ==
* [[Abandoned Soldier]]
* [[The Handler]] ([[New Game Plus|NG+]])
== Enemies ==
=== Bosses ===
* [[Mutated Ghoul]] (lower)
* [[Konrad the Traitor]] (upper)
{{Navbox/Locations}}
[[Category:Locations]]
4f82add3f2b01b58e03c8b0b33f82a3bee36db60
Blok 6147
0
353
1507
1497
2025-09-08T00:36:43Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
[[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Plagued Warden]]
== Trivia ==
* If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list.
{{Navbox/Locations}}
[[Category:Locations]]
fdfc9be0ef1ff569131403b669f0f8a3dacda60c
1516
1507
2025-09-08T00:40:01Z
Sharparam
284703
/* Enemies */ Add Mrgud to enemies
wikitext
text/x-wiki
[[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
* [[Mrgud]]
=== Bosses ===
* [[Plagued Warden]]
== Trivia ==
* If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list.
{{Navbox/Locations}}
[[Category:Locations]]
f55783066b7d0960a9ee313da31dea7ab64fd1f9
Rain District
0
355
1508
473
2025-09-08T00:37:03Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Sewers ==
[[File:Rain District (Sewers).png|thumb|The rain district sewers as depicted in the game's relocation menu.|alt=Artwork showing the sewers in the rain district.]]
{{Quote
| A maze of flooded tunnels with murky water that echoes the constant patter of rain from above, walls slick with moss and grime, and a stench of decay that ingles with the distant roar of rushing water and the occasional scurrying of unseen creatures.
}}
{{clear}}
== Center ==
[[File:Rain District (Center).png|thumb|The rain district center as depicted in the game's relocation menu.|alt=Artwork showing the center room in the rain district.]]
{{Quote
| A residential area lying in perpetual rain. Its dilapidated buildings stand silent and forlorn, windows shattered, rooftops caved in, walls rotting with mold. The relentless downpour
}}
== NPCs ==
* [[The Handler]]
{{Navbox/Locations}}
[[Category:Locations]]
3e8f6f71cd2e707bcc1f0c9f0085caf6646ecbe4
Deluge
0
356
1509
475
2025-09-08T00:37:22Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
[[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting.
}}
== NPCs ==
* [[The Handler]]
{{Navbox/Locations}}
[[Category:Locations]]
84a22cc9c4203bbad070d834c63d1920578d596c
Asylum
0
357
1510
1498
2025-09-08T00:37:38Z
Sharparam
284703
/* NPCs */ Add handler
wikitext
text/x-wiki
[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls.
}}
== NPCs ==
* [[The Handler]]
* [[Inquisitor Commander Alexius]]
== Enemies ==
=== Bosses ===
* [[Plagued Nemesis]]
{{Navbox/Locations}}
[[Category:Locations]]
ec100e3106294481f735b21d155821c4ad934b97
Upper Blocks
0
358
1511
1499
2025-09-08T00:38:00Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
[[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Silicon Visage]]
{{Navbox/Locations}}
[[Category:Locations]]
ecdd4ff8e21d9d90d6abfd5d13a922968c39d7fb
Uranopolis
0
352
1512
1500
2025-09-08T00:38:25Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
'''Uranopolis''' is a location in {{BFF}}.
== Sub-locations ==
Uranopolis consists of two sub-locations: Tower Complex and Lone Tower.
=== Tower Complex ===
{{Main|Uranopolis/Tower Complex}}
[[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]]
The '''Tower Complex''' is the first sub-location encountered by the player.
{{clear}}
=== Lone Tower ===
[[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]]
The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here.
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Nurgei the Blademaster]]
{{Navbox/Locations}}
[[Category:Locations]]
43d298324f3588187322a2d7b665431749820817
Ghost Town
0
359
1513
1501
2025-09-08T00:38:58Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
== Floor 13 ==
[[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]]
{{Quote
| Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past.
}}
{{clear}}
== Floor 1 ==
[[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]]
{{Quote
| A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Plagued Revenant]]
{{Navbox/Locations}}
[[Category:Locations]]
b83bfb21d2791b19b31b04aee2cf572681057141
Desert
0
361
1515
485
2025-09-08T00:39:32Z
Sharparam
284703
Add NPC list
wikitext
text/x-wiki
[[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]]
'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally broken by the distant echo of the city's hum.
}}
== NPCs ==
* [[The Handler]]
{{Navbox/Locations}}
[[Category:Locations]]
ad73e08b17c1c5fda6c74f15478053d32d80cd8e
Bosses
0
539
1517
867
2025-09-08T00:48:09Z
Sharparam
284703
Add overview
wikitext
text/x-wiki
'''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated.
== Overview ==
There are four mandatory bosses in the game that must be defeated in order to reach an [[Endings|ending]]:
* [[Nurgei the Blademaster]] (to access one of the two [[Recalibration|recalibrations]])
* [[Wormlord]] (to access the [[Anomaly]])
* [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] (to access the labyrinth in the anomaly)
* [[Royal Division Captain Yulia & Vermillion Mirage]] (the final boss, required to end the game)
If going for the [[Endings#Skull Knight|Skull Knight ending]], defeating [[Unknown (boss)|Unknown]] is required.
All other bosses are optional, although it is recommended to kill at least [[Konrad the Traitor]] to get access to the [[Homunculus Mirage]].
{{Navbox/Bosses}}
[[Category:Bosses]]
4a384386aedf4eb9640b778902d511953b6b61ae
Blacksmith
0
914
1518
2025-09-08T01:00:13Z
Sharparam
284703
Redirected page to [[The Handler]]
wikitext
text/x-wiki
#REDIRECT [[The Handler]]
88b800514a0b691d707ee19ba584e637d3655f46
Anomaly (location)
0
363
1519
1361
2025-09-08T01:02:00Z
Sharparam
284703
Add gallery
wikitext
text/x-wiki
[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]]
The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]]
== Gallery ==
<gallery>
File:Labyrinth_solution.jpg|Solution for the labyrinth.|alt=Screenshot showing a part of the labyrinth in the Anomaly area. The entrance is on the left, with a path to the center on the right drawn with a white line.
</gallery>
{{Navbox/Locations}}
[[Category:Locations]]
3d87ec3fa38d389e039733d0f695e0ee5f9b9be2
File:Labyrinth solution.jpg
6
915
1520
2025-09-08T01:02:20Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Module:Recipe
828
916
1521
2025-09-08T15:18:08Z
Sharparam
284703
Created page with "local html = mw.html local getArgs = require('Module:Arguments').getArgs local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)' local function parse_result(args) local result = { name = args['result'], count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1 } if args['result_display'] then result.display = args['result_display'] else result.display = result.name end return result end lo..."
Scribunto
text/plain
local html = mw.html
local getArgs = require('Module:Arguments').getArgs
local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)'
local function parse_result(args)
local result = {
name = args['result'],
count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1
}
if args['result_display'] then
result.display = args['result_display']
else
result.display = result.name
end
return result
end
local function parse_ingredients(args)
local ingredients = {}
for k, v in pairs(args) do
local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN)
if ing_index then
ing_index = tonumber(ing_index) or 1
if not ingredients[ing_index] then
ingredients[ing_index] = {
count = 1
}
end
local ingredient = ingredients[ing_index]
if ing_prop == "" then
ingredient.name = v
if not ingredient.display then ingredient.display = v end
elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then
ingredient.count = tonumber(v) or 1
elseif ing_prop == "display" then
ingredient.display = v
end
end
end
return ingredients
end
local function parse_type(args)
if not args['type'] then return 'crafting' end
local i_type = string.lower(tostring(args['type']))
if string.match(i_type, '^manufactur') then
return 'manufacturing'
end
return 'crafting'
end
local function make_quantity(quantity)
return html.create('td')
:addClass('quantity')
:wikitext(quantity or 1)
end
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
local result = parse_result(args)
local ingredients = parse_ingredients(args)
local r_type = parse_type(args)
local ingredient_count = #ingredients
local result_cell = html.create('td')
:attr('rowspan', ingredient_count)
:wikitext(string.format("[[%s|%s]]", result.name, result.display))
local type_link
if r_type == "crafting" then
type_link = "[[Crafting]]"
else
type_link = "[[Manufacturing]]"
end
local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link)
local firstRow = html.create('tr')
local rows = { firstRow }
for i, ingredient in ipairs(ingredients) do
local td = html.create('td')
:wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display))
if i == 1 then
firstRow:node(td)
firstRow:node(make_quantity(ingredient.count))
else
local row = html.create('tr')
:node(td)
:node(make_quantity(ingredient.count))
rows[#rows + 1] = row
end
end
firstRow:node(result_cell):node(type_cell)
local tbody = html.create('tbody')
for _, row in ipairs(rows) do
tbody:node(row)
end
local tbl = html.create('table')
:addClass('wikitable')
:tag('thead')
:tag('tr')
:tag('th'):attr('colspan', 2):wikitext('Ingredients'):done()
:tag('th'):attr('colspan', 2):wikitext('Result'):done()
:tag('th'):attr('rowspan', 2):wikitext('Type'):done()
:done()
:tag('tr')
:tag('th'):wikitext('Item'):done()
:tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done()
:tag('th'):wikitext('Item'):done()
:tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done()
:done()
:done()
:node(tbody)
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles',
args = { src = 'Module:Recipe/styles.css' }
} .. tostring(tbl)
end
return p
d8042b98696516ad4aa6cbf1e30271f5ac6201cc
1524
1521
2025-09-08T15:25:02Z
Sharparam
284703
Fix result count not added
Scribunto
text/plain
local html = mw.html
local getArgs = require('Module:Arguments').getArgs
local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)'
local function parse_result(args)
local result = {
name = args['result'],
count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1
}
if args['result_display'] then
result.display = args['result_display']
else
result.display = result.name
end
return result
end
local function parse_ingredients(args)
local ingredients = {}
for k, v in pairs(args) do
local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN)
if ing_index then
ing_index = tonumber(ing_index) or 1
if not ingredients[ing_index] then
ingredients[ing_index] = {
count = 1
}
end
local ingredient = ingredients[ing_index]
if ing_prop == "" then
ingredient.name = v
if not ingredient.display then ingredient.display = v end
elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then
ingredient.count = tonumber(v) or 1
elseif ing_prop == "display" then
ingredient.display = v
end
end
end
return ingredients
end
local function parse_type(args)
if not args['type'] then return 'crafting' end
local i_type = string.lower(tostring(args['type']))
if string.match(i_type, '^manufactur') then
return 'manufacturing'
end
return 'crafting'
end
local function make_quantity(quantity)
return html.create('td')
:addClass('quantity')
:wikitext(quantity or 1)
end
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
local result = parse_result(args)
local ingredients = parse_ingredients(args)
local r_type = parse_type(args)
local ingredient_count = #ingredients
local result_cell = html.create('td')
:attr('rowspan', ingredient_count)
:wikitext(string.format("[[%s|%s]]", result.name, result.display))
local type_link
if r_type == "crafting" then
type_link = "[[Crafting]]"
else
type_link = "[[Manufacturing]]"
end
local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link)
local firstRow = html.create('tr')
local rows = { firstRow }
for i, ingredient in ipairs(ingredients) do
local td = html.create('td')
:wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display))
if i == 1 then
firstRow:node(td)
firstRow:node(make_quantity(ingredient.count))
else
local row = html.create('tr')
:node(td)
:node(make_quantity(ingredient.count))
rows[#rows + 1] = row
end
end
firstRow
:node(result_cell)
:node(make_quantity(result.count))
:node(type_cell)
local tbody = html.create('tbody')
for _, row in ipairs(rows) do
tbody:node(row)
end
local tbl = html.create('table')
:addClass('wikitable')
:tag('thead')
:tag('tr')
:tag('th'):attr('colspan', 2):wikitext('Ingredients'):done()
:tag('th'):attr('colspan', 2):wikitext('Result'):done()
:tag('th'):attr('rowspan', 2):wikitext('Type'):done()
:done()
:tag('tr')
:tag('th'):wikitext('Item'):done()
:tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done()
:tag('th'):wikitext('Item'):done()
:tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done()
:done()
:done()
:node(tbody)
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles',
args = { src = 'Module:Recipe/styles.css' }
} .. tostring(tbl)
end
return p
1c851a25897c5e7ae8af3beb0f33a19712254570
1525
1524
2025-09-08T15:26:45Z
Sharparam
284703
Fix result count not having rowspan and missing class on table
Scribunto
text/plain
local html = mw.html
local getArgs = require('Module:Arguments').getArgs
local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)'
local function parse_result(args)
local result = {
name = args['result'],
count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1
}
if args['result_display'] then
result.display = args['result_display']
else
result.display = result.name
end
return result
end
local function parse_ingredients(args)
local ingredients = {}
for k, v in pairs(args) do
local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN)
if ing_index then
ing_index = tonumber(ing_index) or 1
if not ingredients[ing_index] then
ingredients[ing_index] = {
count = 1
}
end
local ingredient = ingredients[ing_index]
if ing_prop == "" then
ingredient.name = v
if not ingredient.display then ingredient.display = v end
elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then
ingredient.count = tonumber(v) or 1
elseif ing_prop == "display" then
ingredient.display = v
end
end
end
return ingredients
end
local function parse_type(args)
if not args['type'] then return 'crafting' end
local i_type = string.lower(tostring(args['type']))
if string.match(i_type, '^manufactur') then
return 'manufacturing'
end
return 'crafting'
end
local function make_quantity(quantity)
return html.create('td')
:addClass('quantity')
:wikitext(quantity or 1)
end
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
local result = parse_result(args)
local ingredients = parse_ingredients(args)
local r_type = parse_type(args)
local ingredient_count = #ingredients
local result_cell = html.create('td')
:attr('rowspan', ingredient_count)
:wikitext(string.format("[[%s|%s]]", result.name, result.display))
local type_link
if r_type == "crafting" then
type_link = "[[Crafting]]"
else
type_link = "[[Manufacturing]]"
end
local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link)
local firstRow = html.create('tr')
local rows = { firstRow }
for i, ingredient in ipairs(ingredients) do
local td = html.create('td')
:wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display))
if i == 1 then
firstRow:node(td)
firstRow:node(make_quantity(ingredient.count))
else
local row = html.create('tr')
:node(td)
:node(make_quantity(ingredient.count))
rows[#rows + 1] = row
end
end
firstRow
:node(result_cell)
:node(make_quantity(result.count):attr('rowspan', ingredient_count))
:node(type_cell)
local tbody = html.create('tbody')
for _, row in ipairs(rows) do
tbody:node(row)
end
local tbl = html.create('table')
:addClass('wikitable')
:addClass('recipe')
:tag('thead')
:tag('tr')
:tag('th'):attr('colspan', 2):wikitext('Ingredients'):done()
:tag('th'):attr('colspan', 2):wikitext('Result'):done()
:tag('th'):attr('rowspan', 2):wikitext('Type'):done()
:done()
:tag('tr')
:tag('th'):wikitext('Item'):done()
:tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done()
:tag('th'):wikitext('Item'):done()
:tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done()
:done()
:done()
:node(tbody)
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles',
args = { src = 'Module:Recipe/styles.css' }
} .. tostring(tbl)
end
return p
004e67f47f4debd731fd681e73e5fdbca53f0b5d
1527
1525
2025-09-08T15:33:15Z
Sharparam
284703
Make table construction more readable
Scribunto
text/plain
local html = mw.html
local getArgs = require('Module:Arguments').getArgs
local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)'
local function parse_result(args)
local result = {
name = args['result'],
count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1
}
if args['result_display'] then
result.display = args['result_display']
else
result.display = result.name
end
return result
end
local function parse_ingredients(args)
local ingredients = {}
for k, v in pairs(args) do
local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN)
if ing_index then
ing_index = tonumber(ing_index) or 1
if not ingredients[ing_index] then
ingredients[ing_index] = {
count = 1
}
end
local ingredient = ingredients[ing_index]
if ing_prop == "" then
ingredient.name = v
if not ingredient.display then ingredient.display = v end
elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then
ingredient.count = tonumber(v) or 1
elseif ing_prop == "display" then
ingredient.display = v
end
end
end
return ingredients
end
local function parse_type(args)
if not args['type'] then return 'crafting' end
local i_type = string.lower(tostring(args['type']))
if string.match(i_type, '^manufactur') then
return 'manufacturing'
end
return 'crafting'
end
local function make_quantity(quantity)
return html.create('td')
:addClass('quantity')
:wikitext(quantity or 1)
end
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
local result = parse_result(args)
local ingredients = parse_ingredients(args)
local r_type = parse_type(args)
local ingredient_count = #ingredients
local result_cell = html.create('td')
:attr('rowspan', ingredient_count)
:wikitext(string.format("[[%s|%s]]", result.name, result.display))
local type_link
if r_type == "crafting" then
type_link = "[[Crafting]]"
else
type_link = "[[Manufacturing]]"
end
local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link)
local firstRow = html.create('tr')
local rows = { firstRow }
for i, ingredient in ipairs(ingredients) do
local td = html.create('td')
:wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display))
if i == 1 then
firstRow:node(td)
firstRow:node(make_quantity(ingredient.count))
else
local row = html.create('tr')
:node(td)
:node(make_quantity(ingredient.count))
rows[#rows + 1] = row
end
end
firstRow
:node(result_cell)
:node(make_quantity(result.count):attr('rowspan', ingredient_count))
:node(type_cell)
local tbody = html.create('tbody')
for _, row in ipairs(rows) do
tbody:node(row)
end
local thead = html.create('thead')
:tag('tr')
:tag('th'):attr('colspan', 2):wikitext('Ingredients'):done()
:tag('th'):attr('colspan', 2):wikitext('Result'):done()
:tag('th'):attr('rowspan', 2):wikitext('Type'):done()
:done()
:tag('tr')
:tag('th'):wikitext('Item'):done()
:tag('th')
:tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done()
:done()
:tag('th'):wikitext('Item'):done()
:tag('th')
:tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done()
:done()
:allDone()
local tbl = html.create('table')
:addClass('wikitable')
:addClass('recipe')
:node(thead)
:node(tbody)
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles',
args = { src = 'Module:Recipe/styles.css' }
} .. tostring(tbl)
end
return p
a728b87a48a6e8450149103101c31566087d1935
1528
1527
2025-09-08T15:41:29Z
Sharparam
284703
Fix weird table render bug
Scribunto
text/plain
local html = mw.html
local getArgs = require('Module:Arguments').getArgs
local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)'
local function parse_result(args)
local result = {
name = args['result'],
count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1
}
if args['result_display'] then
result.display = args['result_display']
else
result.display = result.name
end
return result
end
local function parse_ingredients(args)
local ingredients = {}
for k, v in pairs(args) do
local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN)
if ing_index then
ing_index = tonumber(ing_index) or 1
if not ingredients[ing_index] then
ingredients[ing_index] = {
count = 1
}
end
local ingredient = ingredients[ing_index]
if ing_prop == "" then
ingredient.name = v
if not ingredient.display then ingredient.display = v end
elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then
ingredient.count = tonumber(v) or 1
elseif ing_prop == "display" then
ingredient.display = v
end
end
end
return ingredients
end
local function parse_type(args)
if not args['type'] then return 'crafting' end
local i_type = string.lower(tostring(args['type']))
if string.match(i_type, '^manufactur') then
return 'manufacturing'
end
return 'crafting'
end
local function make_quantity(quantity)
return html.create('td')
:addClass('quantity')
:wikitext(quantity or 1)
end
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
local result = parse_result(args)
local ingredients = parse_ingredients(args)
local r_type = parse_type(args)
local ingredient_count = #ingredients
local result_cell = html.create('td')
:attr('rowspan', ingredient_count)
:wikitext(string.format("[[%s|%s]]", result.name, result.display))
local type_link
if r_type == "crafting" then
type_link = "[[Crafting]]"
else
type_link = "[[Manufacturing]]"
end
local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link)
local firstRow = html.create('tr')
local rows = { firstRow }
for i, ingredient in ipairs(ingredients) do
local td = html.create('td')
:wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display))
if i == 1 then
firstRow:node(td)
firstRow:node(make_quantity(ingredient.count))
else
local row = html.create('tr')
:node(td)
:node(make_quantity(ingredient.count))
rows[#rows + 1] = row
end
end
firstRow
:node(result_cell)
:node(make_quantity(result.count):attr('rowspan', ingredient_count))
:node(type_cell)
local tbl = html.create('table')
:addClass('wikitable')
:addClass('recipe')
:tag('tr')
:tag('th'):attr('colspan', 2):wikitext('Ingredients'):done()
:tag('th'):attr('colspan', 2):wikitext('Result'):done()
:tag('th'):attr('rowspan', 2):wikitext('Type'):done()
:done()
:tag('tr')
:tag('th'):wikitext('Item'):done()
:tag('th')
:tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done()
:done()
:tag('th'):wikitext('Item'):done()
:tag('th')
:tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done()
:done()
:done()
for _, row in ipairs(rows) do
tbl:node(row)
end
return mw.getCurrentFrame():extensionTag {
name = 'templatestyles',
args = { src = 'Module:Recipe/styles.css' }
} .. tostring(tbl)
end
return p
65eb71beee89a329f11e0315759e7fa99d0ae2d2
Module:Recipe/doc
828
917
1522
2025-09-08T15:22:16Z
Sharparam
284703
Created page with "This module should not be used directly, instead use it via the {{tl|Recipe}} template. == Styles == * [[Module:Recipe/styles.css]] == Test cases == === Simple single ingredient recipe === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} </syntaxhighlight> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|ma..."
wikitext
text/x-wiki
This module should not be used directly, instead use it via the {{tl|Recipe}} template.
== Styles ==
* [[Module:Recipe/styles.css]]
== Test cases ==
=== Simple single ingredient recipe ===
<syntaxhighlight lang="wikitext">
{{#invoke:Recipe|main
|result = Copper Ingot
|ingredient = Copper Ore
}}
</syntaxhighlight>
{{#invoke:Recipe|main
|result = Copper Ingot
|ingredient = Copper Ore
}}
=== Multiple ingredients ===
<syntaxhighlight lang="wikitext">
{{#invoke:Recipe|main
|result = Big Item
|ingredient1 = Small Item
|ingredient2 = Medium Item
}}
</syntaxhighlight>
{{#invoke:Recipe|main
|result = Big Item
|ingredient1 = Small Item
|ingredient2 = Medium Item
}}
<includeonly>{{Sandbox other||[[Category:Module]]}}</includeonly><!--
--><noinclude>[[Category:Module documentation pages]]</noinclude>
924dabd9b5ce88588b5468b5e3a7e93320fff6df
1526
1522
2025-09-08T15:30:04Z
Sharparam
284703
Fix category
wikitext
text/x-wiki
This module should not be used directly, instead use it via the {{tl|Recipe}} template.
== Styles ==
* [[Module:Recipe/styles.css]]
== Test cases ==
=== Simple single ingredient recipe ===
<syntaxhighlight lang="wikitext">
{{#invoke:Recipe|main
|result = Copper Ingot
|ingredient = Copper Ore
}}
</syntaxhighlight>
{{#invoke:Recipe|main
|result = Copper Ingot
|ingredient = Copper Ore
}}
=== Multiple ingredients ===
<syntaxhighlight lang="wikitext">
{{#invoke:Recipe|main
|result = Big Item
|ingredient1 = Small Item
|ingredient2 = Medium Item
}}
</syntaxhighlight>
{{#invoke:Recipe|main
|result = Big Item
|ingredient1 = Small Item
|ingredient2 = Medium Item
}}
<includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!--
--><noinclude>[[Category:Module documentation pages]]</noinclude>
282fd35889589b1a3259a62fa0b2a439cf3ac551
Module:Recipe/styles.css
828
918
1523
2025-09-08T15:22:41Z
Sharparam
284703
Created page with "table.recipe td.quantity { text-align: right; }"
sanitized-css
text/css
table.recipe td.quantity {
text-align: right;
}
6c91e0a24445782d77a41927c93fcea5e8999f01
Template:Recipe
10
919
1529
2025-09-08T15:42:17Z
Sharparam
284703
Created page with "<includeonly>{{#invoke:Recipe|main}}</includeonly><!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:Recipe|main}}</includeonly><!--
--><noinclude>{{Documentation}}</noinclude>
60f7d633c7b254e0cc19de5121aa901700e7462e
Template:Recipe/doc
10
920
1530
2025-09-08T15:46:24Z
Sharparam
284703
Created page with "== Examples == === Simple recipe with single ingredient === <syntaxhighlight lang="wikitext"> {{Recipe | result = Copper Ingot | ingredient = Copper Ore }} </syntaxhighlight> {{Recipe | result = Copper Ingot | ingredient = Copper Ore }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{Recipe | result = Potion | ingredient1 = Water | ingredient2 = Flask }} </syntaxhighlight> {{Recipe | result = Potion | ingredient1 = Water | ingredient2 = Flask }} ===..."
wikitext
text/x-wiki
== Examples ==
=== Simple recipe with single ingredient ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Copper Ingot
| ingredient = Copper Ore
}}
</syntaxhighlight>
{{Recipe
| result = Copper Ingot
| ingredient = Copper Ore
}}
=== Multiple ingredients ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Potion
| ingredient1 = Water
| ingredient2 = Flask
}}
</syntaxhighlight>
{{Recipe
| result = Potion
| ingredient1 = Water
| ingredient2 = Flask
}}
=== Manufacturing recipe ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Fancy Stone
| ingredient = Regular Stone
| type = manufacturing
}}
</syntaxhighlight>
{{Recipe
| result = Fancy Stone
| ingredient = Regular Stone
| type = manufacturing
}}
=== Quantities ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Arrow
| result_quantity = 10
| ingredient1 = Stone
| ingredient1_quantity = 5
| ingredient2 = Wood
| ingredient2_quantity = 2
| ingredient3 = Feather
| ingredient3_quantity = 10
| type = crafting
}}
</syntaxhighlight>
{{Recipe
| result = Arrow
| result_quantity = 10
| ingredient1 = Stone
| ingredient1_quantity = 5
| ingredient2 = Wood
| ingredient2_quantity = 2
| ingredient3 = Feather
| ingredient3_quantity = 10
| type = crafting
}}
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
9217aa42d53ccd4fcdb294788416035335932bce
Hellicar's Maxims
0
379
1531
521
2025-09-12T21:28:51Z
Sharparam
284703
Add contents of the documents
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}.
== Overview ==
There are 3 parts to collect in the game.
{{Quote
|title=1/3
|If it should happen that you fell lost, turn right at the first gate and start again. Don't hesitate. What has been will always be. What is to come was never ours. The orchid has blossomed at exactly the same spot every year, so far, but, that is no guarantee. It might not make it back this year. The skywhales might lose their way in the swaying winds – the swallows never make it back home. We do not know. And in that lies the power of all the things that might be. The map grows old instantly, getting out of the same side of the bed tiresome. The almond's blossom often comes too soon. It is just stubborn determination. The walls of the Megalopolis were not designed to fall. The Angel thought this message would for ever last. Times is not carved out in a straight line. She is like the waves and fickle as the clouds. She comes, she goes, she weaves. If lost, it might not be a gate, but turn left again at the first sign. Turn and remain on the narrow and the straight.
}}
{{Quote
|title=2/3
|These are simply lives, with all their mechanisms and internal complexity, their mythology and their aspirations. Each flame a fire, each fire a small world as infinite as the imagination, as deep as the mesmerising sea. On the surface we are listening to the wind, the gentle ripples following on as waves, the clouds hovering with subtle menace, filled with intangible dimensions. There are few trees on the coast, struggling against the salty spray, growing with dogged determination. Their blossom is feeble. Their fruit bitter. Their leaves hard and brittle. The frost doesn't come as far as the coast. The snow is a vision and the bitter bite of the steady breeze that does feed the fire, that does reach down and nourish the soul. Simply lives within which a unique concoction of the very same days provide a million varied flavours. The ghosts are inhabitants of the past, the sky eels carry the ragged dreams of battles that are still to come. Leaves that fell from a tree, drops that left the ocean.
}}
{{Quote
|title=3/3
|The picture is tattered, taunted and all but torn. The sun struggles to deal with this particular dawn. It is early and it is still late. The clouds have formed, the rain beats a gentle rhythm in the glistening street. Water and oil, the rainbow bled into the ground. The light came and went, the land was savagely raped and the hills were gutted so that we might have slightly better lives. Paint a scene where the kestrel still hovers. Paint a scene where we might see what we have and what had once been.
}}
== Acquisition ==
Drops from [[enemies]] in the game.
* Asylum enemy with cape and sword+shield.
{{Navbox/Documents}}
[[Category:Lore]]
[[Category:Documents]]
b776e2d8e1d9c8c96e6aff603d38f0bdb6792bcc
Konrad's War Log
0
921
1532
2025-09-12T21:39:23Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] that can be found in {{BFF}}. == Overview == There are 5 different logs to collect. Based on the name and contents of the final log, it can be assumed that [[Konrad the Traitor]] is the author of these logs. {{Quote |title=1/5 |The first phase is complete and the transit points have been secured. The population is cooperative, so I have ensured the men keep their calm. There is talk of some kind of co..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] that can be found in {{BFF}}.
== Overview ==
There are 5 different logs to collect.
Based on the name and contents of the final log, it can be assumed that [[Konrad the Traitor]] is the author of these logs.
{{Quote
|title=1/5
|The first phase is complete and the transit points have been secured. The population is cooperative, so I have ensured the men keep their calm. There is talk of some kind of corruption at play, but all I can make out for now is that the citizens blame each other for everything, competing to show their loyalty to our presence.
Annoying.
}}
{{Quote
|title=2/5
|We now know the location of [[The Serdars|the Serdars]]. I was hoping for a reply from [[Yaroslav]], but the first dispatch hasn't returned. I am now sending another and reattempting the completion of the second phase. We've only arrived but the locals already tire me. So does the weather, if it can even be called that – the sky and the rain feel as if they are all the exhaust material of some unbearable manufacturing zone.
}}
{{Quote
|title=3/5
|Negotiations have failed, the second phase is now obsolete and three of our platoons have been obliterated by the Serdars. Yarsoslav has, I believe, gone mad. This was his army just as much as mine until this mess. I will never understand what leads others to betrayal… He butchered our men as if he never knew them. NOTE: I suspect [[The Administration|the Administration]] is also establishing their presence here.
}}
{{Quote
|title=4/5
|The citizens are at moments unmanageable, at others, docile and apathetic. As for us, I can no longer afford any expeditions below since I have only a few men remaining. Two full divisions are on their way for support, since news of our debacle at the gate has spread – I am afraid it is open war with the Serdars… There will be no easy resolution to whatever's going on. If only I could have a word with Yaroslav myself, I'm sure he would see reason.
}}
{{Quote
|title=5/5
|We were ambushed yesterday in the temple we've set up camp in – yet it feels pathetic to say by whom. A single knight, wearing the grin of death! He would pass for a clown if he hadn't told me what he had. I will retire into what's left of the monastery to reconsider everything. The state of affairs is such that I'm sure the administration will soon step in. I would wish luck if it were anyone else venturing below, but I hope they meet what they deserve at Yaroslav's gate.
}}
{{Navbox/Documents}}
[[Category:Documents]]
d27a842a52d1cf714c1c4ced79de13cb39e49d8f
Helena's Diary Fragment
0
922
1533
2025-09-12T21:49:39Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}. == Overview == There are 5 fragments in the game. {{Quote |title=1/5 |When they arrived, they said they were looking for a traitor and those who betrayed them… Maybe the soldiers who came before? Still, I was curious about the new one… he was taller than all the soldiers he came with. He seemed handsome and his name sounded noble… [[Konrad the Traitor|Konrad]]. His men lost their way..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}.
== Overview ==
There are 5 fragments in the game.
{{Quote
|title=1/5
|When they arrived, they said they were looking for a traitor and those who betrayed them… Maybe the soldiers who came before? Still, I was curious about the new one… he was taller than all the soldiers he came with. He seemed handsome and his name sounded noble… [[Konrad the Traitor|Konrad]]. His men lost their way when the strange knight with a face like a skull{{note|Likely the [[Skull Knight]].}} joined them in their temple… A fight broke out and all we could hear was the slaughter inside. Konrad survived and left then but something was strange. I wonder where he is. I don't even know him but I hope he's alive and well.
}}
{{Quote
|title=2/5
|Things were becoming more chaotic and if that wasn't enough, more soldiers arrived. These were not only looking for their rebel, but they also seemed to be obsessing over the area beyond the [[Machinarium]], just like the ones Konrad was looking for. Soon, even more of them showed up and they were the exact opposite of what Konrad was like. Big bulks of metal, bald and brutal. They seemed to lose track of the time just like the rest of us though and when they lost their patience… some things are best left unsaid.
}}
{{Quote
|title=3/5
|We were given shovels to clean the neighborhood and pile everything up… the rubble and the dead in their containers. We then moved this to a nearby site where other piles were being incinerated. As I did what I was told, I felt like I had so many narrow escapes. Every thread to my life seemed to boost my eagerness to survive. Things lose sense by the day and this confusion seems to be crippling the invaders as well. I hope we can find a way to leave soon so we can just put all of this behind us.
}}
{{Quote
|title=4/5
|Just when I thought things couldn't get any worse, they brought their monks and scribes. Words cannot describe what's going on. One moment they completely stomp out the people from a certain building, the next, it's as if the building has been abandoned for… decades? And then later in the week, the lights in it go on. I swear I saw someone looking out at me from inside one night.
}}
{{Quote
|title=5/5
|The person in the window waved at me again last night. Maybe it's someone they spared during the raid? My ex secretary says the days now overlap. Yesterday feels like tomorrow, and now feels like something that happened a week ago. Perhaps all the things [[Feigenbaum]] played with are finally catching up with us. The hunger however is now the only thing we worry about.
}}
== Notes ==
{{Notelist}}
{{Navbox/Documents}}
[[Category:Documents]]
9b300b89df13f885be3a2cb1187586cd95148ebc
Guiscard's Manifest
0
923
1534
2025-09-12T21:56:18Z
Sharparam
284703
Created page with "'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}. == Overview == There are 3 parts in the game. {{Quote |title=1/3 |Those surrounded by comfort wallow in excesses, disturbed only by the most accidental of anxieties until an event such as this – and once that opulence comes into jeopardy, other extremes become priorities – flight, retaining all that was accumulated on the backs of others and if necessary, the instant siding with the inv..."
wikitext
text/x-wiki
'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}.
== Overview ==
There are 3 parts in the game.
{{Quote
|title=1/3
|Those surrounded by comfort wallow in excesses, disturbed only by the most accidental of anxieties until an event such as this – and once that opulence comes into jeopardy, other extremes become priorities – flight, retaining all that was accumulated on the backs of others and if necessary, the instant siding with the invader, to keep the honey flowing. Existence at one point becomes only the pursuit of more.
}}
{{Quote
|title=2/3
|Those however who are in general condemned to suffer, who struggle even in times that are deemed good for others, must again rely on numbness and intoxication to see through it all. These unfortunate misers, used to being accused by the previously described for everything and anything, then fall even lower, to the level of blaming each other for how things have turned out instead of the foreign enemy or their previous rulers – and when that is done, they go even lower. Where they will once again kneel and obey, for a dog may have a preference for one master over another, but his base loyalty can always be bought with the promise of mere survival.
}}
{{Quote
|title=3/3
|To be a hunter, a whaler, an officer, or a doctor, and to remain so only to not lose one's livelihood. We should strive however for an era in which none of us have exclusive spheres of activity, where each can become accomplished in any branch one wishes, and where the polis regulates the excesses of necessity, thus making it possible to do one thing today and another tomorrow – to hunt in the morning, to sail in the afternoon, to administrate accordingly in the evening, heal and nurture after dinner, without ever having to confine one to the base rules of surviving – but to strive for a life filled with the blossoms of labor and inspiration.
}}
{{Navbox/Documents}}
[[Category:Documents]]
3a9e9b2b4ef93abeb51e38c0a90a4dfbe0496cab
Monastery Observation
0
924
1535
2025-09-12T22:01:55Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found in [[Monastery|the Monastery]] in {{BFF}}. == Overview == {{Quote |Standing at the top of the cliff, a derelict monastery. An anachronistic island in a sea of decaying technology. The surrounding residential structure looms oppressively, its vast expanse of concrete and rusted metal interwoven with a labyrinth of cables. Everything is draped in a strange, sickly moss. An eerie silence h..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found in [[Monastery|the Monastery]] in {{BFF}}.
== Overview ==
{{Quote
|Standing at the top of the cliff, a derelict monastery. An anachronistic island in a sea of decaying technology. The surrounding residential structure looms oppressively, its vast expanse of concrete and rusted metal interwoven with a labyrinth of cables. Everything is draped in a strange, sickly moss. An eerie silence hung in the air, broken only by the distant hum of [[The Megastructure|the megastructure]]. The moss, with its unsettling, almost sentient presence, clung to the remnants of the past, casting a malign shadow over this forgotten place. Each step towards the monastery feels like a descent into madness, the boundaries between the organic and the artificial blurring in the twilight of a world long caving in on itself. It's hard to tell what belongs to what time any more. The only compass here is the pull of the anomaly's core.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
4fc50ecb141e32b0853c77bcbfcb45b95e8de097
Monastery Impression
0
370
1536
503
2025-09-12T22:02:24Z
Sharparam
284703
Add needs location template
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found at [[Monastery|the Monastery]] in {{BFF}}.
== Overview ==
{{Quote
| Venturing into the anomalous zone at the edge of this crumbling colony, I was enveloped by a world devoid of sense, dominated by the cold, relentless sprawl of concrete and rebar. Rusted metal carcasses of buildings stood as grim monuments to a forgotten era, their skeletal frames interwoven with the vestiges of ancient technology and tangled cables that snaked across the ground like decaying veins. The omnipresent drone of [[Omnistructure|the structure]] reverberated through the air, a constant reminder of its oppressive presence – here, louder than anywhere before. As I picked my way through the debris, I could sense the weight of the past pressing in, the technological remnants whispering secrets of a world that once thrived but now lay silent and corroded.
}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
e49ac2d8ade62fa55c9473f1cf8f9d220a49aece
Dreadguard (data log)
0
925
1537
2025-09-12T22:05:30Z
Sharparam
284703
Created page with "{{Needs location}} '''Dreadguard''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |What are these [[Dreadguard (NPC)|]] made of… not a flinch, not a single discernable sign of discomfort. I know their training is gruelling, but this level of fortitude goes beyond anything I've seen. }} == See also == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] {{Navbox/Data logs}} [[Category:Data logs]]"
wikitext
text/x-wiki
{{Needs location}}
'''Dreadguard''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|What are these [[Dreadguard (NPC)|Dreadguard]] made of… not a flinch, not a single discernable sign of discomfort. I know their training is gruelling, but this level of fortitude goes beyond anything I've seen.
}}
== See also ==
* [[Dreadguard (NPC)]]
* [[Dreadguard (enemy)]]
{{Navbox/Data logs}}
[[Category:Data logs]]
b7524b233cab17929408120d64a1f2e17254b1d0
Template:Navbox/Data logs
10
290
1538
367
2025-09-12T22:05:55Z
Sharparam
284703
Fix link to dreadguard data log
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard (data log)|Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Vermillion]]
* [[A Broken Reality]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[Understanding]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
3cfff727c61ad5d8c3fb1dab5f8cd372909c1190
Inquisitors
0
926
1539
2025-09-12T22:08:04Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |I know [[The Inquisition|the Inquisition]] is fanatical. It seems their way of dealing with this crippling atmosphere is by embracing and revelling in it. In their body language, you can tell they find enjoyment in this. They know they are meant to be here, they know they are witnessing a miracle. They perceive all adversity as a symptom of their growing faith. }} {{N..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|I know [[The Inquisition|the Inquisition]] is fanatical. It seems their way of dealing with this crippling atmosphere is by embracing and revelling in it. In their body language, you can tell they find enjoyment in this. They know they are meant to be here, they know they are witnessing a miracle. They perceive all adversity as a symptom of their growing faith.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
519fb60a07fc00c20d825353d3badb1ed4d4de7c
Eternal Rain
0
927
1540
2025-09-12T22:09:22Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The rain here is calming. The noise drowns everything else out. The creaking and humming of the grating concrete and rebar are all drowned out by the shattering of raindrops. Maybe one could dream here. }} {{Navbox/Data logs}} [[Category:Data logs]]"
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|The rain here is calming. The noise drowns everything else out. The creaking and humming of the grating concrete and rebar are all drowned out by the shattering of raindrops. Maybe one could dream here.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
b69b9bc7af3a2e0771d51d611cec3e7210104bd4
Habitation
0
928
1541
2025-09-12T22:11:16Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |This must have been intended as a densely populated area – probably for a lower social class. But there is a certain charm in the crammed alleyways and staircases leading from one potential life to another. Lives piled one on top of another. Lives affecting one another. In other places of [[The Omnistructure|the structure]] you'd be lucky to see another person in mon..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|This must have been intended as a densely populated area – probably for a lower social class. But there is a certain charm in the crammed alleyways and staircases leading from one potential life to another. Lives piled one on top of another. Lives affecting one another. In other places of [[The Omnistructure|the structure]] you'd be lucky to see another person in months… sometimes years…
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
1fb43ef211ccc8342b0c2e3a86088189bda2da0e
Industrial Silence
0
929
1542
2025-09-12T22:13:07Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The landscape here is dominated by industrial remnants and utilitarian constructions. Scaffolding from long-abandoned projects entwines with the silhouettes of heavy machinery, their rusting forms standing as silent sentinels to a bygone era. The structures, though now dilapidated, suggest a time when this place might have been vibrant and bustling. The structure here..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|The landscape here is dominated by industrial remnants and utilitarian constructions. Scaffolding from long-abandoned projects entwines with the silhouettes of heavy machinery, their rusting forms standing as silent sentinels to a bygone era. The structures, though now dilapidated, suggest a time when this place might have been vibrant and bustling. The structure here must be rather old, no signs of builders influencing the landscape. Once, perhaps, this locale could have been a harmonious blend of functionality and beauty.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
333247b7debd32368f96fce2d4312eb6e1db7d56
Encrypted Radiation
0
930
1543
2025-09-12T22:14:46Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Though the content remains entirely indiscernible, analysis of the radiation suggested something. The knight's presence was a haunting mix of foreboding and sorrow, as if it bore a dire message wrapped in deep remorse. Its spectral form pulsed with this eerie energy, leaving an unsettling impression of a warning long past and a sorrowful history best heeded. }} {{Navb..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|Though the content remains entirely indiscernible, analysis of the radiation suggested something. The knight's presence was a haunting mix of foreboding and sorrow, as if it bore a dire message wrapped in deep remorse. Its spectral form pulsed with this eerie energy, leaving an unsettling impression of a warning long past and a sorrowful history best heeded.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
7143dc61895b739ecf8bcd40508983b342642832
The Deep Monastery
0
931
1544
2025-09-12T22:19:29Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |In the heart of [[Desert|the desert]], beneath the oppressive mist, stands an enormous, abandoned monastery, its once-grand structure now weathered and eroded by the relentless sands. Behind it, a vast and malignant labyrinth emerges from [[Anomaly|the anomaly]], a chaotic expanse where time and space are distorted beyond recognition. Straight lines no longer align; th..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|In the heart of [[Desert|the desert]], beneath the oppressive mist, stands an enormous, abandoned monastery, its once-grand structure now weathered and eroded by the relentless sands. Behind it, a vast and malignant labyrinth emerges from [[Anomaly|the anomaly]], a chaotic expanse where time and space are distorted beyond recognition. Straight lines no longer align; they twist and bend unpredictably. Matter here perpetually dissipates and crumbles, never quite vanishing, as if the space is caught in a continuous loop of decay. The immense radiation and the absence of any sense of causality render this environment inhospitable to most. The very fabric of reality seems to fracture, making survival impossible for all but the most resilient. Despite the inhospitable conditions, rumours persist of a handful of [[The Serdars|Serdars]] who have taken refuge in the monastery, braving the inhospitable surroundings and the malignant influence of the labyrinth.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
5f322820627894b90b0726ad7d1db3a7837028e7
Monolith
0
932
1545
2025-09-12T22:21:33Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |They say that deep within [[Desert|the desert]], there's an ancient, abandoned monastery standing solitary against the endless sands. The radiation there must be incomprehensible. No one could survive such an environment—any conscious mind would break apart instantly. Yet, whispers from those who dare to speak of it claim that [[the Serdars]], have somehow establishe..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|They say that deep within [[Desert|the desert]], there's an ancient, abandoned monastery standing solitary against the endless sands. The radiation there must be incomprehensible. No one could survive such an environment—any conscious mind would break apart instantly. Yet, whispers from those who dare to speak of it claim that [[the Serdars]], have somehow established a hold within the monastery.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
f80c637c7c0ac8d044f63faa9384b10008bc943d
Desert Whispers
0
933
1546
2025-09-12T22:25:42Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Whispers from [[Desert|the desert]] say that [[Yaroslav|Jaroslav]]{{sic|nolink=y}} has sent a chilling message to anyone venturing towards their domain. The message warns that anyone who dares march into the desert will confront their destiny amidst the ruins. Jaroslav's{{sic|nolink=y}} words are shrouded in dark foreboding, suggesting that the desert itself is a cruci..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|Whispers from [[Desert|the desert]] say that [[Yaroslav|Jaroslav]]{{sic|nolink=y}} has sent a chilling message to anyone venturing towards their domain. The message warns that anyone who dares march into the desert will confront their destiny amidst the ruins. Jaroslav's{{sic|nolink=y}} words are shrouded in dark foreboding, suggesting that the desert itself is a crucible of fate, where every step taken will lead to a reckoning with one's deepest fears and ultimate destiny. [[The Serdars]], it seems, have embraced the harsh, twisted reality of their environment, and their leader's message serves as a grim invitation to face the inexorable truth that awaits in the forsaken sands. They say the Serdar have turned against [[The Empire|the empire]].
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
83287ab7c0a22abdb169ed7e3d8de3d6c1edc9aa
Asylum (data log)
0
934
1547
2025-09-12T22:29:51Z
Sharparam
284703
Created page with "{{Needs location}} '''Asylum''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The night at [[Asylum|the asylum]] is suffused with an oppressive darkness, where shadows dance ominously across the walls of the forsaken facility. Within these grim corridors, the absence of any ethical code has allowed for the most abominable experiments on living creatures, their suffering amplified by the cold, indifferent machinery of the asylum. The air is thick with..."
wikitext
text/x-wiki
{{Needs location}}
'''Asylum''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|The night at [[Asylum|the asylum]] is suffused with an oppressive darkness, where shadows dance ominously across the walls of the forsaken facility. Within these grim corridors, the absence of any ethical code has allowed for the most abominable experiments on living creatures, their suffering amplified by the cold, indifferent machinery of the asylum. The air is thick with the stench of decay and chemical solvents, a nauseating mix that clings to everything. Dim, flickering lights reveal ghastly scenes—mangled forms and twisted apparatuses allude to a grotesque pursuit – it is unclear what is being pursued though. The asylum's eerie quiet is occasionally broken by the muffled cries and the dissonant hum of the experiments – either long past or yet to be conducted. The very essence of humanity seems to have been sacrificed here, replaced by a relentless drive for knowledge beyond what we should be allowed to know.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
25ce1dd3a390767e876067d62f9f773a38ccfde2
Terror
0
935
1548
2025-09-12T22:32:38Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |[[Asylum|The asylum's]] once sterile operating theaters now bear witness to grotesque amalgamations of flesh and metal, as madness seeks to forge a perverse harmony through unholy means. The stench of decay and chemicals pervades every corner, mingling with the metallic tang of blood and the acrid odor of fear. Amidst the flickering lights and shadowed corners, whisper..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|[[Asylum|The asylum's]] once sterile operating theaters now bear witness to grotesque amalgamations of flesh and metal, as madness seeks to forge a perverse harmony through unholy means. The stench of decay and chemicals pervades every corner, mingling with the metallic tang of blood and the acrid odor of fear. Amidst the flickering lights and shadowed corners, whispers speak of a deranged pursuit—an obsession with unlocking a cosmic order through abominable acts, where ethics have long been abandoned in favor of a twisted vision of divine symmetry. It's hard to tell who is more mad. The conductors or the patients. In some sense here, there is an achieved symmetry – a symmetry of torture.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
951bf305af5e8bd9414682762c5b55873b8c470a
The Deep
0
936
1549
2025-09-12T22:35:32Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Concrete and steel rise in chaotic, dream-like silhouettes, their shapes both unsettling an oddly familiar, as if shadows themselves have taken on a sapient quality. The buildings, though solid and tangible, have an otherworldly quality, reminiscent of fleeting dreams made manifest. Each structure seems to be a fragment of a once-ethereal vision, now crystallized into..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|Concrete and steel rise in chaotic, dream-like silhouettes, their shapes both unsettling an oddly familiar, as if shadows themselves have taken on a sapient quality. The buildings, though solid and tangible, have an otherworldly quality, reminiscent of fleeting dreams made manifest. Each structure seems to be a fragment of a once-ethereal vision, now crystallized into grim, imposing shapes that loom in the perpetual twilight. The city is an eerie, tangible manifestation of shadows given form, embodying the eerie, disjointed nature of dreams that have seeped down from above and coalesced into a haunting, shadowy reality.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
2b8e4ee804705036e23de0293db9889a9a6a77e4
A Vision
0
937
1550
2025-09-12T22:37:30Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |This place, a sprawling labyrinth of vast concrete walls and tangled cables, swallows everything that enters its grasp. Those who are consumed by the city are not lost to oblivion; instead, they linger as perpetual echoes, their shadows etched into the cold, unfeeling concrete. The walls themselves seem alive with these ghostly traces, their forms distorted and eternal..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|This place, a sprawling labyrinth of vast concrete walls and tangled cables, swallows everything that enters its grasp. Those who are consumed by the city are not lost to oblivion; instead, they linger as perpetual echoes, their shadows etched into the cold, unfeeling concrete. The walls themselves seem alive with these ghostly traces, their forms distorted and eternal, a testament to lives that have been frozen in an unending state of limbo.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
8afecad3b45807c4c24b4e7b9f0d503e324a5e2a
The Drone
0
938
1551
2025-09-12T22:40:09Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The city's hum is a relentless, grating sound, a discordant symphony that combines the despair of lives eternally trapped and the unfulfilled potential of what could have been. It resonates through the city's structures, a reminder of the tragedy that has befallen it. The once-vibrant reality has calcified into a grotesque parody of itself, consumed by its own anomalou..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|The city's hum is a relentless, grating sound, a discordant symphony that combines the despair of lives eternally trapped and the unfulfilled potential of what could have been. It resonates through the city's structures, a reminder of the tragedy that has befallen it. The once-vibrant reality has calcified into a grotesque parody of itself, consumed by its own anomalous nature. The city's sapience, once a thriving essence of life and purpose, has been devoured by its own insatiable hunger, leaving behind only a haunting echo of what was lost. This relentless consumption has turned the city into a monument to its own tragedy, a place where sense and meaning have been irretrievably lost to the void.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
6b3bff6e46a7f7fc8d1d47dcca48ad3d1eec976d
Inhabitants
0
381
1552
1428
2025-09-12T22:40:42Z
Sharparam
284703
Use needs location template instead of stub + needs coords
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}.
== Overview ==
{{Quote
|The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force.
}}
{{Navbox/Data logs}}
[[Category:Lore]]
[[Category:Data logs]]
99696204437b9f93e7efbd49bfdb4e5de2a6a8dc
Calcified Lives
0
939
1553
2025-09-12T22:42:38Z
Sharparam
284703
Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Many citizens have succumbed to a final, calcified state, their fates sealed in a claustrophobic stillness. These figures are trapped in a low-energy existence, frozen in the midst of their routines. Their forms are rigid and unchanging, as if the very essence of their being has been petrified by the oppressive atmosphere. Some of them, seemingly in a state of worship..."
wikitext
text/x-wiki
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|Many citizens have succumbed to a final, calcified state, their fates sealed in a claustrophobic stillness. These figures are trapped in a low-energy existence, frozen in the midst of their routines. Their forms are rigid and unchanging, as if the very essence of their being has been petrified by the oppressive atmosphere. Some of them, seemingly in a state of worship – or delirium, towards eternal nothingness.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
6fe361733296ddf87d7856d8925b22c10a94bd42
Manta Rays (data log)
0
940
1554
2025-09-12T22:45:19Z
Sharparam
284703
Created page with "{{Needs location}} '''Manta Rays''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Immense flying manta rays drift silently through the shadowed expanse, their presence both mesmerizing and unsettling. These creatures glide gracefully between the towering concrete structures, their wide, membranous wings casting eerie shadows on the walls below. Their movement is smooth and languid, almost ethereal, as if they are part of the city's surreal atmosphere..."
wikitext
text/x-wiki
{{Needs location}}
'''Manta Rays''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|Immense flying manta rays drift silently through the shadowed expanse, their presence both mesmerizing and unsettling. These creatures glide gracefully between the towering concrete structures, their wide, membranous wings casting eerie shadows on the walls below. Their movement is smooth and languid, almost ethereal, as if they are part of the city's surreal atmosphere rather than intrusions into it.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
ad2110737544d96d1aa04ddb0ada3606e90c3a3b
Template:Navbox/Data logs
10
290
1555
1538
2025-09-12T22:45:45Z
Sharparam
284703
Fix link to manta rays data log
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard (data log)|Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Vermillion]]
* [[A Broken Reality]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays (data log)|Manta Rays]]
* [[Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[Understanding]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
dc4e37240549a2d6c18c620e9cdacd8fa4312551
1556
1555
2025-09-12T22:46:17Z
Sharparam
284703
Fix link to anomaly data log
wikitext
text/x-wiki
<!-- The data logs should be listed in the order they appear in-game, not alphabetical -->
{{Navbox
| {{{1|}}}
| template = Navbox/Data logs
| title = [[Data logs]]
| list1 =
* [[Monastery Impression]]
* [[Monastery Observation]]
* [[Psychosis]]
* [[Heartbeat]]
* [[Dreadguard (data log)|Dreadguard]]
* [[Inquisitors]]
* [[Shadows in the Courtyard]]
* [[Eternal Rain]]
* [[Habitation]]
* [[Industrial Silence]]
* [[Encrypted Radiation]]
* [[Dust Sea]]
* [[The Deep Monastery]]
* [[Monolith]]
* [[Desert Whispers]]
* [[Desert Dream]]
* [[Shifting Sands]]
* [[Vermillion]]
* [[A Broken Reality]]
* [[Asylum (data log)|Asylum]]
* [[Terror]]
* [[Night Horror]]
* [[The Banshee]]
* [[Umbral City]]
* [[Call of the Void]]
* [[Serpentine Visions]]
* [[The Deep]]
* [[A Vision]]
* [[The Drone]]
* [[Inhabitants]]
* [[Silent Streets]]
* [[Calcified Lives]]
* [[Statues]]
* [[Manta Rays (data log)|Manta Rays]]
* [[Anomaly (data log)|Anomaly]]
* [[Unknown Limits]]
* [[Kaleidoscope of Dreams]]
* [[The Structure]]
* [[Understanding]]
* [[The Grave Predicament]]
* [[Intercepted Transmission]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
2dc573d37563e98478c01e48e8dea6f348c2bfc6
Anomaly (data log)
0
941
1557
2025-09-12T22:50:53Z
Sharparam
284703
Created page with "{{About|the [[Data logs|data log]]||Anomaly (disambiguation)}} {{Needs location}} '''Anomaly''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |[[Anomaly|The anomaly]] manifests as a colossal armillary sphere, an incomprehensible construct of metal rings and shifting geometries that perpetually expands and devours everything in its path. This sphere, a swirling vortex of distorted space-time, continuously grows outward, assimilating buildings, ideas, an..."
wikitext
text/x-wiki
{{About|the [[Data logs|data log]]||Anomaly (disambiguation)}}
{{Needs location}}
'''Anomaly''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|[[Anomaly|The anomaly]] manifests as a colossal armillary sphere, an incomprehensible construct of metal rings and shifting geometries that perpetually expands and devours everything in its path. This sphere, a swirling vortex of distorted space-time, continuously grows outward, assimilating buildings, ideas, and entire segments of [[the Omnistructure]] into its ever-changing structure. Its rings twist and rotate with a relentless, almost sentient motion, consuming and reshaping reality around them.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
a1e0814fac5a4d47fc64d57a2e893e485cddf724
Anomaly (disambiguation)
0
942
1558
2025-09-12T22:53:28Z
Sharparam
284703
Redirected page to [[Anomaly]]
wikitext
text/x-wiki
#REDIRECT [[Anomaly]]
c369f0f98957b3c2574876f7e5df8d9cd36ba461
Anomaly (location)
0
363
1559
1519
2025-09-12T22:53:54Z
Sharparam
284703
Sharparam renamed page [[Anomaly]] to [[Anomaly (location)]] without leaving a redirect: Disambiguate
wikitext
text/x-wiki
[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]]
The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]]
== Gallery ==
<gallery>
File:Labyrinth_solution.jpg|Solution for the labyrinth.|alt=Screenshot showing a part of the labyrinth in the Anomaly area. The entrance is on the left, with a path to the center on the right drawn with a white line.
</gallery>
{{Navbox/Locations}}
[[Category:Locations]]
3d87ec3fa38d389e039733d0f695e0ee5f9b9be2
1560
1559
2025-09-12T22:54:47Z
Sharparam
284703
Add about template
wikitext
text/x-wiki
{{About|the [[Locations|location]]||Anomaly (disambiguation)}}
[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]]
The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}.
{{Quote
| Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
=== Bosses ===
* [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]]
== Gallery ==
<gallery>
File:Labyrinth_solution.jpg|Solution for the labyrinth.|alt=Screenshot showing a part of the labyrinth in the Anomaly area. The entrance is on the left, with a path to the center on the right drawn with a white line.
</gallery>
{{Navbox/Locations}}
[[Category:Locations]]
8d6ea6a0bd2f7e7855c41e8e88705aa6ee9a0d2d
Template:Navbox/Locations
10
293
1561
1289
2025-09-12T22:55:13Z
Sharparam
284703
Fix link to anomaly location
wikitext
text/x-wiki
<!-- The locations are ordered in the way they are listed in-game in the relocation menu -->
{{Navbox
| template = Navbox/Locations
| title = [[Locations]]
| list1 =
* [[Monastery]]
** [[Monastery#Lower|Lower]]
** [[Monastery#Upper|Upper]]
* [[Blok 6147]]
* [[Rain District]]
** [[Rain District#Sewers|Sewers]]
** [[Rain District#Center|Center]]
* [[Deluge]]
* [[Asylum]]
* [[Upper Blocks]]
* [[Uranopolis]]
** [[Uranopolis#Tower Complex|Tower Complex]]
** [[Uranopolis#Lone Tower|Lone Tower]]
* [[Ghost Town]]
** [[Ghost Town#Floor 13|Floor 13]]
** [[Ghost Town#Floor 1|Floor 1]]
* [[Machinarium]]
* [[Desert]]
* [[Desert Mirage]]
* [[Anomaly (location)|Anomaly]]
* [[Unknown (location)|Unknown]]
* [[Vermillion Fields]]
** [[Vermillion Fields#Plaza|Plaza]]
** [[Vermillion Fields#Temple|Temple]]
}}<noinclude>
{{Documentation}}
[[Category:Navigation templates]]
</noinclude>
abc8e58e564632cf59e52482d1c53f18578b1e8d
Anomaly
0
943
1562
2025-09-12T22:55:55Z
Sharparam
284703
Created page with "__DISAMBIG__ == Common meanings == * [[Anomaly (location)]] * [[Anomaly (data log)]] {{Disambiguation}}"
wikitext
text/x-wiki
__DISAMBIG__
== Common meanings ==
* [[Anomaly (location)]]
* [[Anomaly (data log)]]
{{Disambiguation}}
896baede274df850033dd62591f21daa44b7d273
1563
1562
2025-09-12T22:56:19Z
Sharparam
284703
Add introduction
wikitext
text/x-wiki
__DISAMBIG__
'''Anomaly''' may refer to:
== Common meanings ==
* [[Anomaly (location)]]
* [[Anomaly (data log)]]
{{Disambiguation}}
56c479cbbdc3615fd59f08079dce10eabfd05c9e
The Structure
0
944
1564
2025-09-12T23:00:34Z
Sharparam
284703
Created page with "{{About|the [[Data logs|data log]]|the environment in which a majority of the game takes place|The Omnistructure}} {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The true nature of [[the Omnistructure]] is a tightly guarded secret, known to only a few and barely understood even by those who claim to grasp it. Attempting to comprehend its vast and enigmatic complexity is so daunting that it often drives those who tr..."
wikitext
text/x-wiki
{{About|the [[Data logs|data log]]|the environment in which a majority of the game takes place|The Omnistructure}}
{{Needs location}}
'''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|The true nature of [[the Omnistructure]] is a tightly guarded secret, known to only a few and barely understood even by those who claim to grasp it. Attempting to comprehend its vast and enigmatic complexity is so daunting that it often drives those who try to the brink of madness. Consequently, much of the research into the Omnistructure's nature is veiled in obscurity, with findings and progress shrouded in layers of secrecy and uncertainty.
}}
{{Navbox/Data logs}}
[[Category:Data logs]]
6260d2366eed67e54533371044fe5c076852b818
Dreadguard
0
945
1565
2025-09-12T23:10:22Z
Sharparam
284703
Created page with "__DISAMBIG__ '''Dreadguard''' may refer to: == Common meanings == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] * [[Dreadguarad (data log)]] {{Disambiguation}}"
wikitext
text/x-wiki
__DISAMBIG__
'''Dreadguard''' may refer to:
== Common meanings ==
* [[Dreadguard (NPC)]]
* [[Dreadguard (enemy)]]
* [[Dreadguarad (data log)]]
{{Disambiguation}}
802c97aef7c757ded9eb1cfd6bbd938f465df0b9
1566
1565
2025-09-12T23:10:35Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
__DISAMBIG__
'''Dreadguard''' may refer to:
== Common meanings ==
* [[Dreadguard (NPC)]]
* [[Dreadguard (enemy)]]
* [[Dreadguard (data log)]]
{{Disambiguation}}
daff31396c0e7cdc8a5575bbe11ff385e1dc3dec
Dreadguard (data log)
0
925
1567
1537
2025-09-12T23:11:18Z
Sharparam
284703
Add about template for disambiguation
wikitext
text/x-wiki
{{About|the [[Data logs|data log]]||Dreadguard (disambiguation)}}
{{Needs location}}
'''Dreadguard''' is a [[Data logs|data log]] in {{BFF}}.
== Overview ==
{{Quote
|What are these [[Dreadguard (NPC)|Dreadguard]] made of… not a flinch, not a single discernable sign of discomfort. I know their training is gruelling, but this level of fortitude goes beyond anything I've seen.
}}
== See also ==
* [[Dreadguard (NPC)]]
* [[Dreadguard (enemy)]]
{{Navbox/Data logs}}
[[Category:Data logs]]
70221f0a6c2be5edc5d65c4757e26b160ac00013
Dreadguard (disambiguation)
0
946
1568
2025-09-12T23:11:28Z
Sharparam
284703
Redirected page to [[Dreadguard]]
wikitext
text/x-wiki
#REDIRECT [[Dreadguard]]
8d7bcb54f0389c347d5b4e3f0f6fc39038ec6dc3
Bleak Faith: Forsaken Wiki/pages
0
5
1569
1355
2025-09-12T23:12:44Z
Sharparam
284703
Add link to lore page
wikitext
text/x-wiki
{{Main page box/start
| title = Useful wiki pages
| class = centered-content
}}
<div class="mp-links columns-2">
* {{MP link|Items|link=Items}}
* {{MP link|Enemies|link=Enemies}}
* {{MP link|NPCs|link=NPCs}}
* {{MP link|Locations|link=Locations}}
* {{MP link|Lore|link=Lore}}
</div>
{{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line -->
4410f18a121907d0872f3b4304e09239739595b2
Marrow
0
947
1570
2025-09-12T23:21:38Z
Sharparam
284703
Created page with "{{About|the weapon|the ability|Marrow (ability)}} {{Needs location}} {{Infobox/Weapon | image = Marrow (weapon).png | Type = Twinblade | Speed = Swift | Damage type = Sharp | Abilities = Marrow (ability),Bone Barrier | Mk_min = 3 | Mk3_Damage_min = 137 | Mk3_Damage_max = 141 }} '''{{PAGENAME}}''' is a [[Twinblades|twinblade weapon]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{About|the weapon|the ability|Marrow (ability)}}
{{Needs location}}
{{Infobox/Weapon
| image = Marrow (weapon).png
| Type = Twinblade
| Speed = Swift
| Damage type = Sharp
| Abilities = Marrow (ability),Bone Barrier
| Mk_min = 3
| Mk3_Damage_min = 137
| Mk3_Damage_max = 141
}}
'''{{PAGENAME}}''' is a [[Twinblades|twinblade weapon]] in {{BFF}}.
{{Navbox/Weapons}}
e2c903f6ce3a13c32a4eec7c2e147e3853ce4699
1575
1570
2025-09-12T23:44:34Z
Sharparam
284703
Update ability name
wikitext
text/x-wiki
{{About|the weapon|the ability|Marrow (ability)}}
{{Needs location}}
{{Infobox/Weapon
| image = Marrow (weapon).png
| Type = Twinblade
| Speed = Swift
| Damage type = Sharp
| Abilities = Marrow,Bone Barrier
| Mk_min = 3
| Mk3_Damage_min = 137
| Mk3_Damage_max = 141
}}
'''{{PAGENAME}}''' is a [[Twinblades|twinblade weapon]] in {{BFF}}.
{{Navbox/Weapons}}
e8ded381a75a0ed52bc39cfe57ca3870c374a33e
Template:Infobox/Weapon
10
451
1571
891
2025-09-12T23:22:11Z
Sharparam
284703
Improve passive and ability links
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@|@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@|@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
4445c1e03d8cded9694037701c935e0004037608
1574
1571
2025-09-12T23:43:38Z
Sharparam
284703
Use a template for ability link
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| pattern = * {{Ability link|@@@@}}
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
d5d23eaefabad807d97d7e6b0a478b1a64d94518
1576
1574
2025-09-12T23:47:36Z
Sharparam
284703
Use template parameter for ability list
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| template = Ability link
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
a7cec6f126ae4b4f1c22b8e47720e6fab2a190ea
1578
1576
2025-09-12T23:49:17Z
Sharparam
284703
Use better template for ability links
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| template = Ability link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
709ab3ef8fda5051b8aba6f4fa17630f591a8773
Template:Ability link
10
948
1572
2025-09-12T23:38:35Z
Sharparam
284703
Created page with "{{#switch:{{{1}}} | Marrow = [[Marrow (ability)|Marrow]] | #default = [[{{{1}}}]] }}<!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{#switch:{{{1}}}
| Marrow = [[Marrow (ability)|Marrow]]
| #default = [[{{{1}}}]]
}}<!--
--><noinclude>{{Documentation}}</noinclude>
c39cdb6ae0c8a5d81c0d85b2e6b4bae2bfb7c744
Template:Ability link/doc
10
949
1573
2025-09-12T23:42:48Z
Sharparam
284703
Created page with "Used to produce a link to an [[Abilities|ability]]. This is primarily useful to automatically handle cases where an ability shares a name with some other page, in which case the article for the ability is usually named with a " (ability)" suffix. == TemplateData == <templatedata> { "params": { "1": { "label": "Ability", "description": "The ability to link to", "example": "Marrow", "type": "line", "required": true } }, "description": "Generate a li..."
wikitext
text/x-wiki
Used to produce a link to an [[Abilities|ability]].
This is primarily useful to automatically handle cases where an ability shares a name with some other page, in which case the article for the ability is usually named with a " (ability)" suffix.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Ability",
"description": "The ability to link to",
"example": "Marrow",
"type": "line",
"required": true
}
},
"description": "Generate a link to an ability.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Ability link|Blade Dash}}</syntaxhighlight> → {{Ability link|Blade dash}}
* <syntaxhighlight lang="wikitext" inline>{{Ability link|Marrow}}</syntaxhighlight> → {{Ability link|Marrow}}
Note how in the "Marrow" example, the link goes to "Marrow (ability)" without having to specify it manually.
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
b7cc18628d99f464440f1358cdb8ff29759c790a
1587
1573
2025-09-13T00:03:29Z
Sharparam
284703
/* Examples */ Fix blade dash example
wikitext
text/x-wiki
Used to produce a link to an [[Abilities|ability]].
This is primarily useful to automatically handle cases where an ability shares a name with some other page, in which case the article for the ability is usually named with a " (ability)" suffix.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Ability",
"description": "The ability to link to",
"example": "Marrow",
"type": "line",
"required": true
}
},
"description": "Generate a link to an ability.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Ability link|Blade Dash}}</syntaxhighlight> → {{Ability link|Blade Dash}}
* <syntaxhighlight lang="wikitext" inline>{{Ability link|Marrow}}</syntaxhighlight> → {{Ability link|Marrow}}
Note how in the "Marrow" example, the link goes to "Marrow (ability)" without having to specify it manually.
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
c8f5da080e8ebe27d1e317cfee2963c1752dd571
Template:Ability link item
10
950
1577
2025-09-12T23:48:42Z
Sharparam
284703
Created page with "* {{Ability link|{{{1}}}}}<!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
* {{Ability link|{{{1}}}}}<!--
--><noinclude>{{Documentation}}</noinclude>
d357d99a640c1b615d8baad3b65ebbe2def15486
Template:Ability link item/doc
10
951
1579
2025-09-12T23:50:44Z
Sharparam
284703
Created page with "Used in [[:Category:Infobox templates|infobox templates]] for ability link lists. Not intended for usage elsewhere. <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
Used in [[:Category:Infobox templates|infobox templates]] for ability link lists. Not intended for usage elsewhere.
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
cd60abe8a158af756ecbe36cd2983bdecff37715
File:Marrow (weapon).png
6
952
1580
2025-09-12T23:51:56Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Marrow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Marrow
}}
== Licensing ==
{{License|game}}
ba777602a1ac564d62d83c7006fd995bade00fce
Marrow (ability)
0
953
1581
2025-09-12T23:54:56Z
Sharparam
284703
Created page with "{{About|the ability|the weapon|Marrow}} {{Infobox/Ability | title = Marrow | image = Marrow (ability).png | Description = Send forward a marrow snake which damages and ruptures all enemies that come in contact with it. 206 damage and additional 154 from [[Agility]] attribute per instance of damage for a total of 360 [[Sharp]] damage. | Cooldown = 25 | Cost = 60 }} '''Marrow''' is an [[Abilities|ability]] in {{BFF}} that can be found on the [[Marrow]] weapon. {{Navbox/A..."
wikitext
text/x-wiki
{{About|the ability|the weapon|Marrow}}
{{Infobox/Ability
| title = Marrow
| image = Marrow (ability).png
| Description = Send forward a marrow snake which damages and ruptures all enemies that come in contact with it.
206 damage and additional 154 from [[Agility]] attribute per instance of damage for a total of 360 [[Sharp]] damage.
| Cooldown = 25
| Cost = 60
}}
'''Marrow''' is an [[Abilities|ability]] in {{BFF}} that can be found on the [[Marrow]] weapon.
{{Navbox/Abilities}}
f6051ca012e67d0625759cf5a17a22736c920d1c
Template:Navbox/Abilities
10
578
1582
920
2025-09-12T23:55:14Z
Sharparam
284703
Add marrow ability
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = [[Abilities]]
| list1 =
* [[Blade Dash]]
* [[Divine Blessing]]
* [[Marrow (ability)|Marrow]]
* [[Whirlwind Strike]]
}}<noinclude>{{Documentation}}</noinclude>
a7532ede7ee4e5698b18ab647a57ed0d9c8b3a6f
1585
1582
2025-09-12T23:58:31Z
Sharparam
284703
Add bone barrier ability
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = [[Abilities]]
| list1 =
* [[Blade Dash]]
* [[Bone Barrier]]
* [[Divine Blessing]]
* [[Marrow (ability)|Marrow]]
* [[Whirlwind Strike]]
}}<noinclude>{{Documentation}}</noinclude>
1999c737dfabe0b3296b8ef5ab83fdcba1f3beec
File:Marrow (ability).png
6
954
1583
2025-09-12T23:56:19Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Marrow1
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Marrow1
}}
== Licensing ==
{{License|game}}
d12a981eec5ed7d9a1d28e96b83da4d179754574
Bone Barrier
0
955
1584
2025-09-12T23:58:10Z
Sharparam
284703
Created page with "{{Infobox/Ability | title = Bone Barrier | image = Bone Barrier (ability).png | Description = Creates a bone barrier around you, which damages and ruptures all enemies that come in contact with it. 131 damage and additional 98 from [[Agility]] attribute per instance of damage for a total of 229 [[Sharp]] damage. | Cooldown = 60 | Cost = 60 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}"
wikitext
text/x-wiki
{{Infobox/Ability
| title = Bone Barrier
| image = Bone Barrier (ability).png
| Description = Creates a bone barrier around you, which damages and ruptures all enemies that come in contact with it.
131 damage and additional 98 from [[Agility]] attribute per instance of damage for a total of 229 [[Sharp]] damage.
| Cooldown = 60
| Cost = 60
}}
'''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
54551d5092bd238ae37f87fb6108a654f6a7c33f
File:Bone Barrier (ability).png
6
956
1586
2025-09-12T23:59:09Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Marrow2
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_Marrow2
}}
== Licensing ==
{{License|game}}
feede77956a2fd35389f1e5b1fce8db8866fc1eb
Template:Infobox/Armor set
10
455
1588
675
2025-09-13T00:29:01Z
Sharparam
284703
Add support for Mk 0 and setting minimum Mk
wikitext
text/x-wiki
<includeonly><!--
-->{{#invoke:Infobox|main
|kind=armor-set
|sep=,
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Pieces, Stats
|Basic Info=Weight
|Pieces=Helmet,Pauldrons,Chestguard,Legguard,Gauntlets
|Helmet={{#if:{{{Helmet|}}}|[[{{{Helmet}}}]]}}
|Pauldrons={{#if:{{{Pauldrons|}}}|[[{{{Pauldrons}}}]]}}
|Chestguard={{#if:{{{Chestguard|}}}|[[{{{Chestguard}}}]]}}
|Legguard={{#if:{{{Legguard|}}}|[[{{{Legguard}}}]]}}
|Gauntlets={{#if:{{{Gauntlets|}}}|[[{{{Gauntlets}}}]]}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Sharp,Blunt,Technomancy
|Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
|Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
|Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
|Mk0_Sharp={{{Mk0_Sharp|???}}}
|Mk0_Blunt={{{Mk0_Blunt|???}}}
|Mk0_Technomancy={{{Mk0_Technomancy|???}}}
|Mk1_Sharp={{{Mk1_Sharp|???}}}
|Mk1_Blunt={{{Mk1_Blunt|???}}}
|Mk1_Technomancy={{{Mk1_Technomancy|???}}}
|Mk2_Sharp={{{Mk2_Sharp|???}}}
|Mk2_Blunt={{{Mk2_Blunt|???}}}
|Mk2_Technomancy={{{Mk2_Technomancy|???}}}
|Mk3_Sharp={{{Mk3_Sharp|???}}}
|Mk3_Blunt={{{Mk3_Blunt|???}}}
|Mk3_Technomancy={{{Mk3_Technomancy|???}}}
|Mk4_Sharp={{{Mk4_Sharp|???}}}
|Mk4_Blunt={{{Mk4_Blunt|???}}}
|Mk4_Technomancy={{{Mk4_Technomancy|???}}}
|Mk5_Sharp={{{Mk5_Sharp|???}}}
|Mk5_Blunt={{{Mk5_Blunt|???}}}
|Mk5_Technomancy={{{Mk5_Technomancy|???}}}
}}{{#if:{{NAMESPACE}}||[[Category:Armor sets]]}}</includeonly><noinclude>
{{Documentation}}[[Category:Infobox templates]]</noinclude>
7c1ef287755c498a7d24574f795db74af44164d2
Template:Infobox/Armor set/doc
10
456
1589
677
2025-09-13T00:31:26Z
Sharparam
284703
Add missing params in docs
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for an armor set",
"params": {
"image": {
"label": "Armor set image",
"description": "Name of the file used as the image for the armor set, should be at least 300 pixels wide.",
"required": true,
"example": "Cool armor set.png",
"type": "wiki-file-name"
},
"Weight": {
"label": "Armor set weight",
"description": "The weight class of the armor set.",
"required": true,
"example": "Light",
"type": "string"
},
"Helmet": {
"label": "Helmet piece",
"description": "The armor used for the helmet slot.",
"required": true,
"example": "Cool Helmet",
"type": "wiki-page-name"
},
"Pauldrons": {
"label": "Pauldrons piece",
"description": "The armor used for the pauldrons slot.",
"required": true,
"example": "Cool Pauldrons",
"type": "wiki-page-name"
},
"Chestguard": {
"label": "Chestguard piece",
"description": "The armor used for the chestguard slot.",
"required": true,
"example": "Cool Chestguard",
"type": "wiki-page-name"
},
"Legguard": {
"label": "Legguard piece",
"description": "The armor used for the legguard slot.",
"required": true,
"example": "Cool Legguard",
"type": "wiki-page-name"
},
"Gauntlets": {
"label": "Gauntlets piece",
"description": "The armor used for the gauntlets slot.",
"required": true,
"example": "Cool Gauntlets",
"type": "wiki-page-name"
},
"Mk_min": {
"label": "Minimum Mk",
"description": "Minimum Mk level the armor set can be found at",
"required": false,
"suggested": true,
"example": "3",
"default": "0",
"type": "number"
},
"Mk0_Sharp": {
"label": "Mk 0 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 0",
"required": true,
"example": "1",
"type": "number"
},
"Mk0_Blunt": {
"label": "Mk 0 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 0",
"required": true,
"example": "1",
"type": "number"
},
"Mk0_Technomancy": {
"label": "Mk 0 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 0",
"required": true,
"example": "1",
"type": "number"
},
"Mk1_Sharp": {
"label": "Mk 1 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Blunt": {
"label": "Mk 1 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Technomancy": {
"label": "Mk 1 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Sharp": {
"label": "Mk 2 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Blunt": {
"label": "Mk 2 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk2_Technomancy": {
"label": "Mk 2 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 2",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Sharp": {
"label": "Mk 3 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Blunt": {
"label": "Mk 3 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk3_Technomancy": {
"label": "Mk 3 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 3",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Sharp": {
"label": "Mk 4 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Blunt": {
"label": "Mk 4 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk4_Technomancy": {
"label": "Mk 4 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 4",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Sharp": {
"label": "Mk 5 sharp rating",
"description": "Total sharp defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Blunt": {
"label": "Mk 5 blunt rating",
"description": "Total blunt defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
},
"Mk5_Technomancy": {
"label": "Mk 5 technomancy rating",
"description": "Total technomancy defense rating for the full set at Mk 5",
"required": true,
"example": "5",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Armor set
| image = Awesome set.png
| title = Awesome set
| Weight = Heavy
| Helmet = Awesome Helmet
| Pauldrons = Awesome Pauldrons
| Chestguard = Awesome Chestguard
| Legguard = Awesome Legguard
| Gauntlets = Awesome Gauntlets
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Armor set
| image = Awesome set.png
| title = Awesome set
| Weight = Heavy
| Helmet = Awesome Helmet
| Pauldrons = Awesome Pauldrons
| Chestguard = Awesome Chestguard
| Legguard = Awesome Legguard
| Gauntlets = Awesome Gauntlets
| Mk1_Sharp = 1
| Mk1_Blunt = 2
| Mk1_Technomancy = 4
| Mk2_Sharp = 2
| Mk2_Blunt = 4
| Mk2_Technomancy = 8
| Mk3_Sharp = 4
| Mk3_Blunt = 8
| Mk3_Technomancy = 16
| Mk4_Sharp = 8
| Mk4_Blunt = 16
| Mk4_Technomancy = 32
| Mk5_Sharp = 16
| Mk5_Blunt = 32
| Mk5_Technomancy = 64
}}
</syntaxhighlight>
63b0ca611a0361adfe0782cc13f2a80410b5c5b2
Stalker
0
957
1590
2025-09-13T00:31:50Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Armor set | title = {{PAGENAME}} | image = Stalker (armor set).png | Helmet = Stalker's Hood | Chestguard = Stalker's Cuirass | Legguard = Stalker's Pants | Gauntlets = Stalker's Gloves }} '''Stalker''' is an [[Armor sets|armor set]] in {{BFF}}. {{Navbox/Armor}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Armor set
| title = {{PAGENAME}}
| image = Stalker (armor set).png
| Helmet = Stalker's Hood
| Chestguard = Stalker's Cuirass
| Legguard = Stalker's Pants
| Gauntlets = Stalker's Gloves
}}
'''Stalker''' is an [[Armor sets|armor set]] in {{BFF}}.
{{Navbox/Armor}}
9557181feaf758a44fdde490492d76e9b5e6886b
1593
1590
2025-09-13T00:37:23Z
Sharparam
284703
Add Mk 1 stats
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Armor set
| title = {{PAGENAME}}
| image = Stalker (armor set).png
| Helmet = Stalker's Hood
| Chestguard = Stalker's Cuirass
| Legguard = Stalker's Pants
| Gauntlets = Stalker's Gloves
| Mk_min = 1
| Mk1_Sharp = 1740
| Mk1_Blunt = 1894
| Mk1_Technomancy = 2428
}}
'''Stalker''' is an [[Armor sets|armor set]] in {{BFF}}.
{{Navbox/Armor}}
2f2d7ce5ce0f99cae1ec2aac2a6417188ff049b2
File:Stalker (armor set).png
6
958
1591
2025-09-13T00:33:19Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
1592
1591
2025-09-13T00:35:08Z
Sharparam
284703
Sharparam uploaded a new version of [[File:Stalker (armor set).png]]
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Mutated Ghoul
0
552
1594
865
2025-09-13T00:43:41Z
Sharparam
284703
Update image link
wikitext
text/x-wiki
{{Infobox/Boss
| image = Mutated Ghoul (boss).png
}}
'''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}.
== Location ==
{{coords|6937.36|-64861.39|-17736.47}} (approximate)
Located in a big grass field at the bottom of the [[Monastery]].
== Drops ==
* [[Anomalous Fragment]] (only in [[NG+]])
{{Navbox/Bosses}}
2fec400e2da1a3a299f24e03158d8f5786e5cf02
File:Mutated Ghoul (boss).png
6
959
1595
2025-09-13T00:43:57Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
MediaWiki:Sidebar
8
324
1596
958
2025-09-13T00:45:22Z
Sharparam
284703
Add link to lore
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** Special:NewFiles|New files
** randompage-url|randompage
* Bleak Faith
** Items
** Locations
** NPCs
** Enemies
** Bosses
** Lore
* sidebar-customizing-wiki
** MediaWiki:Sidebar|sidebar-edit-sidebar
** MediaWiki:Common.css|sidebar-edit-common-css
** MediaWiki:Vector.css|sidebar-edit-vector-css
** MediaWiki:Common.js|sidebar-edit-common-js
** Special:Gadgets|sidebar-gadgets
** Special:Import|sidebar-special-import
** Special:Export|sidebar-special-export
** Special:AllPages|sidebar-all-pages
** Special:SpecialPages|sidebar-special-pages
* wiki.gg
** support:|sidebar-support-wiki
** Wikigg-ticket-link|sidebar-submit-ticket
** wikigg-socialmedia-joinlink|wikigg-socialmedia-jointext-sidebar
6b7ee923f37b111533d902d0ae28c62b872ffc9e
Template:Infobox/Boss/doc
10
861
1597
1363
2025-09-13T00:46:57Z
Sharparam
284703
Use Konrad for example
wikitext
text/x-wiki
== Examples ==
{{Infobox/Boss
| title = Konrad the Traitor
| image = Konrad the Traitor.png
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Boss
| title = Konrad the Traitor
| image = Konrad the Traitor.png
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
8120c02bb422349ab95b63725c3fd58597dc2a51
Template:Infobox/Weapon/doc
10
452
1598
669
2025-09-13T00:47:40Z
Sharparam
284703
/* Example */ Use Katanas for example
wikitext
text/x-wiki
== Usage ==
<templatedata>
{
"description": "Infobox template for weapons",
"params": {
"title": {
"label": "Weapon name",
"description": "The name of the weapon",
"required": false,
"default": "{{PAGENAME}}",
"example": "Cool Sword",
"type": "string"
},
"image": {
"label": "Weapon image",
"description": "Name of the file used as the image for the weapon, should be at least 300 pixels wide.",
"required": true,
"example": "Cool weapon.png",
"type": "wiki-file-name"
},
"Type": {
"label": "Weapon type",
"description": "The type of the weapon.",
"required": true,
"example": "Dual Wields",
"type": "wiki-page-name"
},
"Speed": {
"label": "Weapon speed",
"description": "The speed category of the weapon.",
"required": true,
"example": "Fast",
"type": "string"
},
"Damage type": {
"label": "Weapon damage type",
"description": "The type of damage dealt by the weapon.",
"required": true,
"example": "Sharp",
"type": "wiki-page-name"
},
"Passives": {
"label": "Passive properties",
"description": "Any passive properties the weapon has, comma separated",
"required": false,
"example": "Health Regen, Flux Regen",
"type": "string"
},
"Abilities": {
"label": "Active abilities",
"description": "Active abilities that can be used when the weapon is equipped, comma separated",
"required": false,
"example": "Blade Dance",
"type": "string"
},
"Mk_min": {
"label": "Minimum mark level",
"description": "The initial mark level of the weapon",
"required": false,
"default": "0",
"example": "3",
"type": "number"
},
"Mk0_Damage_min": {
"label": "Min. damage at Mk. 0",
"description": "Minimum damage the weapon deals at Mk. 0",
"required": true,
"example": "5",
"type": "number"
},
"Mk0_Damage_max": {
"label": "Max. damage at Mk. 0",
"description": "Maximum damage the weapon deals at Mk. 0",
"required": true,
"example": "8",
"type": "number"
},
"Mk1_Damage_min": {
"label": "Min. damage at Mk. 1",
"description": "Minimum damage the weapon deals at Mk. 1",
"required": true,
"example": "5",
"type": "number"
},
"Mk1_Damage_max": {
"label": "Max. damage at Mk. 1",
"description": "Maximum damage the weapon deals at Mk. 1",
"required": true,
"example": "8",
"type": "number"
},
"Mk2_Damage_min": {
"label": "Min. damage at Mk. 2",
"description": "Minimum damage the weapon deals at Mk. 2",
"required": true,
"example": "10",
"type": "number"
},
"Mk2_Damage_max": {
"label": "Max. damage at Mk. 2",
"description": "Maximum damage the weapon deals at Mk. 2",
"required": true,
"example": "15",
"type": "number"
},
"Mk3_Damage_min": {
"label": "Min. damage at Mk. 3",
"description": "Minimum damage the weapon deals at Mk. 3",
"required": true,
"example": "20",
"type": "number"
},
"Mk3_Damage_max": {
"label": "Max. damage at Mk. 3",
"description": "Maximum damage the weapon deals at Mk. 3",
"required": true,
"example": "25",
"type": "number"
},
"Mk4_Damage_min": {
"label": "Min. damage at Mk. 4",
"description": "Minimum damage the weapon deals at Mk. 4",
"required": true,
"example": "30",
"type": "number"
},
"Mk4_Damage_max": {
"label": "Max. damage at Mk. 4",
"description": "Maximum damage the weapon deals at Mk. 4",
"required": true,
"example": "40",
"type": "number"
},
"Mk5_Damage_min": {
"label": "Min. damage at Mk. 5",
"description": "Minimum damage the weapon deals at Mk. 5",
"required": true,
"example": "50",
"type": "number"
},
"Mk5_Damage_max": {
"label": "Max. damage at Mk. 5",
"description": "Maximum damage the weapon deals at Mk. 5",
"required": true,
"example": "60",
"type": "number"
}
},
"format": "block"
}
</templatedata>
== Example ==
{{Infobox/Weapon
| title = Katanas
| image = Katanas.png
| Type = Dual Wields
| Speed = Fast
| Damage type = Sharp
| Passives = Infinite regen,Stuff,Cool
| Abilities = Blade Dance
| Mk_min = 1
| Mk1_Damage_min = 1
| Mk1_Damage_max = 2
| Mk2_Damage_min = 4
| Mk2_Damage_max = 6
| Mk3_Damage_min = 10
| Mk3_Damage_max = 12
| Mk4_Damage_min = 20
| Mk4_Damage_max = 25
| Mk5_Damage_min = 50
| Mk5_Damage_max = 60
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Weapon
| title = Katanas
| image = Katanas.png
| Type = Dual Wields
| Speed = Fast
| Damage type = Sharp
| Passives = Infinite regen
| Abilities = Blade Dance
| Mk_min = 1
| Mk1_Damage_min = 1
| Mk1_Damage_max = 2
| Mk2_Damage_min = 4
| Mk2_Damage_max = 6
| Mk3_Damage_min = 10
| Mk3_Damage_max = 12
| Mk4_Damage_min = 20
| Mk4_Damage_max = 25
| Mk5_Damage_min = 50
| Mk5_Damage_max = 60
}}
</syntaxhighlight>
bfcdbd7a6f344c47407707ca0509e20db4608c7b
Yaroslav
0
403
1599
568
2025-09-13T00:52:05Z
Sharparam
284703
/* Location */ Fix coordinates and location link
wikitext
text/x-wiki
{{Infobox/NPC
| image = Yaroslav.png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|37597.55|115053.53|-139783.83}}
Located in the [[Desert]]. Standing with his crew in front of the gate to the [[Anomaly (location)|Anomaly]].
== Quotes ==
=== First encounter ===
{{Quote
|Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing.
Time is not of the essence here… Only choice. Soon, you'll feel it yourself.
Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face…
Beyond those gates, you will have to carry the greatest burden of all – your own!
The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness!
I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her.
I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life.
We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception…
When you return, Collector, things will not be as they were. You will not be as you were.
}}
=== After first encounter ===
{{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}}
=== Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] ===
{{Quote
|Things have been set in motion that can never be explained.
An eternal rain is coming our way – remember to trust your blade. You will need it more than ever.
}}
{{Navbox/NPCs}}
5ffe13204acf7db33ee1129652016f3e984bc004
1600
1599
2025-09-13T00:52:27Z
Sharparam
284703
Update image link
wikitext
text/x-wiki
{{Infobox/NPC
| image = Yaroslav (NPC).png
}}
'''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}.
== Location ==
{{coords|37597.55|115053.53|-139783.83}}
Located in the [[Desert]]. Standing with his crew in front of the gate to the [[Anomaly (location)|Anomaly]].
== Quotes ==
=== First encounter ===
{{Quote
|Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing.
Time is not of the essence here… Only choice. Soon, you'll feel it yourself.
Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face…
Beyond those gates, you will have to carry the greatest burden of all – your own!
The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness!
I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her.
I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life.
We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception…
When you return, Collector, things will not be as they were. You will not be as you were.
}}
=== After first encounter ===
{{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}}
=== Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] ===
{{Quote
|Things have been set in motion that can never be explained.
An eternal rain is coming our way – remember to trust your blade. You will need it more than ever.
}}
{{Navbox/NPCs}}
bed8bdf7dfb54ff6627595b68af2e967f0ad7d77
File:Yaroslav (NPC).png
6
960
1601
2025-09-13T00:54:36Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Wormlord
0
547
1602
1493
2025-09-13T00:57:15Z
Sharparam
284703
/* Location */ Fix coordinates
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Wormlord.png
}}
'''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Overview ==
Defeating Wormlord is required to be able to access [[Anomaly|the Anomaly]].
== Location ==
{{coords|262124.20|-51428.26|-120431.34}} (approximate, as the boss constantly moves around)
Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
66d200ece97308e9d63f6c38f248e0b26af266c6
1604
1602
2025-09-13T00:58:55Z
Sharparam
284703
Update image link
wikitext
text/x-wiki
{{Infobox/Boss
| title = {{PAGENAME}}
| image = Wormlord (boss).png
}}
'''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}.
== Overview ==
Defeating Wormlord is required to be able to access [[Anomaly|the Anomaly]].
== Location ==
{{coords|262124.20|-51428.26|-120431.34}} (approximate, as the boss constantly moves around)
Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena.
== Drops ==
* [[Unstable Perk Essence]]
{{Navbox/Bosses}}
72448382acac08e4e72a6654ebd50a19585babaa
Module:Coordinates
828
296
1603
1465
2025-09-13T00:58:22Z
Sharparam
284703
Fix wrong variables used
Scribunto
text/plain
local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$"
local NS_TO_CATEGORISE = {
[0] = true, -- main
[6] = true, -- file
[14] = true -- category
}
local CHECK_PATTERN = "^-?%d+%.%d%d$"
local args_util = require('Module:ArgsUtil')
local p = {}
---@param val number
---@param label string
local function coordNode(val, label)
return mw.html.create('span')
:addClass(label)
:wikitext(p.formatCoord(val))
end
---@param val number
---@return string
function p.formatCoord(val)
local sign = val < 0 and '-' or ''
val = math.abs(val)
val = math.floor(val * 100) / 100
local str = tostring(val)
local int = string.match(str, "^%d+")
local dec = string.match(str, "%.(%d-)0*$") or ''
local int_len = #int
local dec_len = #dec
if int_len >= 3 then
return sign .. string.sub(int, 1, 4)
end
if dec_len == 0 then return sign .. int end
return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2))
end
function p.main(frame)
local args = args_util.merge()
return p._main(args)
end
function p._main(args)
local x = args.x or args[1] or ""
local y = args.y or args[2] or ""
local z = args.z or args[3] or ""
local accurate_x = string.match(x, CHECK_PATTERN) ~= nil
local accurate_y = string.match(y, CHECK_PATTERN) ~= nil
local accurate_z = string.match(z, CHECK_PATTERN) ~= nil
local accurate = accurate_x or accurate_y or accurate_z
x = tonumber(x) or 0
y = tonumber(y) or 0
z = tonumber(z) or 0
local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z)
local elem = mw.html.create('span')
:attr('data-x', x)
:attr('data-y', y)
:attr('data-z', z)
:attr('title', tooltip)
:addClass('coordinates')
:addClass('nowrap')
:node(coordNode(x, 'x'))
:wikitext('::')
:node(coordNode(y, 'y'))
:wikitext('::')
:node(coordNode(z, 'z'))
if not accurate then
elem = elem:addClass('inaccurate')
end
elem = tostring(elem)
local ns = mw.title.getCurrentTitle().namespace
if NS_TO_CATEGORISE[ns] then
if not accurate then
elem = elem .. '[[Category:Pages with inaccurate coordinates]]'
end
elem = elem .. '[[Category:Pages with coordinates]]'
end
local with_styles = mw.getCurrentFrame():extensionTag {
name = 'templatestyles',
args = { src = 'Module:Coordinates/styles.css' }
} .. elem
return with_styles
end
return p
2d305461aa30b6d7d764ddd922920b8d55c4af6a
File:Wormlord (boss).png
6
961
1605
2025-09-13T01:02:03Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Template:Coordinates/doc
10
298
1606
1466
2025-09-13T01:21:23Z
Sharparam
284703
Add category for template
wikitext
text/x-wiki
This template uses the {{ml|Coordinates}} Lua module.
== Usage ==
<templatedata>
{
"params": {
"x": {
"aliases": [
"1"
],
"label": "X",
"description": "X coordinate",
"example": "52",
"type": "number",
"required": true
},
"y": {
"aliases": [
"2"
],
"label": "Y",
"description": "Y coordinate",
"example": "12.5",
"type": "number",
"required": true
},
"z": {
"aliases": [
"3"
],
"label": "Z",
"description": "Z coordinate (vertical axis)",
"example": "-5.6",
"type": "number",
"required": true
}
},
"description": "Used to describe a location in the game.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> → {{Coordinates|x=12.42|y=50.00|z=-32.70}}
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> → {{Coordinates|16.51|42.55|-4.43}}
* <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> → {{coords|1.23|4.56|7.89}}
* <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> → {{pos|6.51|4.32|2.13}}
Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot:
<syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> → {{coords|1|2|3}}
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
34f70e284b9b28221942957e8fdd12ac44bb3b22
1607
1606
2025-09-13T01:25:08Z
Sharparam
284703
Add note on how to get accurate coordinates
wikitext
text/x-wiki
Template to specify a coordinate in the game.
'''Note:''' Due to a bug in the game, the in-game coordinate display {{strong|cannot}} be used to obtain accurate coordinates. Instead, you must use [https://framedsc.com/GeneralGuides/universal_ue4_consoleunlocker.htm the Unreal Engine 4 unlocker] software to enable the in-game console, and use the <code>showdebug</code> command to show a debug overlay that has accurate coordinates in it.
If you try to use the coordinates displayed in the UI in-game, it will be marked as an error on the wiki.
This template uses the {{ml|Coordinates}} Lua module.
== Usage ==
<templatedata>
{
"params": {
"x": {
"aliases": [
"1"
],
"label": "X",
"description": "X coordinate",
"example": "52",
"type": "number",
"required": true
},
"y": {
"aliases": [
"2"
],
"label": "Y",
"description": "Y coordinate",
"example": "12.5",
"type": "number",
"required": true
},
"z": {
"aliases": [
"3"
],
"label": "Z",
"description": "Z coordinate (vertical axis)",
"example": "-5.6",
"type": "number",
"required": true
}
},
"description": "Used to describe a location in the game.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> → {{Coordinates|x=12.42|y=50.00|z=-32.70}}
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> → {{Coordinates|16.51|42.55|-4.43}}
* <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> → {{coords|1.23|4.56|7.89}}
* <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> → {{pos|6.51|4.32|2.13}}
Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot:
<syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> → {{coords|1|2|3}}
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
b0fa377634ba6ba3b7b48458c0c4d35dfa342960
1609
1607
2025-09-13T01:37:29Z
Sharparam
284703
Improve documentation
wikitext
text/x-wiki
Template to specify a coordinate in the game.
'''Note:''' Due to a bug in the game, the in-game coordinate display {{strong|cannot}} be used to obtain accurate coordinates. Instead, [https://framedsc.com/GeneralGuides/universal_ue4_consoleunlocker.htm the Unreal Engine 4 unlocker] software must be used to enable the in-game console, after which the <code>showdebug</code> command can be used to show a debug overlay that has accurate coordinates in it.
[[File:Debug overlay.png|frame|left|The debug overlay as it appears in-game. The second "Location" line contains accurate coordinates (X, Y, and Z).|alt=Screenshot showing the debug overlay that can be enabled in the game if using certain third-party software.]]
{{clear}}
If you try to use the coordinates displayed in the UI in-game, it will be marked as an error on the wiki.
This template uses the {{ml|Coordinates}} Lua module.
== Usage ==
<templatedata>
{
"params": {
"x": {
"aliases": [
"1"
],
"label": "X",
"description": "X coordinate",
"example": "52.13",
"type": "number",
"required": true
},
"y": {
"aliases": [
"2"
],
"label": "Y",
"description": "Y coordinate",
"example": "12.59",
"type": "number",
"required": true
},
"z": {
"aliases": [
"3"
],
"label": "Z",
"description": "Z coordinate (vertical axis)",
"example": "-5.60",
"type": "number",
"required": true
}
},
"description": "Used to describe a location in the game.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> → {{Coordinates|x=12.42|y=50.00|z=-32.70}}
* <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> → {{Coordinates|16.51|42.55|-4.43}}
* <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> → {{coords|1.23|4.56|7.89}}
* <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> → {{pos|6.51|4.32|2.13}}
Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot:
<syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> → {{coords|1|2|3}}
Inaccurate coordinates will also cause the page to be placed in the [[:Category:Pages with inaccurate coordinates|Pages with inaccurate coordinates]] category.
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
1b24fae93c6fb22ca98e821fc62e95f40a446b69
File:Debug overlay.png
6
962
1608
2025-09-13T01:29:43Z
Sharparam
284703
The in-game debug overlay that can be enabled by using the <code>showdebug</code> command in the game console (needs to be enabled by using third party software).
wikitext
text/x-wiki
== Summary ==
The in-game debug overlay that can be enabled by using the <code>showdebug</code> command in the game console (needs to be enabled by using third party software).
== Licensing ==
{{License|fairuse}}
bf93d80c9806753c0bce5323007139846ee91c0e
Template:Infobox/Ring
10
561
1610
877
2025-09-13T01:45:19Z
Sharparam
284703
Add support for effects and passives
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|main
| kind = ring
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| Sections=Basic Info
| Basic Info=Effects,Passives
| Effects={{#if:{{{Effects|}}}|{{Plainlist|{{{Effects}}}}}}}
| Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
}}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude>
3216156e4f850ffffa176342fb8fd0a2c2b55210
1612
1610
2025-09-13T01:47:16Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|main
| kind = ring
| title = {{{title|{{PAGENAME}}}}}
| image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
| sections=Basic Info
| Basic Info=Effects, Passives
| Effects={{#if:{{{Effects|}}}|{{Plainlist|{{{Effects}}}}}}}
| Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
}}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude>
ac580d6ab5e3fb231fe6dee5e41ff2297a30b684
Template:Infobox/Ring/doc
10
562
1611
878
2025-09-13T01:46:34Z
Sharparam
284703
Update example
wikitext
text/x-wiki
== Example ==
{{Infobox/Ring
| title = Cool Ring
| image = Cool Ring.png
| Effects =
* Some effect
* Does other stuff too
| Passives = Strength bonus,Agility bonus
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Ring
| title = Cool Ring
| image = Cool Ring.png
| Effects =
* Some effect
* Does other stuff too
| Passives = Strength bonus,Agility bonus
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
8a4e5bff7d362ec2209b352f048754f127bea8d4
1628
1611
2025-09-13T02:06:00Z
Sharparam
284703
Use rammstein ring for example
wikitext
text/x-wiki
== Example ==
{{Infobox/Ring
| title = Cool Ring
| image = Ring of Rammstein (ring).png
| Effects =
* Some effect
* Does other stuff too
| Passives = Strength bonus,Agility bonus
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Ring
| title = Cool Ring
| image = Ring of Rammstein (ring).png
| Effects =
* Some effect
* Does other stuff too
| Passives = Strength bonus,Agility bonus
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
d138ac5857a2fa2afd11b240ee5a1298eedfb6c7
Ring of Burning Desire
0
519
1613
802
2025-09-13T01:49:29Z
Sharparam
284703
Add effect, update file name
wikitext
text/x-wiki
{{Infobox/Ring
| image = Ring of Burning Desire (ring).png
| title = {{PAGENAME}}
| Effects = * +20% chance to inflict [[Heat|Heat status effect]]
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] that can be found in {{BFF}}.
== Acquisition ==
Drops from [[Diver]] [[enemies]] in [[Deluge|the Deluge]] area.
{{Navbox/Rings}}
79d408a95afaad8989b7041980f3a858c86d3087
File:Ring of Burning Desire (ring).png
6
963
1614
2025-09-13T01:50:45Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_37
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_37
}}
== Licensing ==
{{License|game}}
7665ed47d5c799784e86fb0e18c8435cdf155c0e
Ring of Casting Speed
0
520
1615
804
2025-09-13T01:52:17Z
Sharparam
284703
Update effects and image name
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Casting Speed (ring).png
| Effects =
* -10% attack power
* +20% technocasting speed
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Acquisition ==
Drops from a giant enemy in [[Uranopolis]], around {{coords|-1151|-4475|1453}}.
{{Navbox/Rings}}
b63998c2b57c5f3608675a0c28e564d0b388c0aa
File:Ring of Casting Speed (ring).png
6
964
1616
2025-09-13T01:52:54Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_34
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_34
}}
== Licensing ==
{{License|game}}
fcbdab131e1d2c09f171516349b8cd15e3d123a6
Ring of Rammstein
0
521
1617
806
2025-09-13T01:53:31Z
Sharparam
284703
Update passives and image name
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Rammstein (ring).png
| Passives = Momentum Strike
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Location ==
{{main|Tech Shield#Location}}
This item is located on the same corpse as the [[Tech Shield]].
{{Navbox/Rings}}
1fcd9923fe535740cede487369bdd10cdd73cd43
File:Ring of Rammstein (ring).png
6
965
1618
2025-09-13T01:54:21Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_90
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_90
}}
== Licensing ==
{{License|game}}
830f2d79c7781f398fc28bca0f9dae31ff04207a
Ring of Serpent
0
748
1619
1157
2025-09-13T01:55:03Z
Sharparam
284703
Update effects, passives, and image name
wikitext
text/x-wiki
{{Infobox/Ring
| image = Ring of Serpent (ring).png
| title = {{PAGENAME}}
| Passives = Swift Reflexes
| Effects = * +2 [[Agility]]
}}
== Location ==
Near one of the underwater red lights in [[Deluge]].
{{Navbox/Rings}}
d59a9f1f8977fd40fc8b976d3c2891c5e480ffd4
File:Ring of Serpent (ring).png
6
966
1620
2025-09-13T01:56:05Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_88
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_88
}}
== Licensing ==
{{License|game}}
6a44f24fa8ecc46c8b1d586f45e3f01690696384
Ring of Exceeding Talent
0
522
1621
808
2025-09-13T01:56:58Z
Sharparam
284703
Update effects and image name
wikitext
text/x-wiki
{{Infobox/Ring
| title = {{PAGENAME}}
| image = Ring of Exceeding Talent (ring).png
| Effects =
* +3 [[Strength]]
* +3 [[Agility]]
* +3 [[Constitution]]
* +3 [[Intelligence]]
}}
'''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}.
== Location ==
{{coords|3720|1159|-1397}}
Located in the [[Desert]] on a toppled pillar in the area with Yaroslav's crew (same location as the [[Handler Echo]]).
== See also ==
* [[Ring of Lesser Talent]] – The weakest version of this ring.
* [[Ring of Talent]] – A weaker version of this ring.
{{Navbox/Rings}}
a0b746136c3347050b18c4b0b95e7851eab96532
File:Ring of Exceeding Talent (ring).png
6
967
1622
2025-09-13T01:57:49Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_100
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_100
}}
== Licensing ==
{{License|game}}
4cd7d1e578ba59fdab07b4448f547e3a1f2aeea4
Template:Infobox/Ability/doc
10
460
1623
685
2025-09-13T01:59:19Z
Sharparam
284703
Use an existing image for example
wikitext
text/x-wiki
== Example ==
{{Infobox/Ability
|image=OrientalDash.png
|title=Shoot Star
|Description=Shoots a star.
|Cost=50
|Cooldown=12
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Ability
|image=OrientalDash.png
|title=Shoot Star
|Description=Shoots a star.
|Cost=50
|Cooldown=12
}}
</syntaxhighlight>
59c35e2e2d842e289e5c521db8c65cd5f786843e
Momentum Strike
0
968
1624
2025-09-13T02:02:35Z
Sharparam
284703
Created page with "{{Infobox/Passive | image = Momentum Strike (passive).png | Description = Rolling deals damage basead on [[Strength]] in a circle around you. Can only be activated once every {{Duration|s=30|display=30 seconds}}. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}}"
wikitext
text/x-wiki
{{Infobox/Passive
| image = Momentum Strike (passive).png
| Description = Rolling deals damage basead on [[Strength]] in a circle around you. Can only be activated once every {{Duration|s=30|display=30 seconds}}.
}}
'''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}.
{{Navbox/Passives}}
6f77a86032f42bde0253c72b06e37cf937ad5997
1627
1624
2025-09-13T02:04:59Z
Sharparam
284703
Fix image
wikitext
text/x-wiki
{{Infobox/Passive
| image = Universal Passive.png
| Description = Rolling deals damage basead on [[Strength]] in a circle around you. Can only be activated once every {{Duration|s=30|display=30 seconds}}.
}}
'''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}.
{{Navbox/Passives}}
ab3923bb3223ec689cca90eefb31473bbf59c02c
Template:Navbox/Passives
10
838
1625
1314
2025-09-13T02:02:52Z
Sharparam
284703
Add [[Momentum Strike]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Passives
| title = [[Passives]]
| list =
* [[Momentum Strike]]
* [[Vulnerable Dodge]]
}}<noinclude>{{Documentation}}</noinclude>
21ab89b7493ffa70b704f538de819b449133f146
Template:Infobox/Passive/doc
10
836
1626
1312
2025-09-13T02:04:40Z
Sharparam
284703
Use universal passive icon in example
wikitext
text/x-wiki
== Examples ==
{{Infobox/Passive
| title = Example Passive
| image = Universal Passive.png
| Description = Increases your stats to ungodly amounts.
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Passive
| title = Example Passive
| image = Universal Passive.png
| Description = Increases your stats to ungodly amounts.
}}
</syntaxhighlight>
<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
0b3d42797f0fac836341e748789c732f7c7e63ef
Template:Infobox/Shield/doc
10
458
1629
681
2025-09-13T02:06:35Z
Sharparam
284703
Use wooden shield image for example
wikitext
text/x-wiki
== Examples ==
{{Infobox/Shield
| image = Wooden Shield.png
| title = Test Shield
| Weight = Light
| Abilities = Shield Bash
| Mk0_Sharp = 10
| Mk0_Blunt = 10
| Mk0_Technomancy = 10
| Mk1_Sharp = 20
| Mk1_Blunt = 20
| Mk1_Technomancy = 20
| Mk2_Sharp = 30
| Mk2_Blunt = 30
| Mk2_Technomancy = 30
| Mk3_Sharp = 40
| Mk3_Blunt = 40
| Mk3_Technomancy = 40
| Mk4_Sharp = 50
| Mk4_Blunt = 50
| Mk4_Technomancy = 50
| Mk5_Sharp = 60
| Mk5_Blunt = 60
| Mk5_Technomancy = 60
}}
<syntaxhighlight lang="wikitext">
{{Infobox/Shield
| image = Wooden Shield.png
| title = Test Shield
| Weight = Light
| Abilities = Shield Bash
| Mk0_Sharp = 10
| Mk0_Blunt = 10
| Mk0_Technomancy = 10
| Mk1_Sharp = 20
| Mk1_Blunt = 20
| Mk1_Technomancy = 20
| Mk2_Sharp = 30
| Mk2_Blunt = 30
| Mk2_Technomancy = 30
| Mk3_Sharp = 40
| Mk3_Blunt = 40
| Mk3_Technomancy = 40
| Mk4_Sharp = 50
| Mk4_Blunt = 50
| Mk4_Technomancy = 50
| Mk5_Sharp = 60
| Mk5_Blunt = 60
| Mk5_Technomancy = 60
}}
</syntaxhighlight>
3b54a1bdb8c7ec0d368ca9b9da5433b3a64ec131
Basilisk Hack
0
969
1630
2025-09-13T15:16:45Z
Sharparam
284703
Created page with "{{Infobox/Item | type = consumable | image = Basilisk Hack (item).png | Description = Reset all of your assigned [[attributes]]. Usable from inventory. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Manufacturing == {{Recipe | type = manufacturing | result = Basilisk Hack | ingredient1 = Sludge | ingredient1_count = 20 | ingredient2 = Fractal Fungus | ingredient3 = Essence | ingredient3_count = 6 }} {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Infobox/Item
| type = consumable
| image = Basilisk Hack (item).png
| Description = Reset all of your assigned [[attributes]]. Usable from inventory.
}}
'''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}.
== Manufacturing ==
{{Recipe
| type = manufacturing
| result = Basilisk Hack
| ingredient1 = Sludge
| ingredient1_count = 20
| ingredient2 = Fractal Fungus
| ingredient3 = Essence
| ingredient3_count = 6
}}
{{Navbox/Consumables}}
c8b7962143a466248652806ae936bdcbebcda643
File:Basilisk Hack (item).png
6
970
1631
2025-09-13T15:17:18Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_47
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_47
}}
== Licensing ==
{{License|game}}
e38ad62164ab71347496c696676ecf82203c1d0a
Glowbug
0
971
1632
2025-09-13T15:18:52Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = consumable | image = Glowbug (item).png | Description = A glow effect around character, allowing you to see better for {{Duration|s=120|display=120 seconds}}. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = consumable
| image = Glowbug (item).png
| Description = A glow effect around character, allowing you to see better for {{Duration|s=120|display=120 seconds}}.
}}
'''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}.
{{Navbox/Consumables}}
0075e7ef04cfeaee9e5c07b3d4e1bfc4c9099223
File:Glowbug (item).png
6
972
1633
2025-09-13T15:19:21Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/glowbug
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/glowbug
}}
== Licensing ==
{{License|game}}
c9c9426eae039f67be080bcb326ba46188ab6c7e
Metal Arrow Pack
0
973
1634
2025-09-13T15:21:33Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = consumable | image = Metal Arrow Pack (item).png | Description = Adds 9 [[Metal Arrows|metal arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Crafting == {{Recipe | result = Metal Arrow Pack | ingredient1 = Metal Arrows | ingredient1_count = 9 | ingredient2 = Machinite }} {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = consumable
| image = Metal Arrow Pack (item).png
| Description = Adds 9 [[Metal Arrows|metal arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead.
}}
'''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Metal Arrow Pack
| ingredient1 = Metal Arrows
| ingredient1_count = 9
| ingredient2 = Machinite
}}
{{Navbox/Consumables}}
05ea3953bc77dff9a02beb98f629b48576b0ccd6
File:Metal Arrow Pack (item).png
6
974
1635
2025-09-13T15:21:58Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/icon_quiver2
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/icon_quiver2
}}
== Licensing ==
{{License|game}}
b4a0afb98f7a8c94da4914c6b30f8817637988ac
Piercing Arrow Pack
0
975
1636
2025-09-13T15:23:50Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = consumable | image = Piercing Arrow Pack (item).png | Description = Adds 9 [[Piercing Arrow|piercing arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Crafting == {{Recipe | result = Piercing Arrow Pack | ingredient1 = Piercing Arrow | ingredient1_count = 9 | ingredient2 = Machinite }} {{Navbox/Consumabl..."
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = consumable
| image = Piercing Arrow Pack (item).png
| Description = Adds 9 [[Piercing Arrow|piercing arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead.
}}
'''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Piercing Arrow Pack
| ingredient1 = Piercing Arrow
| ingredient1_count = 9
| ingredient2 = Machinite
}}
{{Navbox/Consumables}}
18bd2d324394484b889ede1c2e02ac6e80fb0bb1
File:Piercing Arrow Pack (item).png
6
976
1637
2025-09-13T15:24:14Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/icon_quiver1
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/icon_quiver1
}}
== Licensing ==
{{License|game}}
8417858eba552ceb85e1329362a2e88381c6981c
Piercing Arrow
0
822
1638
1277
2025-09-13T15:26:03Z
Sharparam
284703
Add crafting recipes
wikitext
text/x-wiki
{{Infobox/Item
| image = Piercing Arrow.png
| type = ammunition
| Description = A projectile that ignores up to 2000 armor rating.
}}
'''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Piercing Arrow
| result_count = 6
| ingredient1 = Machinite
| ingredient1_count = 2
| ingredient2 = Gravicle Dust
}}
{{Recipe
| result = Piercing Arrow
| result_count = 6
| ingredient1 = Metal Arrows
| ingredient1_count = 6
| ingredient2 = Gravicle Dust
}}
{{Navbox/Ammunition}}
{{Navbox/Longbows|state=collapsed}}
5422c1108397ac11f50f4553bf562d2cabc2eebf
Metal Arrows
0
816
1639
1272
2025-09-13T15:27:17Z
Sharparam
284703
Add crafting recipes
wikitext
text/x-wiki
{{Infobox/Item
| image = Metal Arrows.png
| type = ammunition
| Description = A common and replaceable projectile.
}}
'''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Metal Arrows
| result_count = 6
| ingredient = Machinite
| ingredient_count = 2
}}
{{Recipe
| result = Metal Arrows
| result_count = 2
| ingredient = Broken Arrow
| ingredient_count = 3
}}
{{Navbox/Ammunition}}
{{Navbox/Longbows|state=collapsed}}
c7ff9c78c44a27cd62bd990ded25c5f30680e677
Shock Arrows
0
824
1640
1279
2025-09-13T15:28:38Z
Sharparam
284703
Add crafting recipes
wikitext
text/x-wiki
{{Infobox/Item
| image = Shock Arrows.png
| type = ammunition
| Description = A projectile that stuns most enemies for {{Duration|s=7|display=7 seconds}}.
}}
'''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Shock Arrows
| result_count = 3
| ingredient1 = Machinite
| ingredient2 = Neurilium
}}
{{Recipe
| result = Shock Arrows
| result_count = 3
| ingredient1 = Metal Arrows
| ingredient1_count = 3
| ingredient2 = Neurilium
}}
{{Navbox/Ammunition}}
{{Navbox/Longbows|state=collapsed}}
f0dfa24f23ccb001698fd264269f0acda2514236
Mystery Concoction
0
977
1641
2025-09-13T15:32:10Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = concoction | image = Mystery Concoction (item).png | Description = Drink me. }} '''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. == Manufacturing == {{Recipe | result = Mystery Concoction | ingredient = Sludge | ingredient_count = 12 }} {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = concoction
| image = Mystery Concoction (item).png
| Description = Drink me.
}}
'''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}.
== Manufacturing ==
{{Recipe
| result = Mystery Concoction
| ingredient = Sludge
| ingredient_count = 12
}}
{{Navbox/Consumables}}
2a859fcaf6c5e49d96ccf4645792c4b0abfec701
1644
1641
2025-09-13T15:35:54Z
Sharparam
284703
Add monastery location
wikitext
text/x-wiki
{{Infobox/Item
| type = concoction
| image = Mystery Concoction (item).png
| Description = Drink me.
}}
'''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}.
== Locations ==
=== [[Monastery]] ===
{{Needs coordinates|tiny=yes|what=This section}}
One can be found at the start of the game, behind where the player spawns in after the intro cutscene.
== Manufacturing ==
{{Recipe
| result = Mystery Concoction
| ingredient = Sludge
| ingredient_count = 12
}}
{{Navbox/Consumables}}
883b64cf5d1dfb02faab81245e8a1108ce91f979
Template:Navbox/Consumables
10
286
1642
1306
2025-09-13T15:32:37Z
Sharparam
284703
Remove mystery concoction from fluid list
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Consumables
| title = [[Consumables]]
| list1 =
* [[Asylum Brew]]
* [[Basilisk Hack]]
* [[Glowbug]]
* [[Metal Arrow Pack]]
* [[Piercing Arrow Pack]]
| group2 = [[Fluids]]
| list2 =
* [[Ionization Fluid]]
** [[Lesser Ionization Fluid|Lesser]]
** [[Greater Ionization Fluid|Greater]]
* [[Regenerative Fluid]]
** [[Greater Regenerative Fluid|Greater]]
* [[Restorative Fluid]]
** [[Lesser Restorative Fluid|Lesser]]
** [[Greater Restorative Fluid|Greater]]
| group3 = [[Concoctions]]
| list3 =
* [[Diver's Lungs Concoction]]
** [[Improved Diver's Lungs Concoction|Improved]]
* [[Dreadguard's Concoction]]
** [[Greater Dreadguard's Concoction|Greater]]
* [[Experience Concoction]]
* [[Fluxshield Concoction]]
* [[Forsaken Concoction]]
** [[Greater Forsaken Concoction|Greater]]
* [[Indestructible Concoction]]
* [[Jaeger's Concoction]]
** [[Greater Jaeger's Concoction|Greater]]
* [[Mystery Concoction]]
* [[Stoneshield Concoction]]
* [[Spongeskin Concoction]]
* [[Technomancer's Concoction]]
** [[Greater Technomancer's Concoction|Greater]]
* [[Concoction: Aberrant's Blood]]
* [[Concoction: Agility]]
* [[Concoction: All Attributes]]
* [[Concoction: Berserker's Tenacity]]
* [[Concoction: Constitution]]
* [[Concoction: Flux Regen]]
* [[Concoction: Health Regen]]
* [[Concoction: Intelligence]]
* [[Concoction: Mighty Regen]]
* [[Concoction: Powerful Immune System]]
* [[Concoction: Rapid Recovery]]
* [[Concoction: Strength]]
* [[Concoction: Zealot's Tears]]
}}<noinclude>[[Category:Navigation templates]]</noinclude>
25a77ebb77b38a0a394a21d17595b28ef884824b
File:Mystery Concoction (item).png
6
978
1643
2025-09-13T15:33:24Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_4
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_4
}}
== Licensing ==
{{License|game}}
6b6767922e588486008db577835f98663ee80637
Regenerative Fluid
0
979
1645
2025-09-13T15:37:42Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Regenerative Fluid (item).png | Description = Restores 50% of total [[health]] over {{Duration|s=10|display=10 seconds}}. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = fluid
| image = Regenerative Fluid (item).png
| Description = Restores 50% of total [[health]] over {{Duration|s=10|display=10 seconds}}.
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}.
{{Navbox/Consumables}}
4ec3a2e7e6b6ca562d663998daf05f66fe8de140
File:Regenerative Fluid (item).png
6
980
1646
2025-09-13T15:38:22Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_37
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_37
}}
== Licensing ==
{{License|game}}
805cc410b5e368d7769d8c7a258757e28c562dba
Greater Regenerative Fluid
0
981
1647
2025-09-13T15:39:29Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Greater Regenerative Fluid (item).png | Description = Restores 50% of total [[health]] over {{Duration|s=6|display=6 seconds}}. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = fluid
| image = Greater Regenerative Fluid (item).png
| Description = Restores 50% of total [[health]] over {{Duration|s=6|display=6 seconds}}.
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}.
{{Navbox/Consumables}}
034871580401f9046c0f5090e72c81d1c6cd7a87
File:Greater Regenerative Fluid (item).png
6
982
1648
2025-09-13T15:40:01Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_42
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_42
}}
== Licensing ==
{{License|game}}
108b798638cc22ec8f81545a19e46e34d7a8fb62
Restorative Fluid
0
983
1649
2025-09-13T15:45:05Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 450 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Restorative Fluid | ingredient1 = Sludge | ingredient1_count = 2 | ingredient2 = Gingko Leaves | ingredient2_count = 2 }} {{Recipe | result = Restorative Fluid | ingredient1 = Lesser Restorat..."
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = fluid
| image = Restorative Fluid (item).png
| Description = A terribly potent concoction used to regenerate lost tissue. Restores 450 [[Health]].
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Restorative Fluid
| ingredient1 = Sludge
| ingredient1_count = 2
| ingredient2 = Gingko Leaves
| ingredient2_count = 2
}}
{{Recipe
| result = Restorative Fluid
| ingredient1 = Lesser Restorative Fluid
| ingredient1_count = 2
| ingredient2 = Gingko Leaves
}}
== Trivia ==
* The description refers to it as a concoction, despite both the name and in-game categorization using <q>fluid</q>.
{{Navbox/Consumables}}
5a9d8320e23ba4359ece370a2e00dfe45a21f84e
File:Restorative Fluid (item).png
6
984
1650
2025-09-13T15:45:34Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_75
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_75
}}
== Licensing ==
{{License|game}}
b82b273f2ea2ce0e864477a49442b22fa671c1af
Lesser Restorative Fluid
0
985
1651
2025-09-13T15:46:55Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Lesser Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 225 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Lesser Restorative Fluid | ingredient1 = Sludge | ingredient2 = Gingko Leaves }} {{Navbox/Consumables}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = fluid
| image = Lesser Restorative Fluid (item).png
| Description = A terribly potent concoction used to regenerate lost tissue. Restores 225 [[Health]].
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Lesser Restorative Fluid
| ingredient1 = Sludge
| ingredient2 = Gingko Leaves
}}
{{Navbox/Consumables}}
5af7ba971fd8e21a39ba0187ce109175def7691e
File:Lesser Restorative Fluid (item).png
6
986
1652
2025-09-13T15:47:24Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_84
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_84
}}
== Licensing ==
{{License|game}}
0db0ef78c90ef2a454f33f9f1f65a8033c04fc0a
Greater Restorative Fluid
0
987
1653
2025-09-13T15:49:15Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Greater Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 850 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Greater Restorative Fluid | ingredient1 = Sludge | ingredient1_count = 3 | ingredient2 = Gingko Leaves | ingredient2_count = 3 }} {{Recipe | result = Greater Restorative Fluid | ingre..."
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Item
| type = fluid
| image = Greater Restorative Fluid (item).png
| Description = A terribly potent concoction used to regenerate lost tissue. Restores 850 [[Health]].
}}
'''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}.
== Crafting ==
{{Recipe
| result = Greater Restorative Fluid
| ingredient1 = Sludge
| ingredient1_count = 3
| ingredient2 = Gingko Leaves
| ingredient2_count = 3
}}
{{Recipe
| result = Greater Restorative Fluid
| ingredient1 = Restorative Fluid
| ingredient1_count = 2
| ingredient2 = Gingko Leaves
}}
{{Navbox/Consumables}}
e15a707e7c10201f6df25e53bbb3314ceb4b126b
File:Greater Restorative Fluid (item).png
6
988
1654
2025-09-13T15:49:38Z
Sharparam
284703
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_89
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_89
}}
== Licensing ==
{{License|game}}
14d11b68bcc8f2ec0ce187a9cdf3be8a093e25f3
Armor Buster
0
989
1655
2025-09-13T15:52:14Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Armor Buster (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Passives = Armor Buster (passive) | Mk_min = 2 | Mk2_Damage_min = 338 | Mk2_Damage_max = 354 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Armor Buster (weapon).png
| Type = Greatweapon
| Speed = Sluggish
| Damage type = Blunt
| Passives = Armor Buster (passive)
| Mk_min = 2
| Mk2_Damage_min = 338
| Mk2_Damage_max = 354
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
{{Navbox/Weapons}}
1c6724ef7c97bed7971e0036d019b2222e7fa5c8
1662
1655
2025-09-13T15:57:57Z
Sharparam
284703
Fix passive
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Armor Buster (weapon).png
| Type = Greatweapon
| Speed = Sluggish
| Damage type = Blunt
| Passives = Armor Buster
| Mk_min = 2
| Mk2_Damage_min = 338
| Mk2_Damage_max = 354
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
{{Navbox/Weapons}}
570b9f9c629465acf94664dfe540475a410b1428
Template:Infobox/Weapon
10
451
1656
1578
2025-09-13T15:53:21Z
Sharparam
284703
Add support for greatweapons
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| pattern = * [[@@@@]]
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| template = Ability link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| greatweapon = [[Greatweapons|Greatweapon]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| greatweapon = [[Category:Greatweapons]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| greatweapon = greatweapon
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
0f2366cccf831534d1e0ac0c1765b8cdb35d6561
1661
1656
2025-09-13T15:57:33Z
Sharparam
284703
Use template for passive links
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| template = Passive link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| template = Ability link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| greatweapon = [[Greatweapons|Greatweapon]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| greatweapon = [[Category:Greatweapons]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{{title|}}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| greatweapon = greatweapon
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
6929e21a60cf53738335a0c32200966615678841
Template:Passive link
10
990
1657
2025-09-13T15:54:20Z
Sharparam
284703
Created page with "{{#switch:{{{1}}} | Armor Buster = [[Armor Buster (passive)|Armor Buster]] | #default = [[{{{1}}}]] }}<!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{#switch:{{{1}}}
| Armor Buster = [[Armor Buster (passive)|Armor Buster]]
| #default = [[{{{1}}}]]
}}<!--
--><noinclude>{{Documentation}}</noinclude>
72eaff1bc43a162efe03cce838bee85d1fa38e37
Template:Passive link/doc
10
991
1658
2025-09-13T15:56:11Z
Sharparam
284703
Created page with "Used to produce a link to a [[Passives|passive]]. This is primarily useful to automatically handle cases where a passive shares a name with some other page, in which case the article for the passive is usually named with a " (passive)" suffix. == TemplateData == <templatedata> { "params": { "1": { "label": "Passive", "description": "The passive to link to", "example": "Armor Buster", "type": "line", "required": true } }, "description": "Generate a..."
wikitext
text/x-wiki
Used to produce a link to a [[Passives|passive]].
This is primarily useful to automatically handle cases where a passive shares a name with some other page, in which case the article for the passive is usually named with a " (passive)" suffix.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Passive",
"description": "The passive to link to",
"example": "Armor Buster",
"type": "line",
"required": true
}
},
"description": "Generate a link to a passive.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Passive link|Heavy Hitter}}</syntaxhighlight> → {{Ability link|Heavy Hitter}}
* <syntaxhighlight lang="wikitext" inline>{{Passive link|Armor Buster}}</syntaxhighlight> → {{Passive link|Armor Buster}}
Note how in the "Armor Buster" example, the link goes to "Armor Buster (passive)" without having to specify it manually.
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
99f3b51e24ae072ac18d9ffecb649e0362fb082a
Template:Passive link item
10
992
1659
2025-09-13T15:56:44Z
Sharparam
284703
Created page with "* {{Passive link|{{{1}}}}}<!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
* {{Passive link|{{{1}}}}}<!--
--><noinclude>{{Documentation}}</noinclude>
b3c13eb46479c7c5c03f244659f654527f06f391
Template:Passive link item/doc
10
993
1660
2025-09-13T15:57:03Z
Sharparam
284703
Created page with "Used in [[:Category:Infobox templates|infobox templates]] for passive link lists. Not intended for usage elsewhere. <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>"
wikitext
text/x-wiki
Used in [[:Category:Infobox templates|infobox templates]] for passive link lists. Not intended for usage elsewhere.
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly>
<noinclude>[[Category:Template documentation]]</noinclude>
0a673de692e0447983054a6ea6c66e98bdf2045e
File:Armor Buster (weapon).png
6
994
1663
2025-09-13T15:59:02Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArmorBuster
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArmorBuster
}}
== Licensing ==
{{License|game}}
40690993aaa408ba8201c628b9f11022580d9b60
Eviscerator
0
995
1664
2025-09-13T16:00:57Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Eviscerator (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Abilities = Expose Armor, Berserking Leap | Mk_min = 3 | Mk3_Damage_min = 406 | Mk3_Damage_max = 425 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Eviscerator (weapon).png
| Type = Greatweapon
| Speed = Sluggish
| Damage type = Blunt
| Abilities = Expose Armor, Berserking Leap
| Mk_min = 3
| Mk3_Damage_min = 406
| Mk3_Damage_max = 425
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
{{Navbox/Weapons}}
7cb927045a3dc22df2c45efeb4185c94495174dc
File:Eviscerator (weapon).png
6
996
1665
2025-09-13T16:01:25Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Eviscerator
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Eviscerator
}}
== Licensing ==
{{License|game}}
41a949e066e9b98b46f6b36d57cf47a6bd532b19
Greathammer
0
997
1666
2025-09-13T16:02:53Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Greathammer (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Passives = Bash, Pestilence | Mk_min = 2 | Mk2_Damage_min = 338 | Mk2_Damage_max = 354 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Greathammer (weapon).png
| Type = Greatweapon
| Speed = Sluggish
| Damage type = Blunt
| Passives = Bash, Pestilence
| Mk_min = 2
| Mk2_Damage_min = 338
| Mk2_Damage_max = 354
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
{{Navbox/Weapons}}
8ef5d4e7b02b0f3e48ab9e0d6b072084519e10c1
File:Greathammer (weapon).png
6
998
1667
2025-09-13T16:03:26Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_HeavyMace
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_HeavyMace
}}
== Licensing ==
{{License|game}}
107d30d1dfb1a99456891d05464cd541f67fdb9c
Titan Slayer Greatsword
0
999
1668
2025-09-13T16:05:04Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Titan Slayer Greatsword (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Sharp | Abilities = Guillotine, Downward Slash | Mk_min = 3 | Mk3_Damage_min = 312 | Mk3_Damage_max = 343 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Titan Slayer Greatsword (weapon).png
| Type = Greatweapon
| Speed = Sluggish
| Damage type = Sharp
| Abilities = Guillotine, Downward Slash
| Mk_min = 3
| Mk3_Damage_min = 312
| Mk3_Damage_max = 343
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
{{Navbox/Weapons}}
daa2b889a37d2be9992ceb862e00a9a17236bec6
File:Titan Slayer Greatsword (weapon).png
6
1000
1669
2025-09-13T16:05:31Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TitanSlayer
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TitanSlayer
}}
== Licensing ==
{{License|game}}
ba7d88ced1e0fc8bf7d279a4bd43be5a0de28ede
Armor Buster (passive)
0
1001
1670
2025-09-13T16:07:13Z
Sharparam
284703
Created page with "{{Infobox/Passive | image = Universal Passive.png | Description = Your melee attacks ignore 50% of target's current Armor Ratings. }} {{Navbox/Passives}}"
wikitext
text/x-wiki
{{Infobox/Passive
| image = Universal Passive.png
| Description = Your melee attacks ignore 50% of target's current Armor Ratings.
}}
{{Navbox/Passives}}
8a8234e6e36bcfee142b3ce41798020b82fb993c
1671
1670
2025-09-13T16:07:35Z
Sharparam
284703
Add intro text
wikitext
text/x-wiki
{{Infobox/Passive
| image = Universal Passive.png
| Description = Your melee attacks ignore 50% of target's current Armor Ratings.
}}
'''Armor Buster''' is a [[Passives|passive]] in {{BFF}}.
{{Navbox/Passives}}
5f726a12a6803a7b9dd201a555f9334063ac7642
Template:Navbox/Passives
10
838
1672
1625
2025-09-13T16:08:02Z
Sharparam
284703
Add armor buster
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Passives
| title = [[Passives]]
| list =
* [[Armor Buster (passive)|Armor Buster]]
* [[Momentum Strike]]
* [[Vulnerable Dodge]]
}}<noinclude>{{Documentation}}</noinclude>
2c3e5ca88cb446ba671569d4c26691e692200b8e
1674
1672
2025-09-13T16:10:16Z
Sharparam
284703
Add [[Greater Divine Judgement]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Passives
| title = [[Passives]]
| list =
* [[Armor Buster (passive)|Armor Buster]]
* [[Greater Divine Judgement]]
* [[Momentum Strike]]
* [[Vulnerable Dodge]]
}}<noinclude>{{Documentation}}</noinclude>
724953fa74861005357e3d004c1c121959e1e66e
1684
1674
2025-09-13T16:34:08Z
Sharparam
284703
Add missing passives
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Passives
| title = [[Passives]]
| list =
* [[Armor Buster (passive)|Armor Buster]]
* [[Bash]]
* [[Bloodthirst]]
* [[Consistent Strikes]]
* [[Critical Strike (passive)|Critical Strike]]
* [[Experience Amplification]]
* [[Experience Suppression]]
* [[Extended Evasion]]
* [[Flux Efficiency]]
* [[Giant Slayer]]
* [[Greater Divine Judgement]]
* [[Heavy Hitter]]
* [[Lacerate]]
* [[Lifesteal (passive)|Lifesteal]]
* [[Minor Flux Regen]]
* [[Momentum Strike]]
* [[Muscle Mastery]]
* [[Pestilence]]
* [[Powerful Decay]]
* [[Rapid Fire]]
* [[Scavenger's Rejuvenation]]
* [[Serene Movement]]
* [[Spare Shot]]
* [[Spikes]]
* [[Summoning Extension]]
* [[Survivor's Wisdom]]
* [[Swift Reflexes]]
* [[Techno-Defiance]]
* [[Universal Judgment]]
* [[Vermillion Judgment]]
* [[Vitality Boost]]
* [[Volatile Illusions]]
* [[Vulnerable Dodge]]
}}<noinclude>{{Documentation}}</noinclude>
553ac93a26aa364ed2abcef924832eed24267f25
Greater Divine Judgement
0
1002
1673
2025-09-13T16:09:57Z
Sharparam
284703
Created page with "{{Infobox/Passive | image = Universal Passive.png | Description = Deals an extra 24% damage against all non-regular/forsaken [[enemies]]. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}}"
wikitext
text/x-wiki
{{Infobox/Passive
| image = Universal Passive.png
| Description = Deals an extra 24% damage against all non-regular/forsaken [[enemies]].
}}
'''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}.
{{Navbox/Passives}}
af3ce6e544ce2a64b0b374250369db83e90c1c10
1675
1673
2025-09-13T16:10:47Z
Sharparam
284703
Sharparam renamed page [[Greater Divine Judgment]] to [[Greater Divine Judgement]] without leaving a redirect: Misspelled title
wikitext
text/x-wiki
{{Infobox/Passive
| image = Universal Passive.png
| Description = Deals an extra 24% damage against all non-regular/forsaken [[enemies]].
}}
'''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}.
{{Navbox/Passives}}
af3ce6e544ce2a64b0b374250369db83e90c1c10
Divine Greataxe
0
470
1676
705
2025-09-13T16:11:11Z
Sharparam
284703
Fix typo in passive
wikitext
text/x-wiki
{{Infobox/Weapon
| title = {{PAGENAME}}
| image = Divine Greataxe.png
| Type = Greatweapon
| Damage type = Sharp
| Speed = Sluggish
| Passives = Greater Divine Judgement
| Abilities = Regal Radiance
| Mk4_Damage_min = 597
| Mk4_Damage_max = 656
}}
'''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}.
== Location ==
{{coords|43210.37|165132.67|-141105.39}}
Found in the [[Anomaly]]. From the [[Homunculus]], walk past [[The Handler]] and you will see the item up ahead on the ledge of a building.
{{Navbox/Weapons}}
fc7e97560902df963b72533eeb4163cb50d05910
Regal Radiance
0
1003
1677
2025-09-13T16:13:23Z
Sharparam
284703
Created page with "{{Infobox/Ability | image = Regal Radiance (ability).png | Description = Increase your [[strength]] and [[constitution]] attribute based on your [[Intelligence]] Attribute for {{Duration|s=30|display=30 seconds}}. Blinds all nearby enemies, if enemy resist, instead daze them, reducing their attack power by 20%. | Cooldown = 60 | Cost = 150 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}"
wikitext
text/x-wiki
{{Infobox/Ability
| image = Regal Radiance (ability).png
| Description = Increase your [[strength]] and [[constitution]] attribute based on your [[Intelligence]] Attribute for {{Duration|s=30|display=30 seconds}}.
Blinds all nearby enemies, if enemy resist, instead daze them, reducing their attack power by 20%.
| Cooldown = 60
| Cost = 150
}}
'''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
6a70f92d33cb0f33867d0b6a7aafb1966eeb7ba0
File:Regal Radiance (ability).png
6
1004
1678
2025-09-13T16:13:59Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_RegalRadiance
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_RegalRadiance
}}
== Licensing ==
{{License|game}}
8fd49abc02f7cbc260df7d3db0b6783e85eb9a26
Template:Navbox/Abilities
10
578
1679
1585
2025-09-13T16:14:29Z
Sharparam
284703
Add [[Regal Radiance]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = [[Abilities]]
| list1 =
* [[Blade Dash]]
* [[Bone Barrier]]
* [[Divine Blessing]]
* [[Marrow (ability)|Marrow]]
* [[Regal Radiance]]
* [[Whirlwind Strike]]
}}<noinclude>{{Documentation}}</noinclude>
6c71069be86888cd70026fcbb301f932195e426a
1681
1679
2025-09-13T16:17:02Z
Sharparam
284703
Add [[Blade Dance]]
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = [[Abilities]]
| list1 =
* [[Blade Dance]]
* [[Blade Dash]]
* [[Bone Barrier]]
* [[Divine Blessing]]
* [[Marrow (ability)|Marrow]]
* [[Regal Radiance]]
* [[Whirlwind Strike]]
}}<noinclude>{{Documentation}}</noinclude>
843b9adc8b38c5ad373ab1a65db53deee0f2adbf
1683
1681
2025-09-13T16:25:54Z
Sharparam
284703
Add missing abilities
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| template = Navbox/Abilities
| title = [[Abilities]]
| list1 =
* [[Aberrant Strike]]
* [[Arrow Brutality]]
* [[Arrow Twister]]
* [[Berserking Leap]]
* [[Blade Dance]]
* [[Blade Dash]]
* [[Blade Flurry]]
* [[Bladestorm]]
* [[Bone Barrier]]
* [[Carnage]]
* [[Charged Arrow]]
* [[Claymore Swing]]
* [[Crescent Slash]]
* [[Divine Blessing]]
* [[Downward Slash]]
* [[Dual Brutality]]
* [[Energy Burst]]
* [[Escape Velocity]]
* [[Expose Armor]]
* [[Forceful Repulsion]]
* [[Guillotine]]
* [[Heavy Strike]]
* [[Improvised Fortification]]
* [[Marrow (ability)|Marrow]]
* [[Mending Light]]
* [[Phase]]
* [[Pierce]]
* [[Premeditated Strike]]
* [[Quake]]
* [[Reanimate Dead]]
* [[Reap]]
* [[Refraction]]
* [[Regal Radiance]]
* [[Second Breath]]
* [[Shadowstep]]
* [[Shield Bash]]
* [[Silencing Reap]]
* [[Soul Storm]]
* [[Sword Strike]]
* [[Syphon Life]]
* [[Tornado]]
* [[Traitorous Leap]]
* [[Whiplash]]
* [[Whirlwind]]
* [[Whirlwind Strike]]
* [[Wind Blade]]
}}<noinclude>{{Documentation}}</noinclude>
7743f44a6560ec8baecdd2abc07d4eed7a43c661
Blade Dance
0
1005
1680
2025-09-13T16:16:42Z
Sharparam
284703
Created page with "{{Infobox/Ability | image = Blade Dance (ability).png | Description = Swing your weapon several times, dealing damage to all enemies in frontal cone. 46 damage and additional 34 from [[Agility]] attribute per instance of damage for a total of 320 [[Sharp]] damage. | Cooldown = 18 | Cost = 60 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}"
wikitext
text/x-wiki
{{Infobox/Ability
| image = Blade Dance (ability).png
| Description = Swing your weapon several times, dealing damage to all enemies in frontal cone.
46 damage and additional 34 from [[Agility]] attribute per instance of damage for a total of 320 [[Sharp]] damage.
| Cooldown = 18
| Cost = 60
}}
'''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}.
{{Navbox/Abilities}}
b9e47fd084810728c09921e9039f38b023d02462
File:Blade Dance (ability).png
6
1006
1682
2025-09-13T16:18:01Z
Sharparam
284703
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_TwinbladeFlurry2
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/AbilityIcons/New/Icon_TwinbladeFlurry2
}}
== Licensing ==
{{License|game}}
aff4e6fb3a86ce71e79575d3450ddae5555e377f
Passives
0
886
1685
1432
2025-09-13T16:34:42Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
'''Passives''' are special properties that can be found on various [[equipment]], they provide their bonus at all times and don't need to be activated, unlike [[abilities]].
== See also ==
* [[Abilities]]
{{Navbox/Passives}}
[[Category:Passives]]
20da8d383a1a67a9db37a1603312b2f1eb8a7800
Ability
0
1007
1686
2025-09-13T16:35:00Z
Sharparam
284703
Redirected page to [[Abilities]]
wikitext
text/x-wiki
#REDIRECT [[Abilities]]
11b6e51c8d49cd0ea95849da924e56675f48c49b
Passive
0
1008
1687
2025-09-13T16:35:13Z
Sharparam
284703
Redirected page to [[Passives]]
wikitext
text/x-wiki
#REDIRECT [[Passives]]
d0f8c1c729acc790d0ebe9dca573662760756eb4
Template:Infobox/Cape
10
462
1688
689
2025-09-13T16:38:20Z
Sharparam
284703
Add default for title
wikitext
text/x-wiki
<includeonly>{{#invoke:Infobox|main
|kind=cape
|sep=,
|title={{{title|{{PAGENAME}}}}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Effects
|Effects=Effect1,Effect2,Effect3
|Effect1_nolabel=yes
|Effect2_nolabel=yes
|Effect3_nolabel=yes
}}{{#if:{{NAMESPACE}}||[[Category:Capes]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
a7caaf53d894f4f0410b98360c79c94d99cc433a
Ronin Scarf
0
1009
1689
2025-09-13T16:39:06Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Cape | image = Ronin Scarf (cape).png | Effect1 = +3 [[Agility]] | Effect2 = +10% [[Sharp]] Armor Penetration }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Ronin Scarf (cape).png
| Effect1 = +3 [[Agility]]
| Effect2 = +10% [[Sharp]] Armor Penetration
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}}
be26961bc7cb776bedc130e4404d8983e8d97c70
File:Ronin Scarf (cape).png
6
1010
1690
2025-09-13T16:40:11Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/icon_scarfRonin
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/icon_scarfRonin
}}
== Licensing ==
{{License|game}}
c83167cebd43afe4d282ca41d65d242063c48d2e
Agile Cape
0
1011
1691
2025-09-13T16:41:11Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Cape | image = Agile Cape (cape).png | Effect1 = +5 [[Agility]] | Effect2 = +50 [[Stamina]] Recovery per second }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Agile Cape (cape).png
| Effect1 = +5 [[Agility]]
| Effect2 = +50 [[Stamina]] Recovery per second
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}}
a08fbf207300cc2e840099f00d85ba359d4e87af
File:Agile Cape (cape).png
6
1012
1692
2025-09-13T16:41:47Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered1
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered1
}}
== Licensing ==
{{License|game}}
11d16186a03e4be636e284c73fc4bfd1a27462ce
Fur Cape
0
1013
1693
2025-09-13T16:42:46Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Cape | image = Fur Cape (cape).png | Effect1 = +0.5 Delay Before [[Stamina]] Regenerates | Effect2 = +10% Attack Power }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Fur Cape (cape).png
| Effect1 = +0.5 Delay Before [[Stamina]] Regenerates
| Effect2 = +10% Attack Power
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}}
a1607a358e9484587d35f0299d8c081980c56904
File:Fur Cape (cape).png
6
1014
1694
2025-09-13T16:43:35Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_FurCape
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_FurCape
}}
== Licensing ==
{{License|game}}
811f167e0433346ca8fb012e184597107ae7d145
Sentinel Overcoat
0
1015
1695
2025-09-13T16:44:30Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Cape | image = Sentinel Overcoat (cape).png | Effect1 = +3 [[Strength]] | Effect2 = +10% [[Blunt]] Armor Penetration }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Sentinel Overcoat (cape).png
| Effect1 = +3 [[Strength]]
| Effect2 = +10% [[Blunt]] Armor Penetration
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}}
199c56d814670c0fbe1f3e2d0642287c82c80d4d
File:Sentinel Overcoat (cape).png
6
1016
1696
2025-09-13T16:45:02Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/icon_sentinelovercoat
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/icon_sentinelovercoat
}}
== Licensing ==
{{License|game}}
0932316b595ae1efd59c9f007169e6ac50d8daff
Spectre Scarf
0
1017
1697
2025-09-13T16:45:55Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Cape | image = Spectre Scarf (cape).png | Effect1 = +3 [[Intelligence]] | Effect2 = +15% Critical Damage }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}]"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Spectre Scarf (cape).png
| Effect1 = +3 [[Intelligence]]
| Effect2 = +15% Critical Damage
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}]
9797c65e9bf878df983e20f5e442f40884e0835e
1699
1697
2025-09-13T16:46:37Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Spectre Scarf (cape).png
| Effect1 = +3 [[Intelligence]]
| Effect2 = +15% Critical Damage
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}}
075c4bc242502504ec881a12e5b0a52078c321ad
File:Spectre Scarf (cape).png
6
1018
1698
2025-09-13T16:46:21Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/icon_scarf
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/icon_scarf
}}
== Licensing ==
{{License|game}}
7ba44884538c21cd17d556d30a9fd1bae170526f
Tattered Cape
0
1019
1700
2025-09-13T16:47:13Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Cape | image = Tattered Cape (cape).png | Effect1 = +10% Stagger Resistance }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Tattered Cape (cape).png
| Effect1 = +10% Stagger Resistance
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}}
138e3008b085e2d91284c59f670f4c710d144b84
File:Tattered Cape (cape).png
6
1020
1701
2025-09-13T16:47:41Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered
}}
== Licensing ==
{{License|game}}
99da13814cf5bfe0dc6471904e1e113f03e2b0d1
Traveler Cape
0
1021
1702
2025-09-13T16:48:33Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Cape | image = Traveler Cape (cape).png | Effect1 = +5% Movement Speed }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Cape
| image = Traveler Cape (cape).png
| Effect1 = +5% Movement Speed
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}.
{{Navbox/Capes}}
48084c9c227f7d891aa4cb8edc6643e5ff9a22e6
File:Traveler Cape (cape).png
6
1022
1703
2025-09-13T16:49:02Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_TravellerCape
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Armors/Icon_TravellerCape
}}
== Licensing ==
{{License|game}}
01c9490a3332e5a3175d0b99815a37b6d96fb60b
Longbow
0
1023
1704
2025-09-13T16:51:08Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Longbow (weapon).png | Type = longbow | Speed = Fast | Damage type = Sharp | Passives = Spare Shot | Abilities = Premeditated Strike | Mk_min = 1 | Mk1_Damage_min = 145 | Mk1_Damage_max = 155 }} '''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Longbow (weapon).png
| Type = longbow
| Speed = Fast
| Damage type = Sharp
| Passives = Spare Shot
| Abilities = Premeditated Strike
| Mk_min = 1
| Mk1_Damage_min = 145
| Mk1_Damage_max = 155
}}
'''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}.
{{Navbox/Weapons}}
650e2dbd8c8d5da68426169d9e71336daa702bb8
File:Longbow (weapon).png
6
1024
1705
2025-09-13T16:51:42Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_BasicBow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_BasicBow
}}
== Licensing ==
{{License|game}}
2988bf44fb365b498c50de80e13a48feeebd3e5c
Ranged weapons
0
659
1706
1019
2025-09-13T16:52:43Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
'''Ranged weapons''' in {{BFF}} can be used to attack enemies at range, without having to get into melee distance.
== Overview ==
There are two types of ranged weapons, [[longbows]] and [[staves]].
{{Navbox/Ranged weapons}}
[[Category:Ranged weapons]]
c9e05fc876b4500dc0a2598e6ae96b70b68fd109
Longbows
0
660
1707
1020
2025-09-13T16:53:03Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
'''Longbows''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. They are currently the only type of bow available.
{{Navbox/Longbows}}
[[Category:Longbows]]
cd170e9044aba6f6d9fb1c8f967eddfc03c2e83e
Template:Navbox/Longbows
10
818
1708
1270
2025-09-13T16:53:18Z
Sharparam
284703
Fix name for winged bow
wikitext
text/x-wiki
{{Navbox
| {{{1|}}}
| state = {{{state|}}}
| template = Navbox/Longbows
| title = [[Longbows]]
| list1 =
* [[Arcane Bow]]
* [[Longbow]]
* [[Taskmaster]]
* [[Winged Bow]]
}}<noinclude>{{Documentation}}</noinclude>
92e2d941a1e3293271ed058e50202e0d473ec836
Winged Bow
0
1025
1709
2025-09-13T16:54:24Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Winged Bow (weapon).png | Type = Longbow | Speed = Fast | Damage type = Sharp | Abilities = Arrow Brutality, Charged Arrow | Mk3_Damage_min = 194 | Mk3_Damage_max = 207 }} '''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Winged Bow (weapon).png
| Type = Longbow
| Speed = Fast
| Damage type = Sharp
| Abilities = Arrow Brutality, Charged Arrow
| Mk3_Damage_min = 194
| Mk3_Damage_max = 207
}}
'''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}.
{{Navbox/Weapons}}
2af5559ce19030294ae8ce010a93a8eb402991cc
File:Winged Bow (weapon).png
6
1026
1710
2025-09-13T16:54:47Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/icon_wingedbow
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/icon_wingedbow
}}
== Licensing ==
{{License|game}}
b5879184f94de6dcfe2bbc51e0272a761578db3a
Evolved Staff
0
1027
1711
2025-09-13T16:56:15Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Evolved Staff (weapon).png | Type = Staff | Speed = Slow | Damage type = Technomancy | Mk0_Damage_min = 49 | Mk0_Damage_max = 50 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Evolved Staff (weapon).png
| Type = Staff
| Speed = Slow
| Damage type = Technomancy
| Mk0_Damage_min = 49
| Mk0_Damage_max = 50
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}.
{{Navbox/Weapons}}
1210043d143c13c1eba3e2572c7728d2d3705198
File:Evolved Staff (weapon).png
6
1028
1712
2025-09-13T16:56:43Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_EvolvedStaffNew
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_EvolvedStaffNew
}}
== Licensing ==
{{License|game}}
9c4d3c85a9d54e936188036425bb5e844ae5eb27
Mechanomad Staff
0
1029
1713
2025-09-13T16:57:45Z
Sharparam
284703
Created page with "{{Needs location}} {{Infobox/Weapon | image = Mechanomad Staff (weapon).png | Type = Staff | Speed = Slow | Damage type = Technomancy | Mk0_Damage_min = 49 | Mk0_Damage_max = 50 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. {{Navbox/Weapons}}"
wikitext
text/x-wiki
{{Needs location}}
{{Infobox/Weapon
| image = Mechanomad Staff (weapon).png
| Type = Staff
| Speed = Slow
| Damage type = Technomancy
| Mk0_Damage_min = 49
| Mk0_Damage_max = 50
}}
'''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}.
{{Navbox/Weapons}}
abc6b834084e76b5d3cc23245bd05ff84360c6db
File:Mechanomad Staff (weapon).png
6
1030
1714
2025-09-13T16:58:10Z
Sharparam
284703
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_MechanomadStaff.
}}
wikitext
text/x-wiki
== Summary ==
{{Game image
| path = Game/Textures/EquipmentIcons/New/Weapons/Icon_MechanomadStaff.
}}
== Licensing ==
{{License|game}}
4f8863c9a8d014e23902360f4115eae1e6d0a2d4
Anomalous crystals
0
427
1715
617
2025-09-13T17:01:15Z
Sharparam
284703
Add note on extraction
wikitext
text/x-wiki
'''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties.
== Overview ==
There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''.
Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, causing it to be lost forever.
Unwanted crystals can be destroyed by extracting essence from them in the inventory, one crystal (regardless of tier) grants one essence when extracted.
{{Navbox/Items}}
[[Category:Anomalous crystals]]
d2a2bb73ae64ca30747d98ab5cfef8721182b0b2
Ammunition
0
814
1716
1264
2025-09-13T17:01:55Z
Sharparam
284703
Fix typo
wikitext
text/x-wiki
'''{{PAGENAME}}''' are items that can be shot with [[longbows]].
{{Navbox/Ammunition}}
[[Category:Ammunition]]
cc83a8d360dcc7f109694ab4c21f0ae311b310bb
Upgrade items
0
662
1717
1022
2025-09-13T17:02:42Z
Sharparam
284703
Move equipment link
wikitext
text/x-wiki
'''Upgrade items''' in {{BFF}} can be used to upgrade [[equipment]] to higher mark levels.
== Overview ==
There are two upgrade items available.
=== Upgrade Splinter ===
{{Main|Upgrade Splinter}}
Upgrade splinters are used to upgrade equipment to Mk 1, 2, and 3.
=== Upgrade Modules ===
{{Main|Upgrade Module}}
Upgrade modules are used to upgrade equipment to Mk 4 and 5.
[[Category:Upgrade items]]
6c65a41a767ff088faff06fa3c60df4e40e5d288
1718
1717
2025-09-13T17:03:10Z
Sharparam
284703
Add navbox
wikitext
text/x-wiki
'''Upgrade items''' in {{BFF}} can be used to upgrade [[equipment]] to higher mark levels.
== Overview ==
There are two upgrade items available.
=== Upgrade Splinter ===
{{Main|Upgrade Splinter}}
Upgrade splinters are used to upgrade equipment to Mk 1, 2, and 3.
=== Upgrade Modules ===
{{Main|Upgrade Module}}
Upgrade modules are used to upgrade equipment to Mk 4 and 5.
{{Navbox/Essential items}}
[[Category:Upgrade items]]
3fa4114361dde368f8d5149cfa5e5186640ac550
Essential items
0
665
1719
1026
2025-09-13T17:04:05Z
Sharparam
284703
Add description
wikitext
text/x-wiki
'''Essential items''' are important [[items]] in the game, either for progression or upgrading [[equipment]].
{{Navbox/Essential items}}
[[Category:Essential items]]
e4ce9ed78441611f20c3c1fffdf6ceb7ff482a4f
Template:BFF
10
346
1720
459
2025-09-13T17:04:59Z
Sharparam
284703
Protected "[[Template:BFF]]": Widely transcluded ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite))
wikitext
text/x-wiki
''[[Bleak Faith: Forsaken]]''
a07fd38648935c2ecd381aa47db3694dae3fb873
1721
1720
2025-09-13T17:05:44Z
Sharparam
284703
Add documentation
wikitext
text/x-wiki
''[[Bleak Faith: Forsaken]]''<noinclude>{{Documentation}}</noinclude>
37316fd90539b5b11f099a0497c71388ccc8a405
Template:BFF/doc
10
1031
1722
2025-09-13T17:07:21Z
Sharparam
284703
Created page with "Used to produce a link to the game's article, with proper formatting. == TemplateData == <templatedata> { "params": {}, "description": "Used to produce a link to the game's article, with proper formatting.", "format": "inline" } </templatedata> == Example == * <syntaxhighlight lang="wikitext" inline>{{BFF}}</syntaxhighlight> → {{BFF}} <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noi..."
wikitext
text/x-wiki
Used to produce a link to the game's article, with proper formatting.
== TemplateData ==
<templatedata>
{
"params": {},
"description": "Used to produce a link to the game's article, with proper formatting.",
"format": "inline"
}
</templatedata>
== Example ==
* <syntaxhighlight lang="wikitext" inline>{{BFF}}</syntaxhighlight> → {{BFF}}
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
f6195706a649006c85d6c9c2c81995d9b2ce4314
1723
1722
2025-09-13T17:10:08Z
Sharparam
284703
Update categorization
wikitext
text/x-wiki
Used to produce a link to the game's article, with proper formatting.
== TemplateData ==
<templatedata>
{
"params": {},
"description": "Used to produce a link to the game's article, with proper formatting.",
"format": "inline"
}
</templatedata>
== Example ==
* <syntaxhighlight lang="wikitext" inline>{{BFF}}</syntaxhighlight> → {{BFF}}
<includeonly>[[Category:Templates]]</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
260a69a9c0b54df8f57bd374581c9def8835d210
Deluge
0
356
1724
1509
2025-09-13T17:15:48Z
Sharparam
284703
Add enemy list
wikitext
text/x-wiki
[[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]]
'''{{PAGENAME}}''' is a location in {{BFF}}.
{{Quote
| A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting.
}}
== NPCs ==
* [[The Handler]]
== Enemies ==
* [[Fisherman]]
{{Navbox/Locations}}
[[Category:Locations]]
8bcb7f6fd26e25cf5edd2c9c098ffc8f66e968ef
Archinquisitor Belisarius
0
401
1725
564
2025-09-13T17:23:38Z
Sharparam
284703
Update image name
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}}
{{stub}}
{{Infobox/NPC
| image = Archinquisitor Belisarius (NPC).png
}}
{{Navbox/NPCs}}
37acab4f9f5d248cfaf4cbfd488ab7b9eb7e8d17
1727
1725
2025-09-13T17:30:22Z
Sharparam
284703
Add more information
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}}
{{Infobox/NPC
| image = Archinquisitor Belisarius (NPC).png
}}
== Location ==
{{coords|3470.22|23631.83|-20680.39}}
Located in the [[Machinarium]], inside a small temple leading to a cave. The entrance is in the forest area after defeating [[Aberrant Knight]].
== Quotes ==
=== On first encounter ===
{{Quote
|I emphathize with those we purify… But when I lay my hands on [[the Serdars]]… Hell will seem like Heaven!
If we could only do away with everything here, altogether…
A marvellous conception, a supreme figure, an exalted shadow, an infinite representation of the excellence and supremacy that transcends comprehension or grasp. Thus is the excellence of the [[God-Emperor]] and the greatness of his domains made manifest. He will be glorified not in one, but in countless suns. Not in a single realm but in a thousand!
I do not like forced conversations, so – if you please…
There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight.
}}
=== On subsequent encounters ===
{{Quote|There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight.}}
{{Navbox/NPCs}}
b3208bc5094affe5c8dc01a8d3b218ad475f101a
1728
1727
2025-09-13T17:31:50Z
Sharparam
284703
Add introduction
wikitext
text/x-wiki
{{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}}
{{Infobox/NPC
| image = Archinquisitor Belisarius (NPC).png
}}
'''Archinquisitor Belisarius''' is an [[NPCs|NPC]] in {{BFF}}. The player will later encounter him as a [[Bosses|boss]] near the end of the game.
== Location ==
{{coords|3470.22|23631.83|-20680.39}}
Located in the [[Machinarium]], inside a small temple leading to a cave. The entrance is in the forest area after defeating [[Aberrant Knight]].
== Quotes ==
=== On first encounter ===
{{Quote
|I emphathize with those we purify… But when I lay my hands on [[the Serdars]]… Hell will seem like Heaven!
If we could only do away with everything here, altogether…
A marvellous conception, a supreme figure, an exalted shadow, an infinite representation of the excellence and supremacy that transcends comprehension or grasp. Thus is the excellence of the [[God-Emperor]] and the greatness of his domains made manifest. He will be glorified not in one, but in countless suns. Not in a single realm but in a thousand!
I do not like forced conversations, so – if you please…
There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight.
}}
=== On subsequent encounters ===
{{Quote|There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight.}}
{{Navbox/NPCs}}
a68805c0d737cc497b94917641f7c31fcd301908
File:Archinquisitor Belisarius (NPC).png
6
1032
1726
2025-09-13T17:23:58Z
Sharparam
284703
wikitext
text/x-wiki
== Licensing ==
{{License|fairuse}}
87d7977e3529dee7284946acd854ac7b16cf2467
Module:Recipe/doc
828
917
1729
1526
2025-09-13T17:35:10Z
Sharparam
284703
Use valid results and ingredients
wikitext
text/x-wiki
This module should not be used directly, instead use it via the {{tl|Recipe}} template.
== Styles ==
* [[Module:Recipe/styles.css]]
== Test cases ==
=== Simple single ingredient recipe ===
<syntaxhighlight lang="wikitext">
{{#invoke:Recipe|main
|result = Restorative Fluid
|ingredient = Gingko Leaves
}}
</syntaxhighlight>
{{#invoke:Recipe|main
|result = Restorative Fluid
|ingredient = Gingko Leaves
}}
=== Multiple ingredients ===
<syntaxhighlight lang="wikitext">
{{#invoke:Recipe|main
|result = Greater Restorative Fluid
|ingredient1 = Sludge
|ingredient2 = Gingko Leaves
}}
</syntaxhighlight>
{{#invoke:Recipe|main
|result = Greater Restorative Fluid
|ingredient1 = Sludge
|ingredient2 = Gingko Leaves
}}
<includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!--
--><noinclude>[[Category:Module documentation pages]]</noinclude>
88e2030ec6ad85bf856aa6f36b49911ced32abbd
Template:Recipe/doc
10
920
1730
1530
2025-09-13T17:36:40Z
Sharparam
284703
Use valid items in examples
wikitext
text/x-wiki
== Examples ==
=== Simple recipe with single ingredient ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Restorative Fluid
| ingredient = Gingko Leaves
}}
</syntaxhighlight>
{{Recipe
| result = Restorative Fluid
| ingredient = Gingko Leaves
}}
=== Multiple ingredients ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Greater Restorative Fluid
| ingredient1 = Sludge
| ingredient2 = Gingko Leaves
}}
</syntaxhighlight>
{{Recipe
| result = Greater Restorative Fluid
| ingredient1 = Sludge
| ingredient2 = Gingko Leaves
}}
=== Manufacturing recipe ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Mystery Concoction
| ingredient = Sludge
| type = manufacturing
}}
</syntaxhighlight>
{{Recipe
| result = Mystery Concoction
| ingredient = Sludge
| type = manufacturing
}}
=== Quantities ===
<syntaxhighlight lang="wikitext">
{{Recipe
| result = Metal Arrows
| result_quantity = 10
| ingredient1 = Machinite
| ingredient1_quantity = 5
| ingredient2 = Sludge
| ingredient2_quantity = 2
| ingredient3 = Gingko Leaves
| ingredient3_quantity = 10
| type = crafting
}}
</syntaxhighlight>
{{Recipe
| result = Metal Arrows
| result_quantity = 10
| ingredient1 = Machinite
| ingredient1_quantity = 5
| ingredient2 = Sludge
| ingredient2_quantity = 2
| ingredient3 = Gingko Leaves
| ingredient3_quantity = 10
| type = crafting
}}
<includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
d152f85b96c4ccf5584d304936e74be664106ea1
Techpriest Cape
0
515
1731
1033
2025-09-13T17:39:36Z
Sharparam
284703
Fix interwiki link
wikitext
text/x-wiki
{{Infobox/Cape
| image = Techpriest Cape.png
| title = {{PAGENAME}}
| Effect1 = +50 Max [[flux]] points.
| Effect2 = +150 [[Flux]] leech rating.
}}
'''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player.
== Location ==
{{coords|-4527|8973|9614}}
Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left.
== Trivia ==
* "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[wikipedia:Warhammer 40,000|Warhammer 40,000]].
* The cape is called "HighPriestCape" in the game files.
{{Navbox/Capes}}
dc3568f0be90eee43efeafc7d9ad950530eaef8b
Greatweapon
0
1033
1732
2025-09-13T17:40:36Z
Sharparam
284703
Redirected page to [[Greatweapons]]
wikitext
text/x-wiki
#REDIRECT [[Greatweapons]]
1e761b4aa7eac6f5415739067c330950b195d7f0
Staff
0
1034
1733
2025-09-13T17:40:49Z
Sharparam
284703
Redirected page to [[Staves]]
wikitext
text/x-wiki
#REDIRECT [[Staves]]
695e27b9fb3bc2aedd279a23c2ed933b3df0478b
Two-handed
0
1035
1734
2025-09-13T17:41:10Z
Sharparam
284703
Redirected page to [[Two-handed weapons]]
wikitext
text/x-wiki
#REDIRECT [[Two-handed weapons]]
26b71e9dcde020e910bf0237e4781f8038ef353e
One-handed
0
1036
1735
2025-09-13T17:41:23Z
Sharparam
284703
Redirected page to [[One-handed weapons]]
wikitext
text/x-wiki
#REDIRECT [[One-handed weapons]]
72c8194c2cd8818bb06c5f772d5f0501cc48e935
Template:Infobox/Weapon
10
451
1736
1661
2025-09-13T17:42:48Z
Sharparam
284703
Fix name resolution
wikitext
text/x-wiki
<includeonly>{{#vardefine:name|{{{title|{{PAGENAME}}}}}}}{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{#var:name}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| template = Passive link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| template = Ability link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| greatweapon = [[Greatweapons|Greatweapon]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| greatweapon = [[Category:Greatweapons]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{#var:name}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| greatweapon = greatweapon
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
648952ec0a0f6a575c636d80aa897ba29a8dfc1a
1742
1736
2025-09-13T17:52:00Z
Sharparam
284703
Use damage type template
wikitext
text/x-wiki
<includeonly>{{#vardefine:name|{{{title|{{PAGENAME}}}}}}}{{#invoke:Infobox|main
|kind=weapon
|sep=,
|title={{#var:name}}
|image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}}
|sections=Basic Info, Stats
|Basic Info=Type,Speed,Damage type,Passives,Abilities
|Passives={{#listmap:
| list = {{{Passives|}}}
| outsep = \n
| token = @@@@
| template = Passive link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}}
|Abilities={{#listmap:
| list = {{{Abilities|}}}
| outsep = \n
| token = @@@@
| template = Ability link item
| intro = \{\{Plainlist\!
| outro = \}\}
}}
|Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}}
|Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}}
| one-handed = [[One-handed weapons|One-handed]]
| two-handed = [[Two-handed weapons|Two-handed]]
| dual wield = [[Dual Wield]]
| twinblade = [[Twinblades|Twinblade]]
| greatweapon = [[Greatweapons|Greatweapon]]
| bow
| longbow = [[Longbows|Longbow]]
| ranged = [[Ranged weapons|Ranged]]
| staff = [[Staves|Staff]]
| #default = {{{Type}}}
}}}}
|Damage type={{#if:{{{Damage type|}}}|{{Damage type|{{{Damage type}}}}}}}
|tabs={{#switch:{{{Mk_min|0}}}
|1 = Mk1,Mk2,Mk3,Mk4,Mk5
|2 = Mk2,Mk3,Mk4,Mk5
|3 = Mk3,Mk4,Mk5
|4 = Mk4,Mk5
|5 = Mk5
|#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5
}}
|Mk0_label=Mk 0
|Mk1_label=Mk 1
|Mk2_label=Mk 2
|Mk3_label=Mk 3
|Mk4_label=Mk 4
|Mk5_label=Mk 5
|Stats=Damage
|Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}}
|Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}}
|Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}}
|Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}}
|Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}}
|Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}}
}}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}}
| one-handed = [[Category:One-handed weapons]]
| two-handed = [[Category:Two-handed weapons]]
| dual wield = [[Category:Dual Wields]]
| twinblade = [[Category:Twinblades]]
| greatweapon = [[Category:Greatweapons]]
| bow
| longbow = [[Category:Longbows]]
| ranged = [[Category:Ranged weapons]]
| staff = [[Category:Staves]]
| #default = [[Category:Weapons]]
}}{{Weapons/CargoStore
|name={{#var:name}}
|type={{#switch:{{lc:{{{Type}}}}}
| one-handed = one-handed
| two-handed = two-handed
| dual wield = dual wield
| twinblade = twinblade
| greatweapon = greatweapon
| bow
| longbow = longbow
| ranged = ranged
| staff = staff
| #default = unknown
}}
|speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}}
|damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}}
| sharp = sharp
| blunt = blunt
| tech
| technomancy = technomancy
}}}}
|damageMk0Min={{{Mk0_Damage_min|}}}
|damageMk0Max={{{Mk0_Damage_max|}}}
|damageMk1Min={{{Mk1_Damage_min|}}}
|damageMk1Max={{{Mk1_Damage_max|}}}
|damageMk2Min={{{Mk2_Damage_min|}}}
|damageMk2Max={{{Mk2_Damage_max|}}}
|damageMk3Min={{{Mk3_Damage_min|}}}
|damageMk3Max={{{Mk3_Damage_max|}}}
|damageMk4Min={{{Mk4_Damage_min|}}}
|damageMk4Max={{{Mk4_Damage_max|}}}
|damageMk5Min={{{Mk5_Damage_min|}}}
|damageMk5Max={{{Mk5_Damage_max|}}}
}}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude>
c7a1675b3627d1c2e3ea681c310cbb46b80eadd6
Blunt
0
1037
1737
2025-09-13T17:43:31Z
Sharparam
284703
Created page with "'''Blunt''' is a type of damage in {{BFF}}. [[Category:Game mechanics]]"
wikitext
text/x-wiki
'''Blunt''' is a type of damage in {{BFF}}.
[[Category:Game mechanics]]
01f1c4d287033b2532357615f04edb64b5d5e46f
Sharp
0
526
1738
813
2025-09-13T17:43:53Z
Sharparam
284703
Add category
wikitext
text/x-wiki
'''Sharp''' is a type of damage in {{BFF}}.
[[Category:Game mechanics]]
cce1ce9bc84831c31b53fbafed846e82615d4eaa
Template:Damage type
10
1038
1739
2025-09-13T17:48:11Z
Sharparam
284703
Created page with "{{#switch:{{lc:{{{1}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}<!-- --><noinclude>{{Documentation}}</noinclude>"
wikitext
text/x-wiki
{{#switch:{{lc:{{{1}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{Damage type}}}
}}<!--
--><noinclude>{{Documentation}}</noinclude>
d6f3d0b6d394b2e121f2f614e3c29a26a1ea3429
1740
1739
2025-09-13T17:48:30Z
Sharparam
284703
Fix wrong variable used
wikitext
text/x-wiki
{{#switch:{{lc:{{{1}}}}}
| sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]]
| blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]]
| tech
| technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]]
| #default = {{{1}}}
}}<!--
--><noinclude>{{Documentation}}</noinclude>
e96e740f90b54922fa87b26908a3cd35fa581e42
Template:Damage type/doc
10
1039
1741
2025-09-13T17:51:15Z
Sharparam
284703
Created page with "Creates a formatted link to one of the three damage types. == TemplateData == <templatedata> { "params": { "1": { "label": "Damage type", "description": "The damage type to link to.", "example": "Sharp", "type": "line", "suggestedvalues": [ "sharp", "blunt", "technomancy" ], "required": true } }, "description": "Creates a link to a damage type, including relevant icon.", "format": "inline" } </templatedata> == Examples == * <syn..."
wikitext
text/x-wiki
Creates a formatted link to one of the three damage types.
== TemplateData ==
<templatedata>
{
"params": {
"1": {
"label": "Damage type",
"description": "The damage type to link to.",
"example": "Sharp",
"type": "line",
"suggestedvalues": [
"sharp",
"blunt",
"technomancy"
],
"required": true
}
},
"description": "Creates a link to a damage type, including relevant icon.",
"format": "inline"
}
</templatedata>
== Examples ==
* <syntaxhighlight lang="wikitext" inline>{{Damage type|sharp}}</syntaxhighlight> → {{Damage type|sharp}}
* <syntaxhighlight lang="wikitext" inline>{{Damage type|blunt}}</syntaxhighlight> → {{Damage type|blunt}}
* <syntaxhighlight lang="wikitext" inline>{{Damage type|technomancy}}</syntaxhighlight> → {{Damage type|technomancy}}
* <syntaxhighlight lang="wikitext" inline>{{Damage type|tech}}</syntaxhighlight> → {{Damage type|tech}}
<includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!--
--><noinclude>[[Category:Template documentation]]</noinclude>
e257f4fab4a45f3e90e5c87bbbc11b24aa0f7939
Weapons
0
465
1743
695
2025-09-13T17:52:56Z
Sharparam
284703
Use damage type template in table
wikitext
text/x-wiki
'''{{PAGENAME}}''' are a type of [[equipment]] in {{BFF}} used to engage in melee combat with [[enemies]].
== Upgrading ==
Weapons can be upgraded all the way to Mk 5 by speaking to [[The Handler]] and giving her the requisite materials.
Upgrading a weapon increases its damage as well as allowing you to embed more crystals into it to improve its properties further. Some weapons will also unlock passive bonuses or abilities when they are upgraded.
== List of weapons ==
{{#cargo_query:table=Weapons
|fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, speed=Speed, CONCAT('{{((}}Damage type{{!}}', damageType, '{{))}}')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5)
|format=table
}}
{{Navbox/Weapons}}
c7b3076333c274bb0420ef5b86f4d35132e6dfe6